Yusuffguness/can-bus-security-lab

GitHub: Yusuffguness/can-bus-security-lab

基于 Linux SocketCAN 虚拟接口用 C++ 模拟 CAN 总线重放攻击与防御机制的车载网络安全教学实验项目。

Stars: 0 | Forks: 0

# CAN 总线安全实验 — 重放攻击与防御模拟 这是一个 C++ 项目,在虚拟环境中模拟了汽车网络(CAN 总线)中常见的一种安全漏洞——**重放攻击(replay attack)**,随后通过**消息完整性(checksum)和新鲜度(freshness)检查**开发了针对该攻击的防御机制。 ## 目的 CAN 协议在设计上并不验证消息来源——任何设备都可以连接到网络并发送看似有效的消息。开发本项目是为了在实践中演示这一漏洞,并具体展示 ISO/SAE 21434 标准推荐的基本防御原则之一(消息完整性和新鲜度验证)。 ## 架构 ``` ┌─────────┐ CAN Bus (vcan0) ┌─────────┐ │ ECU-A │ ───────────────────────────► │ ECU-B │ │ (Hız │ ID: 0x100 │ (Hız │ │ Sensörü)│ │ Kontrol)│ └─────────┘ └─────────┘ ▲ │ ┌──────┴──────┐ │ Sniffer │ (tüm trafiği dinler, loglar) └─────────────┘ ▲ │ ┌──────┴──────┐ │ Saldırgan │ (yakalanan/sahte mesajı tekrar gönderir) └─────────────┘ ``` - **ECU-A**:每秒生成一个递增的速度值并发送到 CAN 网络(ID `0x100`)。 - **ECU-B**:监听速度消息,将超过 120 km/h 的值标记为“警告”。 - **Sniffer**:监听网络上的所有流量,将其打印到屏幕并加上时间戳记录到日志。 - **攻击者**:将截获或伪造的消息重新注入网络。 ## 环境 - 虚拟 CAN 接口:Linux SocketCAN (`vcan0`) - 语言:C++(Linux SocketCAN API — `socket()`、`bind()`、`read()`、`write()`) - 测试工具:`can-utils`(`cansend`、`candump`) ## 阶段 1 — 基本通信 `ecu_a.cpp` 和 `ecu_b.cpp` 通过 CAN 网络模拟基本的传感器 → 控制单元通信。ECU-A 生成速度数据,ECU-B 处理该数据并在超过阈值时发出警告。 ## 阶段 2 — 流量监控(Sniffer) `ecu_sniffer.cpp` 捕获网络上的所有消息,并带上时间戳记录在 `can_log.txt` 文件中。这模拟了攻击者首先监听网络以收集数据的真实场景。 ## 阶段 3 — 攻击:重放攻击 `saldiri_replay.sh` 不断重复发送预先截获的消息(`速度 = 0`),试图欺骗 ECU-B。 **结果(在无防御系统中):** ECU-B 无法区分真实和伪造的消息;伪造的“速度 0”消息与真实数据混杂在一起被处理。 ``` Hiz normal: 0 km/s Hiz normal: 100 km/s Hiz normal: 0 km/s Hiz normal: 110 km/s ``` ## 阶段 4 — 防御:完整性 + 新鲜度检查 消息格式已扩展: | 字节 | 内容 | |------|--------| | `data[0]` | 速度值 | | `data[1]` | 递增计数器(消息序列) | | `data[2]` | Checksum: `(速度 + 计数器) % 256` | ECU-B 现在对每条消息执行三项检查: 1. **格式检查** — 如果消息长度与预期不符,则拒绝。 2. **完整性检查** — 如果计算出的 checksum 与传入的 checksum 不匹配,则拒绝该消息。 3. **新鲜度检查** — 如果传入的计数器与之前见过的计数器相同(怀疑是重放攻击),则拒绝该消息。 **结果(在有防御系统中):** ``` UYARI! Hiz limiti asildi: 160 km/s (Sayac: 116) [GECERLI MESAJ] REDDEDILDI! REPLAY SALDIRISI TESPIT EDILDI - Sayac tekrar etti: 116 REDDEDILDI! REPLAY SALDIRISI TESPIT EDILDI - Sayac tekrar etti: 116 ``` 旧格式的攻击脚本也被自动拒绝: ``` REDDEDILDI! Gecersiz mesaj formati (olasi saldiri) - Uzunluk: 1 ``` ## 标准参考 本项目中应用的防御原则基于 **ISO/SAE 21434**(道路车辆 — 网络安全工程)标准推荐的基本方法之一,即消息完整性和新鲜度(freshness)验证。在实际车辆中,这通常通过硬件安全模块(HSM)和基于 MAC(消息认证码)的解决方案,以更强大的加密方法实现;本项目是相同原理的简化教育演示。 ## 安装与运行 ``` # 创建 Sanal CAN arayüz sudo modprobe vcan sudo ip link add dev vcan0 type vcan sudo ip link set up vcan0 # Derleme g++ ecu_a.cpp -o ecu_a g++ ecu_b.cpp -o ecu_b g++ ecu_sniffer.cpp -o ecu_sniffer chmod +x saldiri_replay.sh # Çalıştırma (在单独的终端中) ./ecu_a ./ecu_b ./ecu_sniffer ./saldiri_replay.sh ``` ## 未来可能的改进 - 使用基于 HMAC 的真实加密验证代替 Checksum - 使用真实的 CAN 硬件(例如 STM32 + MCP2515)进行物理测试 - 添加 TARA(威胁分析与风险评估)文档 - 使用多 ECU 场景模拟网络分段/网关安全 ## 作者 Muhammet Yusuf Gunes — 计算机工程,针对汽车网络安全领域的个人项目。
标签:C++, CAN总线, 嵌入式安全, 数据擦除, 车载网, 重放攻击