ICSim CAN总线逆向、伪造与重放攻击教学文档
1. CAN总线基础知识
CAN(Controller Area Network,控制器局域网)是一种用于车辆内部ECU(电子控制单元)之间通信的串行总线协议,由博世公司在1980年代设计。
其核心特点如下:
- 通信方式:全局广播。这意味着只要接入CAN总线的任一节点,就能轻易访问总线上的所有流量信息。
- 数据传输:CAN数据以明文形式传输,不包含任何消息验证码(MAC)、数字签名等安全保护机制。
- 仲裁机制:采用基于优先级的仲裁方式。当多条消息需要同时发送时,优先级高的报文优先发送。攻击者可利用此机制,通过高频发送高优先级报文来阻塞其他节点的正常消息,导致ECU功能异常。
- 报文匿名性:CAN报文的数据内容不包含发送方的身份信息。因此,总线上的节点无法判断消息来源是合法ECU还是外部攻击者,这使得攻击者可以轻易伪装成任意ECU发送恶意消息。
- 完整性校验:虽然CAN协议本身包含CRC校验来验证数据传输过程中的完整性,但它无法防止数据被第三方恶意修改后重新注入到总线。
完整的CAN数据帧结构如下:
SOF | Arbitration | Control | Data | CRC | ACK | EOF
综上所述,只要能物理或逻辑接入CAN总线,即可监听或发送任意消息。
2. 实验环境搭建
本文利用ICSim模拟器模拟汽车的仪表盘和控制功能,以实践攻击。
2.1 安装依赖与工具
首先,安装Linux SocketCAN的官方工具集can-utils以及必要的开发库。
sudo apt update
sudo apt install -y \
can-utils \
git \
build-essential \
libsdl2-dev \
libsdl2-image-dev
2.2 获取并编译ICSim模拟器
git clone https://github.com/zombieCraig/ICSim
cd ICSim
make
2.3 创建虚拟CAN网络接口
虚拟CAN网络是通过软件模拟的CAN总线,用于在无真实硬件的环境中进行实验。
sudo modprobe can
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
执行ip addr命令,若能看到vcan0接口,则创建成功。
3. 启动汽车模拟系统
该系统由两部分组成:仪表盘模拟器和控制器模拟器。
-
启动仪表盘模拟器 (icsim):
在ICSim目录下执行以下命令。仪表盘GUI用于显示车辆状态(如速度、车门、转向灯),以便后续验证攻击效果。./icsim vcan0 -
启动控制器模拟器 (controls):
在另一个终端执行以下命令。该程序会打开一个控制窗口,通过键盘按键(如方向键控制速度)向CAN总线发送指令,仪表盘会做出相应反馈。./controls vcan0
4. CAN流量分析、逆向与攻击
4.1 监听CAN流量
使用can-utils工具包中的candump监听CAN总线上的所有流量。输出格式通常为:[时间戳] 接口 仲裁ID#数据,例如vcan0 244 [5] 00 00 00 3F 7F。[5]表示数据长度(DLC),后面是8字节的16进制数据。
4.2 逆向功能对应ID
使用cansniffer工具可以高亮显示在每次刷新时数据发生变化的字节,有助于在众多ID中快速定位控制特定功能(如加速)的报文。
cansniffer -c vcan0
逆向分析流程示例(以速度为例):
- 操作控制器不断加速,在
cansniffer的输出中观察哪些报文的特定字节在持续变化。 - 假设发现仲裁ID为
244的帧中某个字节持续增加,与速度变化趋势相符。 - 通过
candump单独筛选此ID,进一步确认:candump vcan0,244:7FF - 观察发现,ID为
244的报文的倒数第二个字节与仪表盘显示的速度(mph) 强相关。经推算,关系约为:数据字节值 × 1.6 ≈ 仪表盘显示速度(mph)。最后一个字节可能是校验和(checksum)。
4.3 伪造攻击 (Spoofing Attack)
伪造攻击指攻击者构造并发送虚假的CAN报文来控制车辆功能。
在确定功能对应的仲裁ID和数据含义后,即可使用cansend工具发送恶意报文。
-
控制车速:
关闭控制器,仅通过cansend向vcan0发送特定ID和数据的报文,仪表盘速度随之改变。cansend vcan0 244#0000003F7F -
控制车门:
通过分析,逆向出控制车门的仲裁ID为19B。数据含义如下(以低四位比特为例):0x1(0001): 关闭左前门0x2(0010): 关闭右前门0x4(0100): 关闭左后门0x8(1000): 关闭右后门0x0(0000): 所有车门打开0xF(1111): 所有车门关闭
发送关闭所有车门的命令:
cansend vcan0 19B#00000F000000 -
控制转向灯:
转向灯的仲裁ID为188。数据含义如下:00: 关闭所有转向灯01: 开启左转向灯02: 开启右转向灯03: 开启双闪
发送开启双闪的命令:
cansend vcan0 188#03000000
4.4 重放攻击 (Replay Attack)
重放攻击指攻击者记录一段合法的CAN通信数据,然后在未来某个时间点将其原样重放到总线上,以达到欺骗ECU的目的。
-
记录CAN流量到日志文件:
使用candump的-l参数可以将当前流量记录到日志文件。candump -l vcan0记录一段时间内包含特定操作(如加速)的流量。按
Ctrl+C停止记录,会生成一个名为candump-[时间戳].log的文件。 -
回放日志文件:
使用canplayer工具将记录的日志文件重放到CAN总线上。canplayer -I candump-2026-03-13_221006.log攻击效果:即使控制器(
controls)已关闭,通过回放之前记录的加速日志,仪表盘上的速度会按照记录中的模式重现,实现“幽灵控制”。在现实中,攻击者可能通过记录“开车门”的合法CAN报文,在车主不在场时重放,从而诱骗车辆执行解锁操作。
5. 总结
本教学通过ICSim模拟器,完整演示了对车载CAN总线的安全评估流程:
- 环境搭建:安装工具,创建虚拟CAN网络,启动仪表盘与控制器模拟器。
- 流量监听与逆向:利用
candump、cansniffer等工具监听并分析CAN流量,逆向出控制速度(ID:244)、车门(ID:19B)、转向灯(ID:188)等关键功能的报文结构。 - 实施攻击:
- 伪造攻击:通过
cansend工具构造并发送恶意CAN报文,实现对车辆功能的非法操控。 - 重放攻击:通过
candump记录合法流量,再用canplayer进行回放,使车辆重现历史操作。
- 伪造攻击:通过
核心安全风险:CAN总线设计之初未充分考虑安全性,其广播、匿名、明文传输的特性使其极易遭受监听、伪造和重放攻击。这揭示了现代车辆网络安全防护的必要性与紧迫性。