3、CAN总线协议深度解析

CAN总线,说白了就是车载系统的神经。我做了这么多年汽车安全,见过太多人一上来就搞CAN报文注入,结果连ID优先级都没搞明白。嗯,今天咱们就把CAN总线扒个底朝天。

3.1 CAN总线物理层与数据链路层

先说说物理层。CAN总线用两根线——CAN_H和CAN_L,差分信号传输。你想想看,为什么用差分?抗干扰啊!车里面电磁环境多复杂,点火线圈、电机、各种开关,单端信号早被干废了。

逻辑电平上,CAN总线有两种状态:

  • 显性位(Dominant):CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,逻辑0
  • 隐性位(Recessive):CAN_H ≈ 2.5V,CAN_L ≈ 2.5V,逻辑1

数据链路层呢?CSMA/CA+仲裁。我记得第一次调CAN驱动时,死活搞不懂为什么两个节点同时发数据不会冲突。后来才明白——总线就是一根线,谁先拉低谁说了算。

关键点:CAN总线没有主从节点,所有节点平等。谁抢到总线谁说话。

3.2 CAN ID与仲裁机制

仲裁机制是CAN总线的灵魂。说白了,就是多个节点同时发数据时,ID小的获胜。

标准帧(CAN 2.0A)的ID是11位,范围0x000~0x7FF。扩展帧(CAN 2.0B)是29位。ID越小,优先级越高。

举个例子:

  • 发动机ECU的ID通常是0x100~0x1FF
  • ABS系统的ID可能是0x200~0x2FF
  • 车窗、灯光等舒适系统的ID往往在0x400以上

我在项目中遇到过一件事:某次测试时,我们往总线上狂发0x000的报文,结果所有ECU都沉默了。为什么?因为0x000是最高优先级,它一直占着总线,其他节点根本抢不到。这就是典型的DoS攻击原型。

避坑指南:我曾经见过有人用0x000做测试报文,结果把整车CAN网络搞瘫痪了。千万别在生产环境这么干!

3.3 CAN报文结构

一个完整的CAN数据帧长这样:

SOF | ID(11bit) | RTR | IDE | r0 | DLC(4bit) | Data(0-8Byte) | CRC(15bit) | CRC Delimiter | ACK Slot | ACK Delimiter | EOF(7bit)

咱们拆开看:

字段 长度 说明
SOF 1 bit 帧起始,显性位,同步信号
ID 11 bit 标识符,决定优先级
RTR 1 bit 远程帧请求,0=数据帧,1=远程帧
DLC 4 bit 数据长度,0~8字节
Data 0~64 bit 实际数据,最多8字节
CRC 15 bit 循环冗余校验,含1位分隔符
ACK 2 bit 应答位,接收节点拉低表示收到
EOF 7 bit 帧结束,隐性位

你想想看,为什么DLC最大只有4位?因为经典CAN的数据段最多8字节。这个限制在CAN FD中被打破了,后面会讲。

个人习惯:我解析CAN报文时,会先看DLC。如果DLC和实际数据长度不匹配,大概率是伪造报文。渗透测试时,这个特征可以用来检测异常。

3.4 CAN FD与经典CAN的区别

CAN FD(Flexible Data-rate)是经典CAN的升级版。为什么要有CAN FD?因为现在车上数据量越来越大,8字节根本不够用。

主要区别:

  • 数据长度:经典CAN最多8字节,CAN FD最多64字节
  • 速率:经典CAN最高1Mbps,CAN FD数据段可达8Mbps
  • 帧格式:CAN FD新增了FDF、BRS、ESI位
  • CRC:CAN FD使用17位或21位CRC,安全性更高

我建议做渗透测试时,优先关注经典CAN。为什么?因为目前路上跑的车,90%以上还是经典CAN。CAN FD主要在高端车型上,而且它的安全机制更强,攻击面相对小一些。

核心区别速查表

特性 经典CAN CAN FD
最大数据长度 8字节 64字节
最大速率 1 Mbps 8 Mbps(数据段)
CRC长度 15位 17/21位
兼容性 基础 向下兼容

嗯,这里要注意:CAN FD的帧格式和经典CAN不一样。如果你用经典CAN的解析器去读CAN FD报文,会报错。反过来,CAN FD控制器可以收经典CAN报文,但速率会降下来。

3.5 知识体系总览

下面这张图,是我自己整理的CAN总线知识框架。做渗透测试前,先把这些基础打牢:

CAN总线知识体系 物理层 CAN_H / CAN_L 差分信号 数据链路层 CSMA/CA + 仲裁 报文结构 SOF/ID/DLC/Data/CRC/ACK/EOF 核心机制详解 ID优先级仲裁 ID越小优先级越高 错误检测机制 CRC + ACK + 位填充 帧类型 数据帧/远程帧/错误帧/过载帧 CAN FD 扩展特性 64字节数据 8Mbps速率 17/21位CRC 向下兼容 渗透测试重点:ID优先级、DLC校验、CRC伪造、ACK劫持

这张图把CAN总线的核心知识点串起来了。物理层是基础,数据链路层是规则,报文结构是载体,CAN FD是进化。做渗透测试时,每一层都可能成为攻击面。

我的建议:刚开始学CAN总线,别急着上工具。先拿一个CAN分析仪,抓几段真实报文,对着数据手册一行一行看。我当年就是这么过来的,虽然慢,但基础打得牢。

好了,CAN总线的基础就讲到这里。记住一句话:CAN总线没有安全设计,它诞生时就没考虑过攻击者。这就是为什么我们做渗透测试有这么多机会。


公众号:蓝海资料掘金营,微信deep3321