绕过固件棘轮机制:利用 Tesla Wall Connector
嵌入式设备的安全性通常依赖于“安全棘轮”(security ratchet)——一种防止安装旧的、可能存在漏洞的固件版本的机制。当这种机制仅在高级别更新软件中实现,而未在低级别引导加载程序(bootloader)中实现时,就会出现一个关键漏洞。
Synacktiv 最近的研究强调了 Tesla Wall Connector (AW-CU300) 中的这一漏洞。通过利用设备处理固件插槽和分区布局的方式,研究人员发现了一种方法,可以诱骗设备启动一个旧的、经过签名但存在漏洞的固件镜像,从而有效地绕过 Tesla 的防降级保护。
防降级机制
在固件版本 24.44.3 中,Tesla 引入了更强大的检查机制以防止降级。更新过程使用通过 Single-Wire CAN 进行的 Unified Diagnostic Services (UDS) 会话。关键函数 switch_to_new_firmware() 调用了一个新的检查:check_image_and_antidowngrade()。
该函数解析固件段以获取版本描述符 (VRSN) 和棘轮值 (VRS2)。它将传入固件的棘轮值与存储在 Persistent Storage Manager (PSM) 中的 current_ratchet 进行比较。如果传入的棘轮值低于当前值,设备会记录安全棘轮降级失败,并立即擦除被动插槽。
引导加载程序漏洞
虽然更新程序很警觉,但引导加载程序 (boot2) 却不然。通过对先前已 root 的充电器进行闪存转储,研究人员发现 boot2 在跳转到活动固件之前执行了几个必要的检查:
- 验证魔术头 (
SBFH)。 - 验证每个分段的 CRC32 校验和。
- 验证 RSA 签名是否与存储的密钥匹配。
至关重要的是,引导加载程序对安全棘轮没有任何概念。它不检查版本或棘轮值;它只是验证镜像是否由 Tesla 签名且未损坏。如果分区表指向一个包含有效签名的镜像的插槽,引导加载程序就会执行它,无论它是否是过时的版本。
绕过策略
该漏洞在于更新程序验证固件的方式与引导加载程序选择启动哪个插槽之间的脱节。设备使用两个插槽(活动和被动)。引导加载程序会从分区表中选择具有最高 gen_level(生成级别)的插槽。
研究人员识别出一种关键行为:g_boot_flags 变量决定了当前哪个物理插槽是“被动”的,该变量在启动时设置,并且在会话期间从未更新。
这使得以下利用序列成为可能:
- 验证当前镜像: 攻击者将一个有效的、最新的固件镜像推送到被动插槽,并调用例程
0x201。这将通过棘轮检查并触发part_write_layout(), 这会增加该插槽的gen_level,将其标记为下次启动时的活动插槽。 - 擦除有效镜像: 在不重启的情况下,攻击者再次调用例程
0xFF00。由于g_boot_flags尚未更改,设备会选择同一个物理插槽作为被动插槽并将其擦除。关键在于,这不会触及分区表;该插槽仍然具有最高的gen_level。 - 注入漏洞固件: 攻击者将一个旧的、经过签名但存在漏洞的固件镜像(例如版本
0.8.58)推送到现在已空的插槽中。 - 重启: 攻击者调用例程
0x202来重启。 \n重启后,引导加载程序会发现包含旧固件的插槽具有最高的gen_level。它会验证 RSA 签名(由于固件是过去由 Tesla 官方签名的,因此签名是有效的),然后启动该镜像。由于防降级检查仅存在于更新程序中,因此该检查永远不会被触发。
影响与修复建议
这种绕过方式是一种强大的原语。一旦设备降级到版本 0.8.58,研究人员就可以利用已知的漏洞链——包括 UDS 泄露 Wi-Fi 凭据和参数解析器中的缓冲区溢出——来获取调试 shell 并获得对设备的完全控制权。
由于 Wall Connector 通常连接到家庭或商业网络,被攻破的充电器可以作为攻击者在本地网络内进行横向移动的持久性立足点。
如何修复
Synacktiv 建议了以下几种方法来填补这一漏洞:
引导加载程序强制执行: 将棘轮检查移至引导加载程序中,以便它可以在跳转到代码之前验证版本。
布局失效化: 修改例程
0xFF00如此在擦除插槽时使分区布局条目失效。会话约束: 在成功更新后强制进行一次强制重启,或者在一旦布局已写入,就拒绝新的更新会话。
Tesla 随后通过固件更新修复了此漏洞。由于 Tesla 采用激进的 OTA (Over-the-Air) 部署,大多数已连接设备很可能已经收到了修复,从而显著降低了暴露风险。