这个仓库包含一些工具,可以在无需物理接触笔记本电脑的情况下,以软件方式控制 ThinkPad X230 的摄像头 LED。 创建这些工具是为了实际证明:恶意软件可以在没有 LED 指示的情况下通过摄像头录制视频。
其原理是通过 USB 重新刷写摄像头固件(X230 摄像头在内部通过 USB 连接),从而增加任意控制 LED 的能力。 这种方法很可能也影响许多其他笔记本电脑,因为通过 USB 连接摄像头并允许重新刷写其固件是各笔记本电脑厂商常见的设计模式。
详细内容请参见我在 POC 2024 上做的演讲 "Lights Out:隐秘关闭 ThinkPad 摄像头 LED 指示灯"(pdf):如何找到重新刷写 X230 摄像头固件的方法、对固件进行逆向工程、添加用于 LED 控制的植入程序,以及关于该方法是否适用于其他笔记本电脑的说明。
注意:重新刷写摄像头固件可能会导致摄像头变砖,请谨慎使用这些工具。
ThinkPad X230(及同时代的少数其他笔记本电脑)使用的摄像头基于 Ricoh R5U8710 USB 摄像头控制器。 该控制器将其固件的一部分(SROM 部分)存储在摄像头板上的 SPI 闪存芯片中。 该控制器还允许通过 USB 重新刷写 SPI 芯片的内容。
X230 摄像头板上的 LED 连接到 R5U8710 控制器的 GPIO B1 引脚。
GPIO B 端口映射到 R5U8710 内部基于 8051 的 CPU 的 XDATA 内存空间中的地址 0x80。
因此,更改该地址的值即可改变 LED 的状态。
无论摄像头当前是否正在传输视频,此方法均有效。
本仓库提供的工具允许将带有 USB 控制的所谓“通用植入程序”的自定义固件刷写到摄像头板上的 SPI 芯片。
该植入程序允许向任意地址(在 XDATA 内存空间内)写入受控数据,并调用任意地址(在 CODE 内存空间内;从偏移 0xb000 开始与 XDATA 别名化)。
通用植入程序可用于:
在摄像头控制器内存中动态上传第二阶段植入程序并执行它(最初用于逆向工程目的);
直接控制摄像头 LED。
更多细节请参阅演讲幻灯片。
srom.py — 通过 USB 读取和写入基于 Ricoh R5U8710 的摄像头固件中的 SROM 部分。
注意:摄像头仅在启动期间加载 SROM 固件。 因此,你需要对笔记本电脑进行断电重启(完全关机,而不仅仅是重新启动),以便加载更新后的固件;
patch_srom.py — 修补来自 FRU 63Y0248 摄像头(而非原始 X230 摄像头)的 SROM 镜像,以添加通用植入程序。
注意:此工具需要修改才能与原始 X230 摄像头的 SROM 镜像配合使用。
不过,FRU 63Y0248 的 SROM 镜像(可选地,已添加植入程序)也可以刷写到原始 X230 摄像头上;
fetch.py — 通过 USB,借助经由通用植入程序动态上传的第二阶段植入程序,获取 IRAM、XDATA 或 CODE 内存空间的内容;
led.py — 通过通用植入程序覆盖 XDATA 中地址 0x80 处的值,从而打开或关闭摄像头 LED。
srom/x230.bin — 原始 X230 摄像头模块的 SROM 内容(FRU 未知;板上有 19N1L1NVRA0H 标记);
srom/63Y0248.bin — FRU 63Y0248 摄像头模块的 SROM 内容;
code/63Y0248.bin — 从 FRU 63Y0248 摄像头模块泄露的 CODE 内存空间的内容。
注意:Boot ROM 位于偏移 0xb000 之下,并且与原始 X230 摄像头模块上的 Boot ROM 完全相同。