char g_cert_buffer[512]; 定义了一个大小为 512 字节的全局缓冲区,用于存储证书数据。
函数输入参数
tpms_idu32_t tpms_id:表示 TPMS(胎压监测系统)设备的唯一标识符。datau8_t *data:指向包含证书部分数据的缓冲区。data_sizeu32_t data_size:data 指针所指数据的大小。start_indexu32_t start_index:数据应写入 g_cert_buffer 的起始索引。certificate_sizeu32_t certificate_size:完整证书的总大小。
整数溢出风险
溢出检查if (data_size <= 512 && (u32_t)(start_index + data_size) <= 512) 用来检查 start_index 和 data_size 的和是否在合法范围内。潜在问题如果 start_index 是负数(例如 -8,int start_index = -8; // 有符号整数),与 data_size(例如 64)相加后 (start_index + data_size) 等于 56,看似合法。由于 start_index 被强制转换为 u32_t(u32_t idx = (u32_t)start_index; // 转换为无符号整数),会变成非常大的正数,导致条件检查通过,但实际执行时发生越界写入。(这个二进制数的十进制值等于 2的32次方−8=4294967288。因此,-8 被转换为 4294967288)
越界写入
memcpy() 操作
memcpy(g_cert_buffer + start_index, data, data_size); 将 data 的内容复制到 g_cert_buffer,从 start_index 位置开始。· g_cert_buffer + start_index 表示起始地址加上偏移量。因为 start_index 是 4294967288(远大于 512),偏移会导致指针超出 g_cert_buffer 的合法范围。实际上,指针操作时,内存地址计算为 g_cert_buffer 的地址加上一个巨大的偏移量,指向缓冲区之外的内存。这会导致 memcpy() 向非法区域写入数据。问题产生如果 start_index 是负数(如 -8),指针偏移后指向 g_cert_buffer 边界之外的内存位置,memcpy 会写入到 g_cert_buffer 预期范围之外,导致内存损坏和安全问题。潜在安全隐患由于 g_cert_buffer 仅定义了 512 个字节,这种越界写入可能覆盖其他全局变量、堆栈或其他内存数据,导致内存损坏或潜在的安全漏洞,如允许攻击者利用此行为执行恶意代码。越界写入可能导致敏感数据的篡改、程序崩溃,或更严重的漏洞,如攻击者利用漏洞实现远程执行任意代码。
3. 漏洞触发条件:攻击者需要伪造 TPMS 传感器,并通过 BLE 广播消息与 VCSEC ECU 建立连接,然后发送精心构造的证书数据触发漏洞。利用过程如下:
3.1 TPMS 传感器自动学习机制:特斯拉车辆支持 TPMS 传感器自动学习功能,用于识别和添加新的传感器。
3.2 伪造 TPMS 传感器:攻击者可以使用 ESP32 开发板伪造 TPMS 传感器,并模拟 BLE 广播消息。如图展示了如何在 Tesla Model 3 中利用 TPMS(轮胎压力监测系统)漏洞进行攻击的流程和概念验证。
步骤
描述
车辆启动和 TPMS 激活当车辆开始行驶时,TPMS 被唤醒并开始监控轮胎压力,以确保驾驶安全。TPMS 开始广播激活后,TPMS 传感器通过无线信号广播其状态信息,与车辆的控制单元进行通信。攻击者的初步干预攻击者使用类似 ESP32 的设备连接到 TPMS,阻止 VCSEC(车辆控制安全单元)与合法的 TPMS 建立通信。VCSEC 无法连接到 TPMS由于攻击者的干预,VCSEC 无法与合法 TPMS 连接,图中“raced by ESP32”表示攻击者通过抢先连接扰乱了正常通信。系统超时并启动自动学习模式在约 90 秒尝试连接失败后,系统会注销当前 TPMS 并启动“自动学习模式”以寻找新的设备配对。攻击者广播伪造的 TPMS 信号攻击者的设备开始冒充新的 TPMS,通过广播伪造信号欺骗 VCSEC 建立连接。VCSEC 连接伪造的 TPMS 并触发漏洞最终,VCSEC 连接到伪造的 TPMS,并将其注册,从而允许攻击者注入恶意数据,进行 RCE 攻击,获取对车辆控制系统的访问权限。
来源:汽车电子与软件