Files
DCU_APP/docs/audit_ecat_spi_wifi_ota_compatibility.rev2026-10-19.md
T

4.4 KiB
Raw Blame History

修订跟踪: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 评审。