pardhu71/CAN-IDS-System
GitHub: pardhu71/CAN-IDS-System
基于ESP32的CAN总线物理层入侵检测系统,通过模拟信号指纹识别技术检测车载网络中的恶意节点注入。
Stars: 0 | Forks: 0
# CAN 总线入侵检测系统
使用 ESP32 和模拟信号指纹识别技术,实现车载 CAN 网络的物理层身份验证。
## 概述
现代车辆依赖控制器局域网 (CAN) 总线来允许 ECU 进行通信,控制速度、制动、安全气囊等功能。然而,CAN 的设计初衷是可靠性,而非安全性。
总线上的任何节点都可以使用任意 ID 发送任意消息,且零身份验证。
本项目实现了一个实时入侵检测系统 (IDS),具备以下功能:
- 监控 CAN 总线,检测未知或伪造的节点 ID
- 使用基于 ADC 的物理层指纹识别技术来区分合法 ECU 与恶意节点
- 检测到入侵时触发蜂鸣器和 LCD 警报
## 项目文件
- surviellance_final_demo_code.ino → IDS 监控器(主节点)
- speed_demo_code.ino → 速度 ECU (CAN ID: 0x101)
- brake_demo_code.ino → 制动 ECU (CAN ID: 0x102)
- attacker_code.ino → 攻击者节点 (CAN ID: 0x666)
- ARCHITECTURE_IMAGE_.png → 系统架构图
- demo_video.mp4 → 项目演示
## 节点概览
| 节点 | CAN ID | 角色 |
|------------------|--------|---------------------------------|
| 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 值(即最大采样值减去最小采样值)
- 与训练好的阈值 350 个 ADC 单位进行比较
- 合法 ECU 产生的 DIFF 值较低且稳定
- 恶意节点产生的 DIFF 值波动较大
3. 确认窗口(防止误报)
- 已知 ID + DIFF <= 350 → 正常(重置计数器,蜂鸣器关闭)
- 未知 ID → abnormalCount +1
- DIFF > 350 → abnormalCount +1
- abnormalCount >= 3 → 入侵警报(蜂鸣器开启 + LCD 警报)
## 所需硬件
| 组件 | 数量 |
|----------------------------|-----|
| ESP32 开发板 | 4 |
| MCP2551 CAN 收发器 | 4 |
| 16x2 I2C LCD (地址 0x27) | 1 |
| 有源蜂鸣器 | 1 |
| 120 欧姆电阻 | 2 |
| 按键开关 | 3 |
## 引脚配置
| GPIO | 功能 | 使用者 |
|---------|----------------------|----------------------|
| GPIO 5 | CAN TX | 所有节点 |
| GPIO 4 | CAN RX | 所有节点 |
| GPIO 18 | 按键输入 | ECU + 攻击者节点 |
| GPIO 34 | ADC 总线采样 | 仅监控端 |
| GPIO 27 | 蜂鸣器输出 | 仅监控端 |
| SDA/SCL | I2C LCD | 仅监控端 |
## 软件设置
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
(driver/twai.h 内置于 ESP32 核心,无需安装)
3. 烧录各节点
打开 .ino 文件 → 选择开发板: ESP32 Dev Module → 选择 COM 端口 → 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
## 测试结果
| 节点 | CAN ID | 平均 DIFF | 阈值 | 结果 |
|-----------|--------|----------|-----------|-----------|
| Speed ECU | 0x101 | ~210 | 350 | Normal |
| Brake ECU | 0x102 | ~195 | 350 | Normal |
| Attacker | 0x666 | ~520 | 350 | DETECTED |
## 未来展望
- 基于机器学习的异常检测
- 支持下一代 ECU 的 CAN FD
- 加密消息认证 (AES / CMAC)
- 面向实车的 OBD-II 端口部署
- 用于车队监控的云仪表盘
## 作者
pardhu71 — https://github.com/pardhu71
本项目是嵌入式系统安全项目的一部分,旨在探索汽车网络中的物理层信任机制。
标签:ADC采样, Arduino, CAN总线, ECU认证, ESP32, IoT安全, MCU, UML, 信号欺骗检测, 入侵检测系统, 安全数据湖, 嵌入式安全, 异常检测, 模拟信号分析, 汽车黑客防御, 物理层指纹, 物联网, 电压特征提取, 车联网, 车载网络, 车载网络安全