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, 信号欺骗检测, 入侵检测系统, 安全数据湖, 嵌入式安全, 异常检测, 模拟信号分析, 汽车黑客防御, 物理层指纹, 物联网, 电压特征提取, 车联网, 车载网络, 车载网络安全