竞学实训(4)
实验 CAN Security
燃尽了
一.实验目的
理解汽车CAN总线通信协议的安全机制与脆弱性。
掌握基于ICSim的CAN网络模拟环境搭建。
实操常见CAN攻击技术并分析防御方案
二.实验内容
(一)模拟CAN信号通信
1. 虚拟CAN接口创建
创建模拟一个虚拟CAN接口,用于后续的报文收发和攻击模拟。
按照参考文章操作即可。

2. 模拟信号通信
请使用can-utils工具包里的不同工具(如candump、cansend、cangen等)实现CAN报文的发送和嗅探。
使用cangen向vcan0发送数据,
使用candump嗅探数据。

(二)基于ICSim的基础实践
1. ICSim模拟环境搭建
请参考网络资料,在你的PC上部署ICSim模拟器并以当前进行实验时的年月日组合为种子(例如:20250713)正确启动,至此你可以通过键盘或者手柄完成对仪表盘功能的控制(转向灯控制、加速控制、车门控制)。
(附上主要截图)
将项目clone至本地,make编译,运行:
2. Can-utils使用
使用can-utils工具包里的相关工具完成对CAN数据报文的监听和转储,通过肉眼观察和代码分析,找到与转向灯控制、车门控制、加速控制相关的CAN数据帧。
(附上实验步骤、主要代码和截图)
对于转向灯控制、加速控制使用肉眼观察法,车门控制使用二分法。
转向灯:利用cansniffer工具使用肉眼观察,重点看与转向灯同步变化的字节。
关键数据帧:vcan0 2A3#00000000 - 转向灯关
ID为0x2A3
第2个字节的低两位
从低到高以此表示左灯、右灯
0为不亮,1为亮

车门:使用二分法。记录开车门过程的报文,将报文一分为二,分别进行重放并观察模拟器,如果该片段重放时车门打开,则说明控制车门打开的数据帧在该片段中。对该片段进行重复操作。最后得到关键数据帧,可以通过cansend重放进行检验。(这里以开左前门为例)
具体代码如下:
1 | import argparse |
具体操作如图:

关键数据帧:vcan0 02C#0000000E0000 - 左门开
ID:0x02C
第4个字节的低4位
从高到低依次表示后右、后左、前右、前左,0表示开,1表示关
在其他门关闭的前提下,可得到以下对应,也已经通过cansend重放进行验证
开前左门 00 00 00 0E 00 00
关前左门 00 00 00 0F 00 00
开前右门 00 00 00 0D 00 00
关前右门 00 00 00 0F 00 00
开后左门 00 00 00 0B 00 00
关后左门 00 00 00 0F 00 00
开后右门 00 00 00 07 00 00
关后右门 00 00 00 0F 00 00
全开 00 00 00 00 00 00
全关 00 00 00 0F 00 00
加速:利用cansniffer工具使用肉眼观察,重点看与加速同步变化的字节。
关键数据帧:vcan0 F0#00003894000000(最大速度,第3、4个字节值保持不变)
ID为0xF0
第3、4个字节
不加速时,第3个字节恒为0x01;加速时,值增长变化与速度基本一致(表示当前的速度)。
可以cansend重放检验该数据帧:
1 | import os |
3. SavvyCAN使用
3.1 SavvyCAN安装
参考网络资料,安装SavvyCAN工具。
(安装过程你是否遇到问题?如何解决?)
安装Qt
注册账户,下载在线安装程序,安装对应版本5.15.0(我一开始下载的是最新版Qt6,尝试编译时报错,说明版本不兼容,然后更换为Qt5.15.0)
编译:使用Qt5.15.0,然后进行编译。
在等待过程中,我发现有release。下载对应二进制文件尝试建立connection时发现不支持。

等待编译完成后,可成功运行SavvyCAN。
3.2 SavvyCAN使用
使用SavvyCAN,监听你创建的CAN接口,探索SavvyCAN的不同功能,并通过其FUZZ功能筛选灯控、门控、加速的关键数据帧。
(附上实验步骤和关键截图)
灯控:取消勾选0x2A3时发现转向灯始终关闭,可判断关键帧ID,选定fuzzing字节(第2个),可以确定关键控制字段,分别控制低2位可确定左右灯的控制位。
门控:取消勾选0x2C时发现门的状态始终不变,可判断关键帧ID,选定fuzzing字节(第4个),可以确定关键控制字段,分别控制低4位可确定四扇门的控制位。
加速:取消勾选0xF0时发现速度始终不变,可判断关键帧ID,选定fuzzing字节(第3、4个),可以发现主要与第3个字节有关,其增长变化与速度变化基本一致。
3.3 关键帧总结
列出你所得到的与灯控、门控、加速有关的关键帧详细信息(报文ID 数据长度 关键控制字段在哪一个或多个字节)。
| 功能 | 报文ID | 数据长度/byte | 关键控制字段 | 详细 |
|---|---|---|---|---|
| 灯控 | 0x2A3 | 4 | 第2个字节低2位 | 从低到高依次表示左灯、右灯,0表示不亮 |
| 门控 | 0x2C | 6 | 第4个字节低4位 | 从高到低依次表示后右、后左、前右、前左,0表示开门 |
| 加速 | 0xF0 | 7 | 第3、4个字节 | 第3个字节的值变化与速度变化一致 |
(三)进阶实验
1. 关键帧分析
以你的个人学号为种子,在难度2下重新启动ICSim模拟器,使用SavvyCAN,找到当前模拟条件下与灯控、门控、加速有关的关键帧详细信息。
(附上主要步骤、截图和关键帧总结,以及描述你在更高的难度下遇到哪些困难。)
学号为xxx,用完整学号作为种子后,模拟器部分功能异常,因此这里去掉了最高位,即“./controls -s xx -l 2 vcan0”。
灯控:ID为0x211,第1个字节,低2位从低到高分别控制左灯、右灯,1为开,0为关。与之前不同的是,其他字节的值一直在发生变化。
门控:ID为0x781,第6个字节,低4位从高到低依次控制后右、后左、前右、前左,0为开,1为关。与之前不同的是,每次进行开关门操作时其他字节会发生随机变化,所以直接看该数据帧的值时会发现相同的操作对应不同的值,很难发现规律。
加速:ID为0x579,第4、5个字节,第4个字节的值变化与速度变化基本一致(表示当前的速度),达到最大速度时,第4、5个字节的值保持不变。与之前不同的是,在速度变化的过程中其他字节也会发生随机变化,所以直接看该数据帧的值很难发现规律,容易眼花缭乱。
| 功能 | 报文ID | 数据长度/字节 | 关键控制字段 | 详细 |
|---|---|---|---|---|
| 灯控 | 0x211 | 7 | 第1个字节低2位 | 从低到高以此表示左灯、右灯,0表示不亮 |
| 门控 | 0x781 | 7 | 第6个字节低4位 | 从高到低依次表示后右、后左、前右、前左,0表示开门 |
| 加速 | 0x579 | 7 | 第4、5个字节 | 第4个字节的值变化与速度变化一致 |
2. 攻击模拟
重放攻击
重放你之前分析所得到的关键单帧以及在某一段操作时间内用candump捕获到的所有数据帧日志,观察是否能够控制某些关键功能(灯控、加速、门控)。
(附上主要步骤截图)
灯控:重放211#0100B400000000,可以控制转向灯。
加速:捕获了一段加速的数据帧日志,使用canplayer进行重放,可以实现加速。
门控:重放781#D10000D7640ED5,可以打开前左门。
DoS攻击
用你自己的方式,对灯控、加速、门控服务实施DoS攻击,具体表现分别为
左转向灯无法正常亮起、右转向灯可正常控制。
仪表盘失灵,加速时无法正确显示当前速度。
左前门无法正常关闭,其余车门可正常控制。
(附上主要攻击步骤、工具截图或攻击代码)
攻击思路:持续监听数据帧,当监听到相关操作数据帧时(ID=0x211、0x781、0x579),进行对应操作。
0x211(灯控):检查数据帧数据,第1个字节为1或3,说明用户想开启左灯,此时攻击程序发送一个关闭左灯的数据帧,该帧保证右灯控制位与监听到的数据帧一致(程序实现就是对1、3两种情况分别讨论了一下)。
0x579(加速):当第4个字节的值大于0x01时,说明用户想要加速,此时攻击程序发送该ID第4个字节内容为随机值的数据帧,使得仪表盘速度显示为随机值。
0x781(门控):将第6个字节与0x01进行与运算,若结果为1,说明当前用户想关闭左前门,此时攻击程序发送第6个字节与0xFE进行与操作的数据帧,确保左前门保持打开状态、其他车门操作正常。(无论左前门的初始状态如何,程序执行过程中会一直保持左前门的打开状态,其他车门可正常操作)

完整代码如下:
1 | import can |
三.实验总结
- CAN总线通信与其他网络通信协议相比,有哪些脆弱性?这导致了CAN易受哪些攻击?
缺乏身份验证机制和消息完整性校验,任何连接到总线的设备都可以发送数据帧,攻击者可实现注入、篡改、阻断关键控制信息等攻击。
通信数据未加密,攻击者可监听、分析关键操作帧,如灯控、门控、加速等操作的关键帧,从而达到特定的攻击目的。
广播通信机制使得单点攻击可能影响整个系统。
滥用优先级仲裁机制。不断发送高优先级的无效帧可实现DoS攻击,导致通信无法正常运行。
CAN总线通信易受到重放攻击、DoS攻击、命令注入、设备欺骗、数据帧篡改等攻击。
- 对于CAN总线而言,除一般的欺骗、注入、重放、DoS类攻击之外,还有哪些可能存在的攻击思路?(可以根据你对CAN总线通信的理解进行创新,或者从其他通信协议的各种攻击面进行迁移)
不同ID对应的数据帧有自己固定的格式,如数据长度、控制位等,攻击者可以故意发送错误格式的数据帧,接收端要么会读取混乱(如数据越界导致崩溃),要么执行这个错误指令,导致设备关键操作陷入混乱,实现攻击目的。
- 有哪些防御手段可以增强车内CAN总线通信的安全性?
引入认证机制,可在数据帧中附加数字签名,用于验证帧的来源与完整性,防止伪造和篡改。
在数据帧接收端设置白名单和正则匹配来限制数据帧接受来源,保证帧的格式正确,避免非法注入和重放。
将关键控制系统与非关键系统分离,防止单点攻击影响整个系统(如利用非关键系统漏洞攻击关键系统等)。
监测帧频率异常、ID异常等行为,以识别DoS、重放等攻击,必要时采取拦截手段。
- Author: dawn_r1sing
- Created at : 2025-07-13 22:42:57
- License: This work is licensed under CC BY-NC-SA 4.0.(转载请注明出处)