开发者生态
morning
Tesla Wall Connector 引导加载程序绕过固件降级棘轮
2026-05-14
1 阅读
p_stuart82
从充电端口连接器利用 Tesla Wall Connector - 第 2 部分:绕过防降级 作者:David Berard - 12/05/2026 - 漏洞利用,逆向工程 - 下载 在上一篇文章中,我们介绍了针对 Pwn2Own Automotive 2025 期间使用的 Tesla Wall Connector Gen 3 的攻击。该漏洞利用链依赖于一个简单的事实:不存在防降级机制。一旦我们可以通过充电电缆使用 UDS,我们就可以将旧的、易受攻击的固件写入被动插槽,重新启动,然后弹出调试 shell。随后,特斯拉发布了固件更新,在更新例程中添加了防降级检查。现在,每个固件映像都带有一个安全棘轮值,并且更新程序会拒绝任何棘轮值低于设备上存储的值的映像。第二篇文章介绍了这种防降级的工作原理,以及我们如何通过滥用分区表写入和插槽擦除之间的操作顺序来绕过它,在完全最新的充电器上重演原始的 Pwn2Own 攻击。这是您通过一杯咖啡、一个 IDA 窗口和来自语言模型的零帮助手动发现的漏洞之一。你还记得那些过去的美好时光吗?希望提高您的技能?了解我们的培训课程!了解更多 。更新过程快速回顾 我们在第一篇文章中描述了单线 CAN 的完整更新流程。简而言之:打开 UDS 会话(类型 2 )。使用安全访问进行身份验证(5 级,XOR-0x35 算法)。运行例程 0xFF00 来准备并擦除被动插槽。将 0x0E 写入标识符 0x102 以将插槽标记为“可通过 UDS 设置”。使用“请求下载/传输数据/请求传输退出”推送固件。运行例程 0x201 来验证新写入的映像并切换插槽。运行例程 0x202 重新启动。提醒一下,AW-CU300 使用两个固件插槽:一个主动(当前正在运行)和一个被动(更新目标)。成功更新后,插槽翻转,新固件将在下次启动时激活。 24.44.3 中发生的变化在将旧固件与版本 24.44.3 进行比较后,我们重点关注 switch_to_new_firmware() ,即处理 UDS 例程 0x201 的函数: int switch_to_new_firmware() { ... if ( settable_via_uds != 14 || !passive_firmware ) return 1; if ( 被动 <= 0 || 被动 > 被动固件->大小 || (v2 = check_signature(被动固件->开始, 被动)) != 0 || !check_image_and_antidowngrade(nullptr) ) { 部分擦除(flash_drv, 被动固件->开始, 0x14u); v2=4; } else { part_write_layout(passive_firmware); flash_drv_close(flash_drv); Passive_firmware = nullptr;返回v2; check_image_and_antidowngrade() 是新的。它解析固件段,重新计算它们的 CRC,然后调用 verify_firmware_segments_platform() 进行棘轮比较: int verify_firmware_segments_platform(int flash_drv, u32_t *segments, ...) { ... // 遍历段,在以 [0x100000 .. 0x100010] 窗口结尾的 // 段中查找版本描述符。 ... if ( buffer.next != (netif *)'NSRV' /* "VRSN" */ ) 转到 next_segment;主要 = LOBYTE(buffer.ip_addr.addr);次要 = BYTE1(buffer.ip_addr.addr); if ( buffer.netmask.addr == '2SRV' /* "VRS2" */ && LOBYTE(buffer.gw.addr) > 1u )firmware_ratchet = BYTE2(buffer.gw.addr);否则固件_棘轮= 0; ... sub_1F04866C(¤t_ratchet); // 从 PSM(持久存储)读取棘轮 if ( current_ratchet <=firmware_ratchet || !call_psm_wrapper(...) ) { return 0; // 接受 } log("失败:安全棘轮降级被阻止 %d < %d",firmware_ratchet, current_ratchet);返回-1;版本信息嵌入在加载到 0x100000 附近的固件段中(VRSN 表示版本,VRS2 表示棘轮)。只有更新程序会解析此内容,引导加载程序不会解析。在设备方面,棘轮位于 PSM(持久存储管理器)中,并在激活更高级别的棘轮映像时增加。因此,在 24.44.3 设备上,发送旧的 0.8.58 固件并调用例程 0x201 将终止: ERROR verify_firmware_segments_platform:145 Failure: Securityratchet downgrade Prevented 0 < N 并且插槽会立即被擦除。无法通过官方路径将旧图像保留在 Flash 中。引导加载程序不关心 boot2 ,因为它在构建工件中被称为,位于闪存中的固定地址,并且不是 Tesla 发布的任何固件更新的一部分。我们必须从之前通过原始 Pwn2Own 漏洞获取 root 权限的充电器中转储闪存来进行分析。在跳转到活动固件之前,它确实会对活动固件执行多项检查:Magic header (SBFH)。每段 CRC32。针对密钥库中的密钥进行 RSA 签名。但它没有安全棘轮的概念。任何具有有效签名和正确 CRC 的固件映像都将执行,无论其版本如何。 boot2 和 bootrom 都没有实现安全启动。因此,防降级仅由一段代码 switch_to_new_firmware() 在某个时刻强制执行:当调用例程 0x201 时。所以