跳转到正文

远程攻陷日产 Leaf:从互联网控制车身关键部件

车联网安全·20 阅读

本文根据 PCAutomotive 研究团队(Radu Motspan、Mikhail Evdokimov、Polina Smirnova)在 Black Hat Asia 2025 上的演讲《Remote Exploitation of Nissan Leaf: Controlling Critical Body Elements from the Internet》整理而成,并结合公开 CVE 与安全媒体资料进行补充。

2020 年款的第二代日产 Leaf(ZE1)——这台全球销量最高的纯电动车之一,被证明可以从”几米之外的蓝牙”,一路打通到互联网,远程控制门锁、后视镜、喇叭、车灯、雨刮器乃至方向盘调节。这不是科幻,而是一条完整的、被公开演示过的攻击链。

在本次研究中,PCAutomotive 的团队共报告了 9 个漏洞、2 个安全缺陷,涉及汽车供应商生态中的多个角色:车机(Infotainment,Bosch 制造)、蓝牙/Wi-Fi 芯片(Alps Alpine)、网关(Nissan)、远程信息处理模块 TCU(Nissan)与车身控制模块 BCM(Nissan)。离谱的是,这项研究最早在 2023 年 8 月 就已递交给日产网络安全团队,却因流程问题直到 2025 年 3 月 才完成 CVE 登记,整整跨越了一年半。

目录

  1. 研究目标与实验台搭建
  2. 防盗(Anti-Theft)机制逆向与绕过
  3. 蓝牙 RCE:HFP 栈溢出到 root
  4. 系统纵深:内核镜像、调试与 LKM
  5. 持久化与数据外带(DNS 隧道)
  6. CAN 通信:INC 协议、RH850 提权与任意 CAN
  7. 网关过滤与日产私有 UDS 命令
  8. 攻击链全景与漏洞清单
  9. 披露时间线与防护建议

1. 研究目标与实验台搭建

目标:Nissan Leaf ZE1(第二代)

研究目标是 2020 年生产的第二代 Nissan Leaf,其中三个核心 ECU 构成攻击面:

ECU型号职责
网关单元(Gateway Unit)284U15SN0ACAN 消息过滤
远程信息处理单元(Telematic Unit)282755SN0E蜂窝通信(4G/3G)
信息娱乐单元(Infotainment / IVI)259155SR0BWLAN(仅客户端)、蓝牙(电话簿/通话)、USB、CarPlay/Android Auto、导航

实验台:闲鱼(eBay)+ 布达佩斯报废厂

由于零部件的组件间互认(mutual-authentication)机制被启用,团队无法直接从 eBay 买的散件拼出一台能用的车机。于是他们跑到布达佩斯最近的汽车报废厂,买齐了 IVI、网关、BCM、仪表(IC)和全套线束,搭出一台能通电工作的测试台。

这一步非常关键:互认机制的启用,意味着后续”换机”必须解决防盗认证问题,这直接把我们引向了第一项漏洞——运行在 CAN 总线上的防盗挑战-应答协议。


2. 防盗(Anti-Theft)机制逆向与绕过

防盗逻辑概述

为了阻止车机被盗或非法接入车辆系统,日产车机内置了三层防盗手段:

  • 锁定机制:固件认证;
  • VIN 编码:VIN 不匹配即禁用;
  • 功能削减:使用过程中不断”捣乱”。

具体流程是:IVI 每次上电,都必须通过 CAN 总线与特定 ECU 完成一次挑战-应答(challenge-response)握手。应答错了,就触发红色错误;没有响应,则触发绿色错误——总之都不能正常工作。

从抓到的 CAN 流量可以还原出握手过程:

CAN-ID消息数据
0x71eIVI → ECU(发送 seed)14 03 f05bb5 17 ffff
0x72eECU → IVI(返回 solution)14 c826e381 66 ffff
0x71eIVI → ECU(确认固定)24 c76c9a98 89 ffff
0x72eECU → IVI(确认固定)24 c76c9a98 89 ffff

消息结构:脆弱的校验和

进一步分析 CAN 消息结构,发现这个”防盗”协议简单得吓人——应答由固定的算法生成,且校验和仅是字节求和后取 8 位:

CODE
Checksum calc: (0x14 + 0x01 + 0xf0 + 0x5b + 0xb5) && 0x0ff = 0x15

也就是说:种子(seed)是有限的、可枚举的,而对应的应答可以由捕捉到的样本预计算出来。团队没有逆向 IVI 固件(”we respect our time”),只分析运行时的 CAN 通信,用 Python 脚本为每一个 seed 建了一张解算表,彻底绕过防盗机制。

  • 相关漏洞:CVE-2025-32056(Anti-Theft bypass)
  • MITRE 描述原文:”攻击者可嗅探 CAN 流量或预先计算数值,揭示全部 32 种对应的 seed 应答,从而绕过保护。”

3. 蓝牙 RCE:HFP 栈溢出到 root

硬件与软件栈

车机底层是 i.MX6(NXP)处理器 + RH850/D1L(瑞萨)MCU,Wi-Fi/蓝牙则由 Alps Alpine 的 SoC 承载:

蓝牙协议栈名为 Bluedragon Evo(Bosch 专有实现),是一个以 root 权限运行的 ARM 32 位 ELF 可执行文件,且蓝牙逻辑被拆成多个动态库——这意味着其他使用同类协议的设备同样可能受影响。

其防护措施评估如下:

缓解措施状态说明
Stack Canary❌ 无栈上无金丝雀
PIE✅ 启用
ASLR⚠️ 形同虚设库的加载地址被固定,直接抵消 ASLR
符号表⚠️ 部分保留大幅降低逆向难度

配对:只需要”0.5 次点击”

配对机制上,日产的实现存在一个致命的时间窗:

  • IVI 只在”添加新设备(Add New)”子菜单里接受配对请求;
  • 配对的完成不依赖用户交互;
  • 因此攻击链是”0.5 次点击”——如果目标车主恰好停在那个菜单,就是”0 次点击”;
  • 那么如何强制车主打开设置菜单?用 2.4GHz 频段干扰(Wi-Fi/蓝牙都挤在 2.4GHz,干扰会让车机诱导用户去关掉蓝牙/Wi-Fi,从而进入设置页);
  • 而连接的建立,可以在任意菜单下完成。

HFP:攻击入口

连接建立之后,攻击面就是协议栈上层基于 RFCOMM 的 HFP(Hands-Free Profile)——手机免提协议。它承载语音(走 SCO 通道)与控制信号(AT 命令),管理通话流程。其中最具价值的是厂商私有 AT 命令扩展,例如:

AT 命令作用
AT+APLSIRI?查询 Siri 状态信息
AT+APLNRSTAT获取来电音频状态

根因:多次栈溢出

在逆向 HF_ParseRsp() 时,团队发现了多个基于栈的缓冲区溢出。关键代码如下(params[10] 是长度仅 80 字节的栈数组):

CODE
size_t __fastcall HF_ParseRsp(RfDlc *dlc, uint8_t *rxbf, size_t rxlen)
{
   size_t params[10];            // [sp+8Ch] [bp-94h]
   if ( j_CmpBuffer(rxbf, "+ANDROID:") )
  {
       if ( j_CmpBuffer(&rxbf[space_len + 11], "probe") )
      {
           param_cnt = j_GetParameters(probe_bf,
                      (unsigned __int16)(probe_len - 2),
                       &probe_params, probe_lens, 2u);
           switch ( param_cnt )
          {
           case 2:
               if ( (unsigned int)probe_lens[1] - 2 <= 0xC )
              {
                   v40 = probe_lens[0];
                   memcpy(params, probe_params, probe_lens[0]);   // <-- 越界写
              }
          }
      }
  }
  ...
}

缺陷本质:长度校验检查的是 probe_lens[1],而 memcpy 拷贝的长度却是 probe_lens[0]——校验与使用不一致,导致栈缓冲区 params 被越界覆盖。相似的漏洞还存在于 "+ANDROID:audiosource" 与 "+ANDROID:vds" 两个分支中。

CODE
if ( j_CmpBuffer(rxbf, "+ANDROID:") )
{
   if ( j_CmpBuffer(&rxbf[space_len + 11], "audiosource") )
  {
       j_GetParameters(v48, (unsigned __int16)(v49 - 2),
                       tmp_params, &tmp_lens, 1u);
       memcpy(params, tmp_params[0], tmp_lens);      // <-- 越界写
  }
}
if ( j_CmpBuffer(rxbf, "+ANDROID:") )
{
   if ( j_CmpBuffer(&rxbf[space_len + 11], "vds") )
  {
       j_GetParameters(v52, (unsigned __int16)(v43 - 2),
                       tmp_params, &tmp_lens, 1u);
       memcpy(probe_lens, tmp_params[0], tmp_lens);  // <-- 越界写
  }
}

Multiple Stack-based Buffer Overflows —— 这正是 CVE-2025-32059 / 32061 / 32062 的来源。

利用:ROP + AVCTP 载荷投递

由于栈上无金丝雀,利用变得”简单直接”:

  • ROP 链:调用 system() 并优雅地恢复蓝牙栈执行;
  • 限制:载荷中 0x2c(,)与 0x22(")两个字节被禁用,需要编码规避;
  • 载荷存放:利用 AVCTP 蓝牙 Profile 的分片消息缓冲区(fragmentation message buffer)作为第二阶段的系统命令存储区;
  • 反弹 shell:车机出站连接默认被 iptables 的 DROP 规则限制,先清掉 DROP 规则再建立反向 Shell。

这一阶段收获的能力:

能力说明
RCE1 次点击(约 0.5 次)远场触发蓝牙栈溢出
权限root
扩展可加载任意内核模块(无内核模块签名校验)

4. 系统纵深:内核镜像、调试与 LKM

拿到 shell 之后,接下来是摸清系统。车机软硬件信息如下:

组件版本/配置
BootloaderU-boot 2013.01.01
内核Linux 3.14.49(2013 年的老内核)
SELinux未启用
进程管理器systemd
文件系统ext4 + dm-verity(完整性校验)
防火墙启用
入侵检测无
/tmptmpfs,可执行

调试之殇:exchnd 异常处理驱动

研究需要 gdb,但一 attach 进程车机就重启。排查之后发现并非进程自身的信号处理,而是内核拦截了进程的特定信号(SIGTRAP)——罪魁祸首是板载的 exchnd(Exception Handler Driver)内核模块:它通过在内核特定函数上注册 kprobes/jprobes 来捕获进程异常,一旦发生 SIGTRAP 就触发”重启 IVI”。

解法:利用”无内核模块签名校验”这个能力(CVE-2025-32060),上传自定义 LKM,把 exchnd 注册的 kprobes/jprobes 全部卸载。

此后团队可以正常调试任意进程。

内核镜像:神秘的 ih_comp = 0x4d 与 LZ77

从固件中能直接找到内核镜像,但它显然是压缩的(uImage)。用标准的 xz/lzma/gunzip 都解不开,binwalk 也毫无线索。回头分析 U-boot 引导器的 bootm_load_os() 反汇编:

CODE
int __fastcall bootm_load_os(...)
{
   if ( comp == 1 ) {
       // GUNZIP: uncompress
  }
   else if ( comp ) {
       if ( comp != 0x4d ) {
           printf("Unimplemented compression type %d\n", comp);
           return -3;
      }
       v16 = lz77_decompress(load_buf, lzma_len, image_buf, image_len);
  }
}

原来它的压缩类型是 ih_comp = 0x4d,对应自定义的 LZ77 实现。公共的 LZ77 开源实现无法解出该镜像,于是团队直接用 Qiling 框架仿真运行 lz77_decompress(),成功还原出未压缩的内核。

至此,整个系统对攻击者全面敞开:内核级代码执行 + 卸载异常处理驱动 + 任意进程调试。


5. 持久化与数据外带(DNS 隧道)

找可写分区

持久化的第一步是找可写的存储位置:

分区挂载点权限
/dev/mmcblk1p1/ro
/dev/mmcblk1p3/var/opt/bosch/persistentrw
/dev/mmcblk1p5/var/opt/bosch/staticro
/dev/mmcblk1p6/var/opt/bosch/dynamicrw

SSH 服务与防火墙开关

系统里有一个 ALD(Authorization Level Daemon) 守护进程,负责在系统安全等级之间自动切换,典型的受控服务包括 sshd、firewall。SSH 服务可以开在 Wi-Fi 或 USB2Ethernet 接口上,只要修改下述标记文件:

CODE
rm /var/opt/bosch/dynamic/ald/SSHdisabled
rm /var/opt/bosch/dynamic/ald/rootLogindisabled
touch /var/opt/bosch/dynamic/ald/SSHenabled
touch /var/opt/bosch/dynamic/ald/rootLogindenabled
rm /var/opt/bosch/dynamic/ald/FWdisabled

但系统还有一道校验服务 tty-ssh-checker:只要 ALD 安全等级低于 30,就会把 SSHenabled 标记撤掉、恢复 SSHdisabled。团队随后以该服务为依赖项做了补丁绕过,最终稳定开启 SSH。

攻坚安全启动:HAB 上的 N-day

要让持久化扛过重启,光开 SSH 还不够,因为根文件系统还有 dm-verity 完整性保护。突破口是 i.MX6 的 HAB(High Assurance Boot):

  • HAB 代码位于 Boot ROM,加载在地址 0,系统启动后这段内存仍在;
  • 可用 /dev/mem 把物理地址 0x0 - 0x12000 的 HAB 代码 dump 出来;
  • 而 HAB 的解析逻辑里藏着一个 Quarkslab 早已发布的 CVE-2017-7932(CSF 证书处理的栈溢出)。

利用该漏洞可以禁用对 DTB(设备树)的签名校验,并给 dm-verity 追加 ignore_corruption 参数——完美绕过根文件系统完整性。最后改写每次上电都会执行的启动脚本 /opt/bosch/base/bin/app_fcswupdate_wrapper.sh,实现持久化。

数据外带:域名即信道

车机本身通过 TCU 走蜂窝网络访问互联网,而且——DNS 请求不过滤。于是数据外带与远程控制的信道定为 DNS:

  • 使用 dnscat2 把 DNS 查询当作信道,建立到车机的 TCP 隧道;
  • 信标域名形如 *.attacker-srv.com,既是编码通道又能天然穿透绝大多数边界防火墙。

6. CAN 通信:INC 协议、RH850 提权与任意 CAN

三条路线

在 CAN 总线取得任意访问权限,有几种思路:

  • 利用合法接口与 API(最快、最稳);
  • 篡改 RH850 固件;
  • 攻击通信协议本身的漏洞。

信息收集:找到 INC 网络服务

车机是 OPKG 包管理器,直接 grep 包描述里的 “CAN” 字样,发现服务都依赖一个 inc-scc 网络服务,且这个接口上的流量”非典型”。好在 Bosch 在官网发布了 OSS SDK 源码,其中 /opt/bosch/base/bin/inc_send_out.out 可以直接作为 CAN 通信的测试样例。

INC 是 Bosch 自研的车机与 MCU(如 RH850)之间的网络协议。其端口定义在 include/linux/inc_ports.h:

  • 基础端口号:0xc700;
  • 例如 DOWNLOAD 端口 = 0xc700 | 11。

合法路径:csm_proc_out

/opt/bosch/base/bin/csm_proc_out.out 提供两种发送 CAN 消息的能力:

  • Signals(信号):一次性 CAN 消息,用于通知 ECU 客户端或接收它们的通知;
  • Requests(请求):带连接阶段的多条 CAN 消息,使用 NET_BROADCAST 与 NET_TP<0..8> 端口。

结论很重要:payload 可以完全控制,但只能使用白名单内的 CAN ID。

RH850 固件更新机制

要突破白名单,就得看能否篡改 RH850 固件:

  • 固件位于 /ivi/firmware/v850/firmware/v850/aivi_s1_a;
  • 调用 swu_common_v850_app_out.out 安装更新;
  • 固件以 DNL 二进制格式交付:
Block ID名称说明
0x8300boot按模式加载 loader 或 app
0x4023loader更新过程使用
0x4024app正常工作流程的代码
0x8000signature更新时使用并写入内存,用于安全启动

更新走 INC 接口的 DOWNLOAD 端口,基于 UDS 协议:

  1. 切换到 loader:10-60
  2. 发起下载:34-00-44-<address>-<size>
  3. 传输固件:36-00-...
  4. 发送签名:2e-25-fd-...
  5. 结束传输:37
  6. 校验 CRC:22-...

签名会在”结束传输”以及“启动过程”中两次校验。也就是说,想直接改固件,必须绕过 RSA 签名校验。于是,团队转向第三条路线——审计 RH850 上处理 INC 请求的固件。

RH850 栈溢出:NET_BROADCAST 上的 0x50 请求

RH850 固件有大量 INC 端口、大量 handler,攻击面巨大;而 IVI 在 i.MX6 与 RH850 两侧都提供了丰富的跟踪(tracing)功能,对研究极其友好。最终在 NET_BROADCAST 端口(0xc700 | 15)的请求处理里挖到了栈溢出:

CODE
1. prepareNetBroadcastRequestBuffer   // 检查入站大小 <= 0x65
2. fillNetBroadcastRequestBuffer     // 把输入数据放入全局内存
3. processNetBroadcastRequestBuffer   // 处理全局内存,接收 i_pPacket / i_dPacketSize

触发路径如下(伪汇编):

CODE
if (*i_pPacket == 0x50) {
   _local_30 = 0; uStack_2c = 0; uStack_28 = 0; uStack_24 = 0;
   pCurLocalStackBuffer = &sLocalStackBuffer;
   dID = *(uint32_t *)(i_pPacket + 8);
   sLocalStackBuffer = 0; local_34 = 0;
   dPayloadSize = (i_dPacketSize - 0xdU);
   uVar5 = 0;
   if (dPayloadSize != 0) {
       pPayload = i_pPacket + dPayloadSize + 0xc;
       do {
           bValue = *pPayload;
           pPayload = pPayload - 1;
           uVar5++;
           *pCurLocalStackBuffer++ = bValue;   // <-- 逐字节向栈上拷贝,无边界
      } while (uVar5 < dPayloadSize);
  }
}

dPayloadSize 来自 i_dPacketSize - 0xd,而 i_dPacketSize 由攻击者可控的请求长度决定,prepareNetBroadcastRequestBuffer 只把大小限制在 0x65,远超局部栈缓冲区的容量——直接打穿栈。

利用与工程问题

利用条件非常理想:

  • payload 完全可控;
  • 无栈金丝雀;
  • 全局内存是 RWX(可读可写可执行)——把 shellcode 塞进 DLT 请求缓冲区(全局内存)即可跳转执行。

但有一个大麻烦:

只有一个客户端能连接到 NET_BROADCAST 端口,而 csm_proc_out.out 服务在持续占用它;一旦杀掉该服务,看门狗会检测到并重启车机。

解法:不能杀 csm_proc_out,那就把 exploit 代码直接注入到这个服务里;而注入本身,又用到之前”无内核模块签名校验”的漏洞——在内核卸载信号处理器,从而避免注入过程被杀。

最终,团队在 RH850 上获得了任意 CAN 消息发送能力,一举突破 CAN ID 白名单限制。


7. 网关过滤与日产私有 UDS 命令

网关(Gateway)过滤规则

车机通过 IDT CAN(即车机所在的 IT CAN) 向各个子网转发消息,网关只放行下列 CAN ID:

目标网络放行的 CAN ID(来自 IDT CAN)
Vehicle CAN0x3DC, 0x49F, 0x56E, 0x5FC–0x5FE, 0x620–0x621, 0x6FA, 0x700–0x7FF
ADAS CAN0x3E9, 0x49F, 0x620–0x621, 0x6FA, 0x700–0x7FF
Chassis CAN0x49F, 0x620–0x621, 0x6FA, 0x700–0x7FF
ITS CAN0x49F, 0x5FE, 0x620–0x621, 0x6FA, 0x700–0x7FF
Diagnostic CAN无

请注意加粗的 0x700–0x7FF:这个诊断地址段对所有业务 CAN 网络都放行。配合上一步 RH850 的任意发送能力,攻击者已经可以用 0x7xx 段的 CAN ID 直接访问 BCM、ADAS。而典型诊断请求(0x707/0x708 等)又正好落在这个区间——这就是”篡改流量过滤”(PCA_NISSAN_009)的根源。

挖掘日产私有 UDS 命令

最省事(但不便宜)的办法,是直接买一台诊断设备:CONSULT III。通过对诊断软件的 UI 操作捕获 USB 流量,就能定位隐藏的 UDS 命令。

由此提取出的关键私有命令(均发往 BCM/ADAS,CAN ID 落点与网关白名单吻合):

ECUCAN ID消息功能
BCM74504 30 69 00 01 00 00 00后视镜收折
BCM74504 30 69 00 02 00 00 00后视镜展开
BCM74504 30 07 00 01 00 00 00门锁关闭
BCM74504 30 07 00 02 00 00 00门锁开启
BCM74504 30 22 00 01 00 00 00喇叭
BCM74504 30 45 20 03 00 00 00雨刮器
BCM74504 30 3b 20 02 00 00 00车灯
ADAS75D04 30 25 20 01 00 00 00方向盘调节

注:这些私有 UDS 命令(安全访问所需的 seed/key 已通过诊断流量顺带拿到)与 0x7xx 网关卡位叠加,是整条攻击链”最后一百米”的关键拼图。


8. 攻击链全景与漏洞清单

攻击链全图

五步演示动画,详见随机附带的讲解页:

阶段动作攻击面
#0 初始状态车辆停在原地,蓝牙开启—
#1 一次性蓝牙利用近距离投递蓝牙栈溢出HFP / L2CAP
#2 通过 HAB 上的 N-day 持久化CVE-2017-7932 绕过 dm-verityi.MX6 HAB
#3 经 DNS 远程控制dnscat2 反向隧道TCU / 蜂窝网络
#4 控制车身关键部件RH850 → 任意 CAN → BCM/ADASCAN 总线

完整攻击演示视频:youtu.be/56VreoKtStw

漏洞清单

编号漏洞简介
CVE-2025-32056防盗绕过弱应答生成算法,可枚举 32 个 seed 全部应答
CVE-2025-32057app_redbend 中间人攻击Redbend OTA 服务 SSL 引擎默认配置,不校验服务器根证书
CVE-2025-32058v850:CBR 处理栈溢出RH850 处理 INC 请求时栈溢出 → CAN 任意消息
CVE-2025-32059栈溢出 → RCE [0]蓝牙栈(Alps Alpine/Bosch)L2CAP 上层通道
CVE-2025-32060缺失内核模块签名校验可加载任意内核模块,内核态代码执行
CVE-2025-32061栈溢出 → RCE [1]蓝牙栈另一处边界缺陷
CVE-2025-32062栈溢出 → RCE [2]蓝牙栈另一处边界缺陷
CVE-2025-32063Wi-Fi 持久化配置缺陷systemd 启动阶段激活开发者特性:关防火墙 + 开 SSH
PCA_NISSAN_009IT CAN 与其它总线间过滤不当0x7xx 诊断段直通各业务网络
PCA_NISSAN_012通过 CVE-2017-7932 持久化i.MX6 HAB 的 n-day 被用作持久化支点

9. 披露时间线与防护建议

曲折的披露过程

研究团队第一时间(2023-08-02)就把通告发给了日产安全团队,但随后的一年半里经历了一场”踢皮球”马拉松:

  • 2023-08-02:PCAutomotive 向日产网络安全团队发送通告;
  • 2023-08 ~ 2023-12:就漏洞严重性反复邮件沟通;
  • 2024-01-04:发出完整攻击链视频演示,同步通知发布计划;
  • 2024-01-26:日产确认漏洞属实,开始规划缓解,并授权团队自行申请 CVE;
  • 2024-04-25:向 MITRE 申请 CVE;
  • 2024-05-19:MITRE 把皮球踢给 Bosch PSIRT;
  • 2024-09-10:向 Bosch PSIRT 发 CVE 登记申请;
  • 2024-09-11:Bosch PSIRT 表示从未从日产处收到任何漏洞信息;
  • 2024-09-23:把通告发给 Bosch PSIRT;
  • 2025-03-11:Bosch PSIRT 确认内容、拒绝登记 CVE,转给 ASRG;
  • 2025-03-18:向 ASRG 提交 CVE 登记。

最终由 ASRG(Automotive Security Research Group) 受理了 CVE 登记。需要说明的是:MITRE 与 CVE 编号的分配有相应规范,Bosch PSIRT 的”拒绝登记”并不等于否决漏洞本身,而通常是因为 CVE 的官方登记权归 owneing 厂商(此处为日产)。

各方的修复与缓解

  • Nissan:计划通过 OTA 更新能力与硬件改版(”hardware revisions”)修复未来车型;现款 Leaf 通过经销商固件更新(媒体报道指向 2025 年 Q3);宝马、采矿等场景的 BCM 相关建议参考日产官方公告。
  • Bosch:作为车机(IVI)制造商,审核了 Redbend 服务配置与 v850/INC 协议实现;
  • Alps Alpine:修复蓝牙栈的多处边界校验;
  • 车主侧:在公共区域停车时关闭蓝牙;关注经销商固件更新(NHTSA 相关编号 2025-LEAF-004);留意后视镜、车灯等异常动作。

给汽车行业的三点启示

  1. 供应链即攻击面:一块车机里叠加了 Bosch(IVI)、Alps Alpine(蓝牙栈)、NXP(i.MX6 SoC / HAB)、瑞萨(RH850)等多家供应商,任何一家的疏漏都会传导到整车。共享组件(如 Bosch IVI、Bluedragon 蓝牙栈)意味着同类漏洞可能在多车型、多品牌间复现。
  2. 网关过滤要”内外有别”:0x700–0x7FF 诊断段直通业务网络的疏忽,让”越权访问 BCM/ADAS”成为可能。网关应严格按最小权限原则对待诊断报文,而不是一刀切放行。
  3. 老系统 + 新威胁=高浓度风险:运行 Linux 3.14、无 SELinux、无内核模块签名校验、tmpfs 可执行的系统,一旦拿到 root,整个纵深防御基本清零。

附录:参考链接


本文基于 PCAutomotive 在 Black Hat Asia 2025 的公开演讲内容整理与解读,全部信息均来自公开来源。文中代码、CAN 消息与漏洞描述均以演讲幻灯片原文为准。