laithalarmouti/CAN-Bus-IDS-STM32

GitHub: laithalarmouti/CAN-Bus-IDS-STM32

这是一个基于STM32F446RE微控制器的实时车载CAN总线入侵检测系统,通过部署量化神经网络在边缘端实现毫秒级攻击识别。

Stars: 0 | Forks: 0

# CAN-Bus-IDS-STM32 ### 基于 STM32F446RE 的设备端 AI 实时汽车 CAN 总线入侵检测 ![STM32](https://img.shields.io/badge/MCU-STM32F446RE-blue) ![AI](https://img.shields.io/badge/AI-X--CUBE--AI%2010.2-red) ![Accuracy](https://img.shields.io/badge/Accuracy-99.92%25-green) ![License](https://img.shields.io/badge/License-MIT-yellow) 一个完全运行在资源受限的 ARM Cortex-M4 微控制器上的实时汽车 **CAN 总线入侵检测系统 (IDS)**。该系统监控 CAN 总线流量,逐帧提取特征,并使用量化神经网络对攻击进行分类——无需云端,无外部计算,亚毫秒级推理。 ## 演示 ``` === CAN IDS System Starting === [OK] CAN Driver Initialized [OK] UART Frame Parser Ready [OK] AI Network Initialized === System Ready - Monitoring CAN Bus === [INFO] Normal traffic - 1000 frames processed [ALERT] *** DoS ATTACK *** | ID: 0x000 | Confidence: 99% [ALERT] *** DoS ATTACK *** | ID: 0x000 | Confidence: 99% [ALERT] *** FUZZY ATTACK *** | ID: 0x03AB | Confidence: 97% [INFO] Normal traffic - 1000 frames processed ``` **无攻击 —— 正常 ECU 流量:** ![Normal Traffic](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/a835260c36151534.png) **模拟攻击 —— 注入恶意帧:** ![Attack Detection 1](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/ee44b76dcf151536.png) ![Attack Detection 2](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/b4f1cc1592151538.png) ## 系统架构 ``` ┌─────────────────────┐ CAN ┌──────────────────────────────┐ │ ESP8266 Node │ ─────────────────────────────► │ STM32F446RE - IDS Node │ │ │ │ │ │ • Simulates ECU │ │ • Bare-metal bxCAN driver │ │ CAN traffic │ │ • Feature extraction (11) │ │ • Injects attacks │ │ • int8 MLP inference │ │ • Button-triggered │ │ • UART alert logging │ └─────────────────────┘ └──────────────────────────────┘ ``` ## 检测结果 | 攻击类型 | 测试准确率 | 实时演示 | 描述 | |---------------|--------------|--------------|-----------------------------------| | 正常流量 | 99.9% | ✅ 正常运行 | 合法 ECU 帧 | | DoS 攻击 | 100% | ✅ 已检测 | ID 0x000 泛洪 | | Fuzzy 攻击 | 99.7% | ✅ 已检测 | 随机 ID + payload 注入 | | 档位欺骗 | 99.8% | 仅数据集 | ECU 冒充(档位位置) | | 转速欺骗 | 99.8% | 仅数据集 | ECU 冒充(发动机 RPM) | **总体准确率:99.92%**,基于 491,847 个未见过的测试帧(HCRL Car Hacking Dataset) ## ML 流水线 | 步骤 | 详情 | |------|--------| | 数据集 | HCRL Car Hacking Dataset —— 真实车辆(KIA Soul),OBD-II 采集 | | 帧 | 总计 3.3M → 平衡至每类 491,847(5 类) | | 特征 | CAN ID, DLC, 8 个 payload 字节,到达间隔时间 = 11 个特征 | | 模型 | MLP: Input(11) → Dense(64, ReLU) → Dense(32, ReLU) → Dense(5, Softmax) | | 参数 | 总计 3,013 —— 11.77 KB float32 | | 量化 | 完整 int8 训练后量化 → 8.06 KB | | 运行时 | STM32F446RE 上的 X-CUBE-AI 10.2 | | 设备端 RAM | 总计 2.62 KB | image image ## 固件架构 ``` Core/Src/ ├── main.c ← Application entry, inference loop ├── can_driver.c ← Bare-metal bxCAN — direct register access │ RCC, GPIO AF9, BTR timing, filter config │ Interrupt-driven RX ring buffer (32 frames) ├── feature_extractor.c ← Hardcoded StandardScaler, 11-feature extraction ├── uart_frame_parser.c ← Interrupt-driven UART parser (ESP8266 frames) └── uart_log.c ← UART logging with printf-style formatting X-CUBE-AI/App/ ├── network.c ← Generated inference API └── network_data.c ← Quantized model weights in flash ``` ### 关键设计决策 - **不使用 HAL 操作 CAN** —— bxCAN 完全通过直接寄存器操作配置。RCC 时钟使能、GPIO 复用功能 9、APB1 45 MHz 下 500 kbit/s 的 BTR 位时序、过滤器组配置、NVIC 优先级分配。 - **环形缓冲区 ISR** —— CAN RX 中断将帧存储在 32 槽循环缓冲区中。主循环独立排空该缓冲区。ISR 中无阻塞,推理期间无丢帧。 - **硬编码缩放器** —— StandardScaler 参数作为 const float 数组嵌入固件。无动态内存分配,无文件 I/O。 - **int8 量化** —— 相比 float32 内存减少 4 倍。Cortex-M4 上更快的整数运算。推理前逐帧应用量化参数。 ## 硬件 | 组件 | 用途 | |-----------|---------| | STM32F446RE (Nucleo-64) | 主 IDS 节点 —— 180 MHz Cortex-M4, 512KB flash, 128KB RAM | | ESP8266 (ESP-12S) | 传感器/攻击模拟节点 | | UART 连接 | 板间帧协议 @ 115200 波特率 | | ST-Link V2 (板载) | 烧录和 SWD 调试 | ## CAN 位时序 ``` APB1 clock: 45 MHz Prescaler: 9 BS1: 8 time quanta BS2: 1 time quantum Baud rate: 45,000,000 / (9 x (1 + 8 + 1)) = 500,000 bit/s ``` ## 仓库结构 ``` CAN-Bus-IDS-STM32/ ├── Core/ │ ├── Inc/ ← Header files │ └── Src/ ← Firmware source files ├── Drivers/ ← STM32 HAL drivers (CubeMX generated) ├── X-CUBE-AI/ ← ST AI runtime + generated network ├── Middlewares/ ← X-CUBE-AI library ├── ML_Pipeline/ ← Python notebooks and model files │ ├── explore.ipynb │ ├── can_ids_model.tflite │ ├── can_ids_model.h │ └── scaler_params.json ├── ESP8266/ │ └── can_simulator.ino ← Arduino sketch for frame simulation └── README.md ``` ## 快速开始 ### 前置条件 - STM32CubeIDE 1.16+ - X-CUBE-AI 10.2 扩展包(通过 CubeMX Software Packs 安装) - 带有 ESP8266 开发板包的 Arduino IDE - Python 3.x 以及 TensorFlow, scikit-learn, pandas ### 烧录 STM32 1. 在 STM32CubeIDE 中打开项目 2. 构建项目 (Ctrl+B) 3. 通过 ST-Link 烧录 (F11) 4. 在 Nucleo COM 端口以 115200 波特率打开串口终端 ### 烧录 ESP8266 1. 在 Arduino IDE 中打开 `ESP8266/can_simulator.ino` 2. 选择 Tools → Board → Generic ESP8266 Module 3. 按住 FLASH 按钮 → 按下 RESET → 松开 FLASH → 上传 4. 按下 RESET 运行 —— FLASH 按钮循环切换攻击模式 ## 行业相关性 本项目解决了 **ISO 21434** 和 **UN R155** 下的真实汽车网络安全要求,这些标准强制要求联网车辆具备入侵检测能力。设备端推理方法适用于 ECU 部署的生产环境,因为延迟要求排除了云端处理,内存限制需要量化模型,而实时性保证需要确定性的裸机固件。 ## 技术栈 **嵌入式:** C · STM32CubeIDE · X-CUBE-AI 10.2 · Bare-metal bxCAN · UART ISR **ML:** Python · TensorFlow/Keras · scikit-learn · TFLite · int8 Quantization **工具:** Jupyter Notebook · STM32CubeMX · Arduino IDE ## 作者 **Laith Alarmouti** —— 嵌入式 AI 与实时系统 嵌入式 AI 硕士 · 寻求德国的嵌入式/固件职位(汽车、国防、航空航天) [作品集](https://laithalarmouti.github.io) · [LinkedIn](https://linkedin.com/in/laithalarmouti)
标签:AI, Apex, ARM Cortex-M4, bxCAN, CAN总线, DoS攻击, MCU, STM32, STM32F446RE, X-CUBE-AI, 入侵检测系统, 安全数据湖, 实时检测, 客户端加密, 嵌入式, 机器学习, 模糊攻击, 汽车安全, 深度学习, 物联网安全, 神经网络, 自动化代码审查, 裸机, 边缘计算, 逆向工具, 量化神经网络