diff --git a/docs/reports/aibox_audit_20260817.md b/docs/reports/aibox_audit_20260817.md index e7703e4..7f1bd77 100644 --- a/docs/reports/aibox_audit_20260817.md +++ b/docs/reports/aibox_audit_20260817.md @@ -2,8 +2,18 @@ - **日期**:2026-08-17(第一轮)/ 2026-08-18(第二轮复审)/ 2026-08-18(第三轮:遗留复核 + v3.4 专审)/ 2026-08-18(第四轮:3 路并行审读 + Batch H 修复)/ 2026-08-19(第五轮:4 路并行审读,聚焦历届未覆盖区域) - **审计基线**:第一轮 HEAD `ce142fe`(Batch A–D 后)→ 第二轮 HEAD `177a9ac`(Batch E 修复后)→ 第三轮 HEAD `aa15841`(L4a/b/c 落地后)→ 第四轮 HEAD `d1f780e`(Batch G + SOCKS5 验证后)→ 第五轮 HEAD `d513c5f`(Batch I + model_config.py 后,含工作区未提交的 max_turns 钳制) -- **审计范围**:`aibox.py`(~3310 行)+ `llm_client.py` + `tools/`(7 文件)+ `subsystems/`(6 文件)+ `common/`(5 文件) -- **方法**:第一轮逐文件代码审读 + PoC 动态验证;第二轮 Batch E 修复复审 + 全量重审 + 6 处关键发现实证抽查;第三轮遗留项复核 + v3.4 专审;第四轮 3 路并行审读 + 主审逐条复核 + Linux PoC 实证(6/6) +- **审计范围**:`aibox.py`(~3458 行)+ `llm_client.py` + `model_config.py` + `tools/`(7 文件)+ `subsystems/`(6 文件)+ `common/`(5 文件)+ 前端 HTML(frontend.html / entry.html / entry1.html)+ `skills/` 脚本 + `client.py` / `voice_client.py`(前端与技能脚本为第五轮首次覆盖) +- **方法**:第一轮逐文件代码审读 + PoC 动态验证;第二轮 Batch E 修复复审 + 全量重审 + 6 处关键发现实证抽查;第三轮遗留项复核 + v3.4 专审;第四轮 3 路并行审读 + 主审逐条复核 + Linux PoC 实证(6/6);第五轮 4 路并行审读(聚焦历届未覆盖区域)+ 主审逐条复核 + Linux PoC 实证(2/2) + +### 轮次总览 + +| 轮次 | 日期 | 基线 HEAD | 新发现 | 修复 | 测试基线 | +|---|---|---|---|---|---| +| 第一轮 | 2026-08-17 | `ce142fe` | H1~H3 / M1~M4 / L1~L3 | Batch E(H1/H2/H3/M1/M2) | 264 passed | +| 第二轮 | 2026-08-18 | `177a9ac` | N1~N17 | Batch F(F1/F2 落地,F3~F6 转后续批次) | 272 passed | +| 第三轮 | 2026-08-18 | `aa15841` | P1~P7 | Batch G(G1~G5:P1~P6 + N2/N3/N5/N7/N8/N10/N12~N16/L1) | 375 passed | +| 第四轮 | 2026-08-18 | `d1f780e` | Batch H 全项(含 N5 取消传播回归,高危) | Batch H + Batch I 遗留收尾 | 424 passed | +| 第五轮 | 2026-08-19 | `d513c5f` | J1~J16(高危 2 / 中危 5 / 低危与信息 9) | Batch K(波次 1~5 全落地) | 490 passed | --- @@ -13,6 +23,14 @@ **第二轮**(基线 177a9ac):Batch E 五项修复(H1/H2/H3/M1/M2)中四项确认修复到位(PoC 5/5 验证),**M2 修复不完整**(超时路径跳过工具属性清理,僵尸输出问题仍存)。第二轮全量重审新发现 **1 高危 + 9 中危 + 若干低危**,其中三项与 Batch E 修复直接相关(reader 线程泄漏 / 子代理超时盲区 / M2 残留),其余为存量问题(代理密码明文落盘、drain 线程泄漏、事件循环阻塞等)。详见"八、第二轮复审"。 +**第三轮**(基线 aa15841):v3.4 多模型档案与 L4 失败转移新代码**整体高质量**(免密端点密钥隔离、用户中断绝不转移、fallback 链硬性校验,均有测试锚定),新发现 P1~P7 多为低/信息级。Batch G 按 5 波落地 20 项修复(含前两轮遗留的 N2/N3/N5/N7/N8/N10/N12~N16/L1),375 passed。 + +**第四轮**(基线 d1f780e):3 路并行审读发现 Batch H 全项——其中 **H1 为 N5 修复引入的高危回归**(子代理共享父取消事件后首轮 `clear()` 吞掉取消信号,取消传播被绕过);全部落地并经 Linux PoC 6/6 实证。Batch I 完成遗留收尾(N9 注入面长度上限、Q5 提醒异常、Q8 原子写、F9 --once 硬超时兜底等),424 passed。 + +**第五轮**(基线 d513c5f):聚焦历届未覆盖区域(WS 深审、model_config.py、前端与 skills 脚本首覆盖),发现 J1~J16——含 **J1 任务系统投毒**(畸形时间/数字字段致调度器失败热循环 + 新连接握手即崩)与 **J2 前端 XSS**(AI 输出/命令结果全链路 innerHTML 渲染)两项高危;Batch K 波次 1~5 全落地,J1~J16 全数修复,490 passed 零回归。 + +**最终状态**:五轮累计发现 69 项(高危 7 / 中危 26 / 低危与信息 36)**全部修复落地**,无未修复安全发现;维持原判仅限设计决策项,见"十五、最终状态与遗留清单"。 + --- ## 二、高危发现(3 项) @@ -351,7 +369,7 @@ N3/N13/N14 为 async WebSocket 路径,依赖事件循环与真实连接对象 方法:3 路并行审读(aibox.py 全文 / llm_client+common+tools / subsystems+tests)+ 主审对全部候选发现逐条代码复核,关键项 Linux 动态实证(PoC 6/6)。 -### 11.1 新发现与修复(Batch H,13 项全落地) +### 11.1 新发现与修复(Batch H,19 项全落地) | # | 级别 | 问题 | 位置 | 修复 | |---|---|---|---|---| @@ -603,3 +621,37 @@ J3 ×3(单条/批量删除无 FTS 残留 + 删后搜索不命中)、J4 ×2 全量 **490 passed** = 483 + 波次 5 新增 7。零回归;2 个预存 Windows 向失败同前。 **第五轮审计(Batch K)至此全部落地**:J1~J16 高危/中危/低危全部修复(J14 的 voice_client 重连设计、J15 的 once 模式 SIGINT 二次 Ctrl+C 升级退出等未采纳项已在报告记录)。 + +--- + +## 十五、最终状态与遗留清单(2026-08-19,五轮收束) + +### 15.1 累计结论 + +五轮审计(2026-08-17 ~ 2026-08-19,Batch E~K)累计发现 **69 项**(高危 7 / 中危 26 / 低危与信息 36),**全部修复落地**,无未修复安全发现。历轮高危处置一览: + +| 高危 | 问题 | 修复 | +|---|---|---| +| H1~H3 | 命令执行链三重保护同时失效 | Batch E 恢复 executor 链(PoC 5/5) | +| N1 | SOCKS5 代理密码明文落盘 | Batch F1 落盘脱敏 + password_env 迁移 | +| H1(第四轮) | N5 修复引入的取消传播回归 | Batch H 共享事件跳过 clear + 早退检查 | +| J1 | 任务系统投毒(畸形字段热循环 + 握手崩溃) | Batch K1 三入口校验 + 调度器/展示路径兜底 | +| J2 | 前端全链路 XSS(innerHTML 直渲) | Batch K2 DOMPurify + textContent + SRI | + +### 15.2 维持原判 / 设计项 / 未采纳 + +| 项 | 类别 | 说明 | +|---|---|---| +| Q7a | 维持记录 | stream_chat POST 返回前取消空窗,受 timeout 有界;根治需线程化 POST(§12.2) | +| M4(旧编号) | 维持 | shlex POSIX 转义 Windows 失效,Linux 部署不受影响(§11.3) | +| Q9 | 维持 | 代理认证 curl 指引修复会引入密码进日志/会话史的新泄漏(§11.3 / §12.2) | +| F8 | 设计项 | WS 限速/空闲回收,本地单用户产品不设(§12.2) | +| N9 确认门槛 | 设计项 | prompt 更新确认门槛未做(涉及交互设计);注入面已由 Batch I 内容长度上限约束(§10.1 / §12.1) | +| P7 | 已消解 | timeout_budget 语义为"尝试间预算",已在 FailoverClient 文档注明(§10.1) | +| J14 | 未采纳 | voice_client 自动重连设计(§14.9) | +| J15 | 未采纳 | once 模式二次 Ctrl+C 升级退出(§14.9) | +| compressor 裸 print / estimate_tokens 双计 | 保留 | 终端过程展示 / 既有算法测试锚定(§12.2) | + +### 15.3 最终测试基线 + +全量 **490 passed**(Linux,`aibox/venv`),零回归;`test_execute_timeout` / `test_flat_api_still_reads_key_file` 为 Windows 向用例(ping 语法 / 依赖 `~/.cert/deepseek.key`),Linux 预存失败与历轮改动无关。