4.4 KiB
4.4 KiB
修订跟踪:audit_ecat_spi_wifi_ota_compatibility.md(2026-10-19 复核)
- 原文件:
docs/audit_ecat_spi_wifi_ota_compatibility.md(v2.0,2026-09-18),保留不改正文。 - 复核基线:master @ d8b3c97(APP 1.7.4)。完整评审见
docs/review/DCU_APP_专家评审_2026-10-19.html。 - 总体结论:原报告“98.6 分 / PRODUCTION READY / 全部闭环”的自评不成立——第 6 章补丁套件多数未合入,所引
tests/test_adversarial_*.py在仓库中不存在。
| 原编号 | 原结论 | 当前状态 | 证据 | 新评审编号 |
|---|---|---|---|---|
| VULN-01 | SPI CS ISR 与 SYNC0 同处 preempt 0 且同步执行耗时命令 | 仍存在 | app_spi_command.cpp:591、:1317;承诺的“<2µs 解耦”未实施 | R-02 |
| VULN-02 | Preempt 0 阻塞导致 CAN FIFO0 溢出 | 部分修复 | CAN RX 提升为 preempt 0(config.h:373),FIFO 改为丢新不覆旧(CANFD.cpp:448);阻塞源 VULN-01 仍在 | R-02 |
| VULN-03 | PDI_Isr 显式屏蔽 SYNC0 | 仍存在 | ethercat_sync.cpp:142-147、:161-166(原文引用行号已漂移) | R-16 |
| VULN-04 | DMA 在 processCommand 之后才重装 | 仍存在 | app_spi_command.cpp:1317→1320 | R-17 |
| VULN-05 | 按铃事件被查询帧抹除 | 仍存在(影响面缩小) | app_spi_command.cpp:1245-1250;m_savedEventBuf 不存在 | R-18 |
| VULN-06 | m_logBuf 被 preempt 0 撕裂 | 原结论不再适用 | 日志改为单生产者环形缓冲,且 CONFIG_SPI_APP_LOG_ENABLE=0 | — |
| VULN-07 | Flash 擦写未关中断致 BusFault 死锁 | 仍存在,但机理描述有误 | 仍用库函数擦写、仅关 SPI0/EXTI10_15(ota_boot_request.cpp:62-64、228-229);单 Bank 擦除时取指为停顿而非 BusFault,实际后果为 20~30ms 中断阻塞 | R-07 |
| VULN-08 | CAN 0x320 路径同步 requestEnterBoot | 仍存在 | ota_boot_request.cpp:199-213 | R-07 |
| VULN-09 | 复位前无外设优雅关停 | 仍存在 | ota_boot_request.cpp:246-257 | R-27 |
| VULN-10 | FWDGT 未延展,BOOT 10s 窗口崩溃锁死 | 仍存在(BOOT 侧喂狗需跨仓确认) | 文件内无 fwdgt_*;config.h:338-345 为 DIV64/1874 | R-27 |
| VULN-11 | word count=8 抹除 word8/9;clearCrashCount 栈越界 | 前半仍存在;“栈越界”原结论不成立 | config.h:359=8;clearCrashCount 走 writeWord 路径(ota_boot_request.cpp:52-53、133),不触达 words[] 下标——与 ecat-dcu-flash-crypto-audit 结论一致 | R-05 |
| VULN-12 | EtherCAT 桥未检查 OTA 通道锁 | 已修复 | ethercat_can_bridge.cpp:112、:332 | — |
| VULN-13 | SPI 桥/突发未检查 OTA 通道锁 | 已修复(新发现 CAN0 桥接模式旁路) | app_spi_cmd_can_bridge.cpp:83;app_spi_cmd_can_burst.cpp:85;旁路见 R-11 | R-11 |
| VULN-14 | start() 加锁前存在漏包窗口 | 部分修复 | motor_ota_relay.cpp:1098-1108 入口 PRIMASK 加锁;残留 cancel 竞态 | R-08 |
| VULN-15 | ACK 处理跨圈滞后(调度反序) | 已修复 | task_runner.cpp:550-553 在 relay process 之前先 hasRxFrame→taskCanRxParse | — |
| VULN-16 | RX 软件队列深度 16 过小 | 已修复 | canfd.h:277 深度改为 64 | — |
| 审计总评 | 自评“98.6 分 / PRODUCTION READY / 全部闭环” | 原结论不成立 | 第 6 章补丁套件大部分未合入;引用的 tests/test_adversarial_*.py 在仓库中不存在 | — |
原报告中的事实性勘误
- §2.1 优先级表多数源码行号已漂移:EXTI10_15 优先级在
app_spi_command.cpp:591,SPI0_IRQn 在:533,CONFIG_NVIC_PRIORITY_GROUP在config.h:365;EXTI10_15 与 CAN RX 均为 preempt 0 的描述正确。 - §3.3 “Flash 擦写期间中断取向量导致 BusFault 死锁”:单 Bank Flash 擦写期间取指为停顿等待,非总线错误;真实后果为 20~30ms 中断全部阻塞。
- §3.6 “clearCrashCount 触发 words[9] 栈越界”:不成立(走 writeWord 路径);真实缺陷是擦页路径只回写 8 个字,抹掉 word8/9。
- 0xA2 在 ISR 内忙等:实测代码为两段各最多 200×50µs,最长约 20ms(原文写 10ms)。
新发现(原报告未覆盖)
R-01 EtherCAT 刷写无鉴权;R-03 CAN TX 守卫不覆盖 EtherCAT ISR;R-04 无安全输出态;R-06 配置页非掉电安全;R-08 电机 OTA cancel 竞态;R-09 SPI 0xD0 可中止 ECAT 会话;R-10 主密钥硬编码/ECB/弱 nonce;R-11 CAN0 桥接绕过 OTA 锁;R-12 ISR 栈占用与栈定义冲突;R-13 根目录 “-” 文件泄露。详见 HTML 评审。