ruchithh/Controller-Area-Network-Intrusion-Detection-System
GitHub: ruchithh/Controller-Area-Network-Intrusion-Detection-System
基于ESP32的车载CAN总线实时入侵检测系统,通过物理层电压指纹和白名单机制识别恶意节点注入。
Stars: 0 | Forks: 0
# 🚗 CAN Bus 入侵检测系统
[](https://www.espressif.com/en/products/socs/esp32)
[](https://en.wikipedia.org/wiki/CAN_bus)
[](https://www.arduino.cc/)
[](LICENSE)
## 📖 概述
现代车辆依赖 **控制器局域网 (CAN) 总线** 来实现 ECU 之间的通信——控制速度、制动、安全气囊等。然而,CAN 的设计初衷是 **可靠性而非安全性**。总线上的任何节点都可以使用任何 ID 发送任何消息,且毫无身份验证。
本项目实现了一个 **实时入侵检测系统 (IDS)**,具备以下功能:
- 🔍 监控 CAN 总线中未知或伪造的节点 ID
- 📡 使用基于 ADC 的 **物理层指纹识别** 技术来区分合法 ECU 与恶意节点
- 🚨 检测到入侵时触发 **蜂鸣器和 LCD 警报**
## 🏗️ 系统架构

## 📁 项目文件
| File | Description |
|------|-------------|
| `surviellance_final_demo_code.ino` | IDS Monitor — 主监控节点 |
| `speed_demo_code.ino` | Speed ECU (CAN ID: `0x101`) |
| `brake_demo_code.ino` | Brake ECU (CAN ID: `0x102`) |
| `attacker_code.ino` | Attacker Node (CAN ID: `0x666`) |
| `ARCHITECTURE_IMAGE_.png` | 系统图 |
| `demo_video.mp4` | 项目演示视频 |
## 🔌 节点摘要
| Node | CAN ID | Role |
|------|--------|------|
| Surveillance IDS | — | 监控总线,检测入侵 |
| Speed ECU | `0x101` | 发送速度数据 (payload = 60) |
| Brake ECU | `0x102` | 发送制动状态 (payload = 1) |
| Attacker Node | `0x666` | 注入恶意帧 (`0xFF`) |
## 🧠 检测原理
### 1. CAN ID 白名单
仅 `0x101` 和 `0x102` 为合法 ID。任何其他 ID 会立即被标记。
### 2. 物理层模拟指纹识别
- ADC 引脚 **GPIO 34** 采样 CAN 总线电压 —— 以 12 位分辨率采集 **50 个样本**
- 对每一帧计算 `DIFF = MAX sample − MIN sample`
- 将其与训练好的阈值 **350 个 ADC 单位** 进行比较
- ✅ 合法 ECU → 低且稳定的 DIFF
- ❌ 恶意节点 → 高方差的 DIFF
### 3. 确认窗口 *(防止误报)*
| Condition | Action |
|-----------|--------|
| 已知 ID + DIFF ≤ 350 | ✅ 正常 — 重置计数器,关闭蜂鸣器 |
| 检测到未知 ID | `abnormalCount += 1` |
| DIFF > 350 | `abnormalCount += 1` |
| `abnormalCount >= 3` | 🚨 **入侵警报** — 开启蜂鸣器 + LCD 警报 |
## 🛠️ 所需硬件
| Component | Qty |
|-----------|-----|
| ESP32 Dev Board | 4 |
| MCP2551 CAN Transceiver | 4 |
| 16x2 I2C LCD (地址 `0x27`) | 1 |
| Active Buzzer | 1 |
| 120 Ohm Resistors | 2 |
| Push Buttons | 3 |
## 📌 引脚配置
| GPIO | Function | Used By |
|------|----------|---------|
| GPIO 5 | CAN TX | 所有节点 |
| GPIO 4 | CAN RX | 所有节点 |
| GPIO 18 | Button input | ECU + Attacker 节点 |
| GPIO 34 | ADC 总线采样 | 仅 Surveillance |
| GPIO 27 | Buzzer output | 仅 Surveillance |
| SDA / SCL | I2C LCD | 仅 Surveillance |
## ⚙️ 软件设置
### 1. 在 Arduino IDE 中安装 ESP32
进入 `File → Preferences` 并添加开发板管理器 URL:
```
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
```
然后执行:`Tools → Board → Boards Manager → 搜索 "esp32" → Install`
### 2. 安装库
`Tools → Manage Libraries → 搜索 "LiquidCrystal_I2C" → Install`
### 3. 烧录各节点
1. 打开各节点对应的 `.ino` 文件
2. 选择 **Board:** `ESP32 Dev Module`
3. 选择正确的 **COM Port**
4. 点击 **Upload**
## 🖥️ 串口监视器输出
*(波特率设置为 115200)*
```
=== CAN IDS SURVEILLANCE READY ===
[OK] SPEED ECU | STATUS: UPDATED | DIFF=210
[OK] BRAKE ECU | STATUS: UPDATED | DIFF=195
[ALERT] UNKNOWN NODE | CAN ID=0x666 | DIFF=520
[ALERT] UNKNOWN NODE | CAN ID=0x666 | DIFF=515
```
## ✅ 测试结果
| Node | CAN ID | Avg DIFF | Threshold | Result |
|------|--------|----------|-----------|--------|
| Speed ECU | `0x101` | ~210 | 350 | ✅ 正常 |
| Brake ECU | `0x102` | ~195 | 350 | ✅ 正常 |
| Attacker | `0x666` | ~520 | 350 | 🚨 **已检测到** |
## 🎬 演示
▶️ 观看本仓库中包含的 `OUTPUT_VIDEO.mp4`,查看 IDS 实时检测活动 CAN 总线攻击的现场演示。
## 🔭 未来展望
- 🤖 基于 **机器学习** 的异常检测
- 🚀 支持 **CAN FD** 以适配下一代 ECU
- 🔐 **加密消息身份验证** (AES / CMAC)
- 🔌 **OBD-II 端口部署** 用于实车环境
- ☁️ 用于车队监控的 **云端仪表盘**
## 📄 许可证
本项目基于 [MIT License](LICENSE) 授权。
👨💻 作者
Kairamkonda Ruchith
🤝 合作
作为学术团队项目的一部分开发。
本仓库代表我的实现及维护版本。
*为汽车网络安全研究而用 ❤️ 构建。*
标签:Arduino, CAN总线, CAN总线监控, ECU, ESP32, MIT ATT&CK, TGT, 信号注入, 入侵检测系统, 安全数据湖, 嵌入式系统, 工业控制安全, 异常检测, 攻防演练, 欺骗检测, 汽车安全, 物理层指纹, 物联网, 硬件安全, 网络安全, 车载网络, 隐私保护