第1章:车载网络基础(CAN/LIN)

各位同学,咱们今天聊聊车载网络。说实话,我刚开始接触汽车安全测试时,第一个感觉就是——这车里的通信方式怎么跟IT网络差这么多?你想想看,一个CAN总线,两根线,就能让几十个ECU互相聊天,这设计思路本身就很有意思。

1.1 CAN总线协议原理与帧结构

CAN总线,全称是Controller Area Network。1980年代由Bosch公司发明,初衷是为了让汽车里的各种电子控制单元能高效通信。嗯,这里要注意,CAN总线不是TCP/IP那种复杂的协议栈,它更像个简单的广播系统——谁有话要说,就在总线上喊出来,所有节点都能听到。

我个人习惯把CAN帧结构分成这么几块:

  • 帧起始(SOF):1个显性位,告诉所有节点“我要开始说话了”
  • 仲裁场:包含11位或29位ID,这是关键
  • 控制场:6位,包含数据长度码(DLC)
  • 数据场:0-8字节,真正要传的数据
  • CRC场:15位CRC校验 + 1位CRC界定符
  • 应答场(ACK):2位,接收节点确认收到
  • 帧结束(EOF):7个隐性位

标准CAN帧结构(11位ID)

SOF | 11位ID | RTR | IDE | r0 | DLC | 0-8字节数据 | CRC | ACK | EOF
  1     11      1     1     1    4      0-64       15    2     7

我在项目中遇到过一件事:有次测试某款车的网关,发现它只检查了CAN ID,却没校验数据长度。攻击者可以发送一个DLC=8的报文,但实际只填充了2字节数据,剩下的全是垃圾。结果呢?接收方直接崩溃了。所以啊,帧结构里的每个字段都有它的意义,别小看。

1.2 CAN ID仲裁机制与报文过滤

CAN总线的仲裁机制,说白了就是“谁优先级高谁先说话”。怎么判断优先级?看ID。ID数值越小,优先级越高。比如ID=0x001的报文,永远比ID=0x7FF的报文先发出去。

为什么会这样?因为CAN总线用的是“线与”逻辑。显性位(0)会覆盖隐性位(1)。当两个节点同时发送时,从ID的最高位开始逐位比较,谁先发出显性位,谁就赢了。输的那个节点会自动退出发送,等下次再试。

这个机制有个安全漏洞,你想想看——如果攻击者持续发送高优先级报文(比如ID=0x000),那其他低优先级报文就永远发不出去。这叫“总线拒绝服务攻击”。

避坑指南:我曾经在渗透测试中,用一块树莓派加MCP2515模块,持续发送ID=0x000的报文,结果整车的仪表盘直接卡死,转向灯都不亮了。所以,CAN ID的分配一定要留有余地,别把所有高优先级ID都用满。

报文过滤呢?每个ECU都会配置一个“接收过滤器”,只处理自己关心的ID。比如发动机ECU只关心ID=0x0C0到0x0CF的报文。过滤方式有两种:

  • 掩码过滤:设置一个掩码,只匹配ID的某些位
  • 列表过滤:直接列出允许接收的ID列表

我个人建议,在安全测试时,先抓取正常通信的ID列表,然后尝试发送不在列表里的ID。很多ECU对“陌生ID”的处理方式很粗暴——直接丢弃,但有些会触发异常处理,甚至重启。嗯,这就是测试的切入点。

1.3 LIN总线协议简介

LIN总线,全称Local Interconnect Network。说白了,就是CAN总线的“小弟”。它成本低,速度慢(最高20kbps),用在车窗、座椅、雨刮这些对实时性要求不高的地方。

LIN总线的结构很简单:一个主节点,多个从节点。主节点负责调度,从节点只能响应。通信靠的是“帧头+帧响应”的模式:

  • 帧头:由主节点发送,包含同步间隔、同步字节、标识符
  • 帧响应:由对应的从节点发送,包含1-8字节数据

LIN帧结构

同步间隔(13位显性) | 同步字节(0x55) | 标识符(6位+2位校验) | 数据(1-8字节) | 校验和(1字节)

我在测试一款国产车时发现,它的LIN总线居然没有加密。我用一个USB转LIN的适配器,直接就能发送伪造的帧头,让车窗电机执行“上升”指令。你想想看,如果攻击者在停车场里干这事,后果多严重。

注意:LIN总线的标识符只有6位,最多64个节点。但实际应用中,很多厂商只用了其中一小部分。测试时,可以尝试发送所有64个标识符,看看有没有未使用的“幽灵节点”在响应。

1.4 车载网络的安全弱点分析

好了,前面讲了CAN和LIN的原理,现在咱们聊聊它们的安全弱点。说实话,这些协议设计于1980-1990年代,那时候互联网还没普及,压根没考虑安全。所以弱点一抓一大把:

弱点类型 具体表现 攻击场景
无认证 任何节点都可以发送任意ID的报文 伪造ECU报文,篡改车速、转向角等
无加密 总线上的数据明文传输 监听总线,获取车辆状态、诊断信息
广播通信 所有节点都能收到所有报文 被动嗅探,无需物理接触
优先级机制 高优先级报文可压制低优先级 DoS攻击,让关键ECU无法通信
有限带宽 CAN最高1Mbps,LIN最高20kbps 注入大量报文,淹没正常通信

我个人经验是,车载网络最容易被忽视的弱点是“物理访问”。你想想看,OBD-II接口就在驾驶座下面,插个设备就能接入CAN总线。很多车连最基本的“物理访问保护”都没有——比如OBD接口需要认证才能通信。

我曾经测试过一辆2019年的SUV,它的OBD接口直接连到了动力CAN总线上。我用一个几十块钱的CAN分析仪,就能发送“加速踏板位置”报文,让车辆在怠速状态下突然加速到3000转。嗯,这要是被恶意利用,后果不堪设想。

测试建议:做渗透测试时,先搞清楚目标车辆的网络拓扑。哪些ECU在哪个CAN网络上?网关有没有做报文过滤?LIN总线有没有物理隔离?这些信息决定了攻击路径。

最后说一句,车载网络的安全测试,本质上就是“找那些协议设计者没想到的地方”。CAN和LIN协议本身是可靠的,但安全是另一回事。咱们做测试的,就是要站在攻击者的角度,去发现那些“没想到”。

下一章,咱们聊聊如何搭建测试环境,包括硬件选型和软件工具。到时候我会分享一些我踩过的坑,比如某款USB转CAN设备在高速下会丢帧……嗯,到时候细说。