docs(review): 专家评审 2026-10-19
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
> **2026-10-19 复核说明**:本报告的结论已于 2026-10-19 对 master@d8b3c97 逐条复核,多数补丁未合入、“全部闭环”结论不成立。最新状态见 [修订跟踪](audit_ecat_spi_wifi_ota_compatibility.rev2026-10-19.md) 与 [专家评审](review/DCU_APP_专家评审_2026-10-19.html)。以下为原文,未改动。
|
||||||
|
|
||||||
# GD32E508 DCU 固件多总线并发兼容性、本地 OTA 隔离关停与电机中继 OTA 排他性系统级安全审计报告与防御加固方案
|
# GD32E508 DCU 固件多总线并发兼容性、本地 OTA 隔离关停与电机中继 OTA 排他性系统级安全审计报告与防御加固方案
|
||||||
|
|
||||||
- **文档标识**:`DCU-AUDIT-ECAT-SPI-WIFI-OTA-20260918`
|
- **文档标识**:`DCU-AUDIT-ECAT-SPI-WIFI-OTA-20260918`
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# 修订跟踪: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 评审。
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# 既有设计/审计记录状态复核(2026-10-19)
|
||||||
|
|
||||||
|
基线:master @ d8b3c97。原文件均保留未改。完整评审见 `docs/review/DCU_APP_专家评审_2026-10-19.html`。
|
||||||
|
|
||||||
|
| 记录 | 原结论/内容 | 当前状态 |
|
||||||
|
|---|---|---|
|
||||||
|
| `docs/compose/spec/ecat-dcu-flash-crypto-audit.md` | DCU 刷写无载荷加密;word count=8;CAN 路径同步;无 teardown/fwdgt;BOOT 侧不可验证 | 仍成立;补充:BOOT 侧经跨仓核实 arm 门可被 0x2502 无鉴权打开(R-01) |
|
||||||
|
| `docs/compose/spec/lan9252-perf-audit.md` | P1 差分写 ESC、P2 csrRead verify 分级 | 已实现:config.h:134 SPARSE=1、:143 DIFF=1;esc_lan9252.h:84 csrRead(verify)。上机对拍仍待做;front-matter updated 日期与提交时间不符 |
|
||||||
|
| `docs/compose/spec/ecat-wkc-periodic-dip.md` | 主因 B:输出侧每 256 拍强制全量读 | 机制仍存在(ethercat_pdo.cpp:114-134),未见修复提交;仍待现场 A/B 对拍 |
|
||||||
|
| `docs/compose/spec/tiered-pdo-mapping.md` | status: designed,按电机数分档收缩 SM3 | 未实现:全仓无 tier 相关代码,SM3 仍为 600B |
|
||||||
|
| `docs/compose/spec/warm-jump-ecat-probe.md` | 起板探针改为 BYTE_TEST 放行 | 已实现并保留(esc_lan9252.cpp 使用 LAN9252_BYTE_TEST_VALUE) |
|
||||||
|
| `.trae/specs/fix-ethercat-realtime-comm-risks` | s_periodicSeq、safe* 接口、PDO 三缓冲 | 被后续 SSC 集成取代:periodicIsr/三缓冲桥已删除,PDO 由 SSC 3-buffer SM 完成 |
|
||||||
|
| `.trae/specs/fix-ecat-postaudit-risks` | H1 safe* 收窄;M1 SYNC0 RAM 化;M2 NVIC 分组前移;M3 删 readBlock | H1/M3 已落地(safe*、readBlock 均已不存在);M1 已落地(ethercat_sync.cpp:112、:188 .ramfunc);M2 已落地(initial.cpp:222) |
|
||||||
|
| `.trae/specs/fix-ecat-pdo-and-runtime-issues` | S1 PDI 偏移分离、S2 process 桥、S3 AL 守卫、M4-M7 | S1/S2 被 SSC 架构取代;S3 部分保留(ethercat_slave.h:32 getAlState);M4-M7 随旧路径删除 |
|
||||||
|
| `.trae/documents/cleanup-residual-low-risk-optimizations.md` | 13 项低风险清理 | 抽查均已落地:canfd_diag_t、m_ringTxLen、s_pushCount 已删除,sys/hardfault.h 已删除,spinDelay/armRingPending 已提取,ADC 匿名 namespace 已合并 |
|
||||||
|
| `README.md` | 工程结构说明 | 大面积过时(见 R-40) |
|
||||||
|
|
||||||
|
备注:lan9252-perf-audit 的 front-matter `updated: 2026-02-14` 与实际提交日期(2026-09-12)不符;ecat-wkc-periodic-dip 标注“本文件不提交”但已在仓库中。
|
||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user