较旧的充电器过去只是一个简单的电源——只不过是一个二极管桥、一个电容器和一个稳压器 IC。他们为手机提供了一个稳定的电压,通常是+5V。当现代手机使用 USB 连接时,+5V 成为标准,USB 接头上的电源引脚同样用于充电。两个数据引脚将悬空或接地,并且不会被使用。
这些天来,情况发生了变化。现代手机是耗电的智能设备,电池容量很大。旧的 USB 标准严重限制了可以提供给设备的电流量。在 USB 1.1 端口上,您可以在 +5V 线路上汲取高达 100mA 的电流。这相当于0.5W,充电时肯定不多。USB 2.0 将其增加到 500mA,USB 3.0 将其进一步增加到 900mA。然而,实际允许的功耗并不那么简单:当设备仅插入时,USB 2.0 / 3.0 允许退出的最大功耗分别仅为 100mA / 150mA。设备必须将自己指定为特定类型,它所插入的扩展坞也必须如此。这称为协商。
USB 的电源状态主要分为三种类型:
- 无电量耗尽 (NDB) 模式 - 无需任何协商即可在插入设备时抽取 100mA(USB3 上为 150mA)。不得传输任何数据。
- 主机充电器模式 - 在设备向主机注册后,允许 USB 1.1 上 100mA、USB 2.0 上 500mA 和 USB 3.0 上 900mA,并且可以进行全双工通信。这是大多数设备在插入计算机时将处于的“正常”模式。
- 专用充电器模式 - 仅针对 USB 2.0 和 3.0 定义,在专用充电器设备上允许 1.5A。在此模式下,不能传输任何数据。但是,设备必须与充电器协商此模式。
请注意,当没有发生协商时,设备只能消耗 150mA。这是一项安全功能,因为设备上的过流保护可能涉及需要拆焊更换的表面贴装保险丝。因此,如果设备试图在仅支持 100mA 的 USB 1.1 主机上拉 1.5A 电流,您可能会损坏主机。因此,我们必须进行适当的协商,这涉及到一些数据传输。
这是事情变得模糊的地方:
- 协商阶段可以在硬件、固件或软件中实现。通常第一步是硬件,然后是固件,最后一步(通过 PnP 识别操作系统)是软件。
- 初始协商握手中涉及的数据(据我所知)不涉及任何任意长度的缓冲区。正是这个阶段涉及权力谈判。
- 完整的即插即用协商中涉及的数据很复杂,并且肯定会涉及任意长度的缓冲区。
因此,现代专用充电器通常具有小型微控制器或专用 USB 主机芯片来处理协商阶段。这意味着充电器上通常有一个基于固件的攻击面,而且肯定是在设备上。然而,一些专门的充电器(例如 iPhone)通过使用检测技巧(例如数据线上的电容感应)来欺骗规范,使充电器的生产成本更低,因此不需要进行任何数据传输。这可能会或可能不会违反 USB 规范,但大公司往往能够通过监管机构获得类似的东西。
无线充电端的工作方式几乎相同,只是电流的实际传输是通过振荡电磁场完成的。协商以同样的方式进行,只是通过NFC式的通信渠道。如果您可以将数据注入该通信通道,您可能会改变协商的工作方式,但我怀疑您是否可以在不违反协议的情况下做任何有趣的事情。一个有趣的研究途径是查看协议中是否有任何设备存在缓冲区溢出或类似问题。
因此,总而言之,您可能能够找到设备的漏洞利用,但它可能只是暂时将设备上的 USB 控制器 IC 变砖。或者,您可以将充电器替换为活动主机,并使用它与设备进行完全协商并向其发送命令。这在启用了 USB 调试的 iPhone 和 Android 设备上尤其危险,因为它允许访问设备的内存。