Brisk4t/ToothPaste
GitHub: Brisk4t/ToothPaste
基于 ESP32-S3 和 Web BLE 的安全无线键盘鼠标模拟器,通过加密蓝牙连接将浏览器端的输入指令无线传输到任意 USB 设备。
Stars: 159 | Forks: 12
ToothPaste:
A better copy-paste.
ToothPaste 允许用户通过 WEB-BLE 和基于 ESP32-S3 的接收器,以 AES-128 加密的方式将键盘和鼠标命令无线传输到任何兼容 USB 的设备,无需专门的驱动程序或繁琐的设置。
# 问题所在 ❓ 其核心思想是为了消除在一次性使用场景中对复杂且冗长的登录流程的需求,在这些场景中通常需要键盘,或者键盘是**唯一受支持的设备**(例如 BIOS、物理隔离系统、你不想安装密码管理器的可疑电脑等)。 这意味着像 [KDE Connect](https://github.com/KDE/kdeconnect-kde) 这样的现有解决方案行不通,因为至少它们要求两台设备都运行兼容的操作系统并允许安装第三方软件。 那么显而易见的答案是使用一种普遍支持的接口系统 —— USB。具体来说是 USB **人机接口设备 (HID)** 标准。几乎每个兼容 USB 主机的设备都支持使用键盘作为控制手段,而且因为这被视为用户的直接延伸,所以它是被隐式信任的(*键盘没有密码,因为否则你怎么输入密码呢* 😐)。 [Hak5 的 USB Rubber Ducky](https://hak5.org/products/usb-rubber-ducky?variant=39874478932081) 正是利用了这一想法引发了一场利用设备的安全军备竞赛,但这不必是使用它的唯一理由(但你绝对仍然可以这样做 *\*眨眼\**)。  ### 桌面浏览器上的 ToothPaste,控制着 iPad  ### 移动浏览器上的 ToothPaste,控制着远程 Linux 机器  # 快速开始 📦 最快的上手方式是访问 [ToothPaste Webapp](https://www.toothpasteapp.com) 并点击 **Update**。这会打开一个 WEB Serial 选择器,让你选择一个已连接的 ESP32-S3 设备来烧录固件。 #### 或者,从 releases 部分下载最新的 .bin 固件文件,并使用 [esptool](https://github.com/espressif/esptool) / [espwebtool](https://esptool.spacehuhn.com/) 或类似的烧录工具进行烧录。  ```“按钮”是 GPIO0(在 ESP32 开发板上通常标记为 BOOT)``` # 完整设置 🛠️ 如果出于某种原因简单模式不起作用(通常是因为我把部署搞砸了),你可以从源代码构建整个项目。 按照 [ESP-IDF (5.5.1^)](https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/index.html) 安装指南操作,并构建 **firmware/** 文件夹中的内容。 如果你计划修改或创建自己的 ProtoBuf 数据包,你还需要: - [The Protoc Compiler](https://protobuf.dev/installation/) - [NanoPB](https://github.com/nanopb/nanopb) - [ProtoBuf JS](https://github.com/protobufjs/protobuf.js) # 工作原理 第1部分 ⭐ 我希望 ToothPaste 无需太多预先设置即可快速使用。虽然原生应用可以让轻松切换本地和远程命令的体验变得容易,但那是未来的我需要解决的问题。对我来说,同时还能保持半跨平台的最快方法是 [**Web BLE**](https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API)。 ### 什么是 Web BLE? 如果你熟悉像 [WLED](https://kno.wled.ge/) 或 [VIA](https://usevia.app/) 这样的项目,你就已经与 [Web API](https://developer.mozilla.org/en-US/docs/Web/API) 交互过了,这几乎完全是 chromium 独有的功能,这就是为什么 **ToothPaste** 本身不在像 Firefox 这样的非 chromium 浏览器上运行。 本质上,Web BLE 允许我们在浏览器中使用系统的蓝牙硬件,从而无需使用特定于操作系统的自定义 API 和专门的应用程序。 # 工作原理 第2部分 - 硬件 ⭐⭐ ToothPaste 解决方案的另一部分是硬件本身。由于 ESP32-S3 在一个封装中同时包含了 USB 和 BLE(以及一堆我们不关心的其他东西),因此硬件最终只是运行 MCU 所需的最低配置。对于大多数人来说,任何开发板都足够了。 ### 对于更有品位的人,我呈现……  ### 我还在整理这个仓库的硬件部分,但这张照片花了太长时间,所以给你们看:  # 安全性 🔑 蓝牙本身不是一个安全的协议,较新的实现改变了这一点,如果我们不需要极其灵活的跨平台发射器,我们本可以深入研究使用 BLE 支持的许多安全协议。 然而,截至目前 Web BLE 只支持 “just works” 身份验证方法,这意味着它实际上是一条开放的线路。考虑到 ToothPaste 显示为键盘,而且我的主要使用场景是将密码粘贴到设备,[**中间人**攻击](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) 是一个非常现实的问题。 **因此我们需要确保只允许经过身份验证的设备发送随后被键出的数据。** 在不深入探讨选择其他加密标准(认真地说,关于各自的优缺点有太多的信息)的完整理由的情况下,我决定采用两步加密工作流程,结合 [**ECDH 公钥加密**](https://www.cloudflare.com/learning/ssl/how-does-public-key-encryption-work/) 和部分带外(OOB:*这是一种花哨的说法,表示密钥不是通过 BLE 共享的*)密钥交换,以派生出一个对称的 **AES-128** 密钥,用于加密 ToothPaste 数据包(_如果你很酷的话,可以叫它们 ToothPackets_)。 ### 这导致了一个安全的通信系统,其中发射器和设备必须在发送潜在敏感数据之前首先完成配对流程。  # 更多安全性 🔒 ### ☀️ ToothPaste 完全是本地的。没有服务器,没有代理,没有 SaaS 云原生巨魔“守护”你的数据。 这意味着如果有人能转储存储在你浏览器中的 indexdb 数据,他们就可以访问你的 AES 密钥并冒充发送命令的设备。 _不过如果有人已经做到这一步,ToothPaste 可能是你最不需要担心的事情 💀_ ### 🤷 但因为我可以 ToothPaste 允许使用密码 + [Argon2](https://argon2-cffi.readthedocs.io/en/stable/argon2.html) 派生的加密密钥来加密这些本地数据,以及保存的宏和 Duckyscript 脚本。 这与带有浏览器扩展的密码管理器的做法完全相同。  # 还有更多…… ### 就像任何激情项目一样,有时我会被很酷的功能分散注意力,而忘记修复/测试所有内容。 #### 在 ToothPaste WebApp 中创建可重放的 ducky 脚本。  WebApp 上有一些功能,我会慢慢地在这里记录,还有被诅咒的 vibe-coded tailwind 样式亟待被转化为可复用的类。ToothPaste 仍然是一个正在进行的工作,但它终于到了我每天使用它的地步,所以我认为这是开源它的好时机。 如果你发现差异或想以任何方式做出贡献,请随时创建 issues,但由于我只是一个小人物,我可能需要一段时间来审查它们。
标签:AES-128加密, Arduino, BadUSB, BLE, C++, Espressif, IoT安全, PE 加载器, React, Syscalls, TailwindCSS, USB-HID, Web Bluetooth, 嵌入式开发, 数据可视化, 数据擦除, 无线数据传输, 桌面外设, 硬件安全, 自定义脚本, 自定义脚本, 蓝牙低功耗, 远程控制, 键鼠模拟