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总线, 嵌入式安全, 数据擦除, 车载网, 重放攻击