用于 Thinkware U3000 行车记录仪本地 WiFi 控制协议的 Python 客户端,从官方 Android 应用逆向工程而来。CVE-2026-101053、CVE-2026-101054 和 CVE-2026-101055 背后的 PoC 工具。
一个用于 Thinkware U3000 行车记录仪本地 WiFi 控制协议的 Python 客户端,从官方 Android 应用逆向工程而来,并已在真实硬件上验证,并非来自任何公开规范(根本不存在这样的规范)。
本项目有两个目的:提供一个可用的库,用于从你自己的行车记录仪中提取录像;以及为已完成的 CVE 披露提供支持材料(见下方安全部分)。
docs/protocol-reference.md。confirm=True 之后,因为它们具有破坏性(格式化 SD 卡),或者因为它们可能会使摄像头与你用来访问它的网络断开连接(set_wifi_mode、connect_to_ap 等)。在对这些方法中的任何一个传入 confirm=True 之前,请先阅读文档字符串。没有 PyPI 发布版本。直接从 GitHub 安装:
pip install "u3000py[cli] @ git+https://github.com/turretsec/u3000py.git"
或者不安装 CLI,只安装库:
pip install git+https://github.com/turretsec/u3000py.git
或者固定到某个带标签的发布版本:
pip install git+https://github.com/turretsec/[email protected]
from u3000py import ThinkLinkClient, VideoCategory
with ThinkLinkClient("192.168.1.100") as cam: # your camera's actual IP
print(cam.get_device_info())
print(cam.get_system_status())
files = cam.list_files(VideoCategory.CONTINUOUS)
latest = files[-1]
def show_progress(received, total):
print(f"\r{received / total:.0%}", end="")
cam.download(latest.path, dest="latest_clip.mp4", progress=show_progress)
或者,在使用 [cli] 附加组件安装后,从命令行使用:
u3000py --host 192.168.1.100 info device
u3000py --host 192.168.1.100 files download --latest --category cont_rec
每次调用都必须提供 --host,可以像上面所示那样作为标志提供,也可以通过 U3000PY_HOST 环境变量提供(如果你不想重复输入的话)。
逐方法的完整细节,包括哪些结果来自真实硬件测试、哪些是待验证的合理推测,都在协议参考文档中。
PUT_FILE:已确认允许未经身份验证地向摄像头文件系统上的任意绝对路径写入任意文件。这是三项 CVE 发现之一;在公开库中提供一个通用的任意位置写入方法,等于交出一件现成的攻击工具。完整细节见 disclosure-thinkware-u3000。pip install -e ".[dev]"
pytest -v # unit tests, no camera needed
pytest -m hardware --host 192.168.1.100 # real-camera tests, opt-in only
CLI 本身的独立冒烟测试脚本位于 scripts/smoke_test_cli.py。它不属于 pytest 测试套件(它会调用真实安装的 u3000py 命令对真实摄像头进行操作),用于在更改后进行健全性检查。
docs/protocol-reference.md:完整的逆向工程协议;线格式、每条已确认的命令、仍未验证的内容,以及已知的未解之谜(有几件事确实没有按照协议自身约定所预测的方式表现)。此协议没有身份验证。这项研究产生了三项发现,已在单独的仓库中完整记录并披露:disclosure-thinkware-u3000。
PUT_FILE(CVE-2026-101053(VulDB #410915)),已通过写入摄像头真实的 /tmp 目录得到确认。本库刻意不暴露此功能(见上方这里刻意不包含的内容)。LS/GET_FILE(CVE-2026-101054(VulDB #410916)),完全没有路径限制。本库的 download() 方法直接演示了这一原语,例如 cam.download("/tmp/wpa_supplicant.conf") 会读取设备的实时 WiFi 配置文件。GET_STATUS "wifi_info"(CVE-2026-101055(VulDB #410917))。本库的 get_wifi_info() 直接演示了这一原语(在任何打印输出中默认对密码进行脱敏,见 WifiInfo 的 repr())。Thinkware 已于 2026-06-21 收到通知。30 天披露窗口于 2026-07-21 结束,仅收到非技术性的收到确认,没有修复确认。所有三项发现在当前生产固件上仍可复现。geo-chen 对另一款 Thinkware 型号(F800 Pro)的相关先前研究在披露仓库中作为背景资料引用。
MIT,见 LICENSE。