Files
zclaw_openfang/docs/features/AUDIT_TRACKER.md
iven 6c6fcb76b3
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
docs(audit): resolve 3 P1 architecture decisions
- SEC2-P1-01 FactStore: FALSE_POSITIVE (trait already removed)
- V11-P1-03 3 SQL tables: FALSE_POSITIVE (2 active via JOIN, 1 write-only downgrade to P3)
- M4-04 deep approval: WONTFIX (4-layer defense-in-depth sufficient)
- M11-02: FIXED (map_err added in prev commit)
2026-04-04 21:31:47 +08:00

281 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ZCLAW 审计追踪表 (V12)
> **创建日期**: 2026-03-29
> **审计版本**: V12 模块化端到端审计
> **最后更新**: 2026-04-04
> **追踪规则**: 每个发现项记录状态变更,修复后需附验证方法
---
## P0: 阻断级
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|----|------|------|--------|---------|---------|
| SEC-V9-01 | prompt/service.rs:94,97,100 SQL 注入 | **FALSE_POSITIVE** | - | 2026-03-29 | 已验证: format!() 仅构建 `$N` 占位符索引,实际值通过 .bind() 参数化绑定,非 SQL 注入 |
## P1: 严重级
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|----|------|------|--------|---------|---------|
| BREAK-01 | LlmDriverForExtraction 无生产实现 | **FIXED** | - | 2026-03-29 | `extraction_adapter.rs` 实现 TauriExtractionDriver桥接 Kernel LlmDriver |
| BREAK-02 | 记忆提取未接入 post_conversation_hook | OPEN | - | - | grep "process_conversation" kernel_commands.rs |
| BREAK-03 | 审批后不自动执行 Hand | OPEN | - | - | 验证 approval_respond 中 approved=true 触发执行 |
| BREAK-04 | pipeline-complete 事件未监听 | OPEN | - | - | grep "pipeline-complete" desktop/src/ |
## P2: 高优先级
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|----|------|------|--------|---------|---------|
| DEAD-01 | PromptInjector 全文件死代码 | **FALSE_POSITIVE** | - | 2026-04-01 | V10 确认: PromptInjector 已通过 PromptBuilder 重构接入,非死代码 |
| DEAD-02 | MemoryRetriever 全文件死代码 | **FALSE_POSITIVE** | - | 2026-04-01 | V10 确认: MemoryRetriever 已通过 MemoryMiddleware 接入,非死代码 |
| DEAD-03 | GrowthTracker 全文件死代码 | **FALSE_POSITIVE** | - | 2026-04-01 | V10 确认: GrowthTracker 已通过 GrowthIntegration 桥接接入,非死代码 |
| DEAD-05 | 39 个未调用 saas-client 方法 | OPEN | - | - | 评估是否需要桌面端入口 |
| DOC-01 | Tauri 命令数文档 58+ vs 实际 130 | OPEN | - | - | 更新 06-tauri-backend 文档 |
| DOC-02 | 智能层文档引用已删除模块 | OPEN | - | - | 更新 02-intelligence-layer 文档 |
| TYPE-01 | Desktop/Admin 类型不一致 (6 组) | OPEN | - | - | 统一类型定义 |
| G-07 | account_api_keys 被 relay 绕过 | OPEN | - | - | 决策:统一 key 管理或标记独立功能 |
## P3: 中优先级
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|----|------|------|--------|---------|---------|
| CONF-01 | 配置参数孤儿 (batch_window_ms 等) | **PARTIALLY_FIXED** | - | 2026-03-29 | batch_window_ms / max_concurrent_per_provider 标记为预留 (relay 配置)burst 通过 RateLimitConfig 消费 |
| SEC-V9-02 | relay 输入验证可加强 | OPEN | - | - | 添加基本校验 |
| AUDIT-01 | 前端 audit-logger 无消费者 | OPEN | - | - | grep "auditLogger" desktop/src/ |
| DEAD-04 | director.rs 907 行孤立代码 | OPEN | - | - | 移至 feature flag 后面 |
| ADMIN-01 | config_sync_logs 无 Admin 页面 | OPEN | - | - | 添加页面 |
| ADMIN-02 | operation_logs 无 Admin 页面 | OPEN | - | - | 添加页面 |
## P4: 低优先级
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|----|------|------|--------|---------|---------|
| DOC-03 | SKILL.md 数量 69→70 | OPEN | - | - | 更新 README.md |
| DOC-04 | Hands 数量 CLAUDE.md vs README 不一致 | OPEN | - | - | 统一口径 |
| EVAL-01 | zclaw-channels 评估 | OPEN | - | - | 决定保留或删除 |
| IFACE-01 | trigger_update 接口不匹配 | OPEN | - | - | 对齐 TS/Rust 参数 |
---
## 状态变更日志
| 日期 | ID | 变更 | 备注 |
|------|-----|------|------|
| 2026-03-29 | SEC-V9-01 | OPEN → FALSE_POSITIVE | prompt/service.rs format!() 仅构建 $N 占位符,实际值通过 .bind() 参数化绑定 |
| 2026-03-29 | BREAK-01 | OPEN → FIXED | extraction_adapter.rs 实现 TauriExtractionDriver桥接 Kernel LlmDriver 到 LlmDriverForExtraction trait |
| 2026-03-29 | CONF-01 | OPEN → PARTIALLY_FIXED | Worker 系统 + Scheduler 系统上线部分配置参数已消费relay 预留参数已标注 |
| 2026-03-29 | - | V9 审计创建 | 20 个发现项 |
| 2026-04-01 | DEAD-01 | OPEN → FALSE_POSITIVE | V10 确认: PromptInjector 已通过 PromptBuilder 重构接入,非死代码 |
| 2026-04-01 | DEAD-02 | OPEN → FALSE_POSITIVE | V10 确认: MemoryRetriever 已通过 MemoryMiddleware 接入,非死代码 |
| 2026-04-01 | DEAD-03 | OPEN → FALSE_POSITIVE | V10 确认: GrowthTracker 已通过 GrowthIntegration 桥接接入,非死代码 |
| 2026-04-01 | - | V10 审计更新 | DEAD-01/02/03 确认为误报 |
| 2026-04-02 | BREAK-02 | OPEN → CLOSED | V11 确认: MemoryMiddleware.after_completion 正常触发记忆提取,非断链 |
| 2026-04-02 | BREAK-03 | OPEN → CLOSED | V11 确认: approval_respond 自动 spawn tokio task 执行 Hand非断链 |
| 2026-04-02 | BREAK-04 | OPEN → CLOSED | V11 确认: pipeline-complete 在 discovery.rs:165 emit前端有监听器 |
| 2026-04-02 | IFACE-01 | OPEN → CONFIRMED_P1 | trigger_update 前端发嵌套 updates 对象Rust 期望扁平参数,更新静默失败 |
| 2026-04-02 | - | V11 全面审计 | 22 项新发现3 P1 + 6 P2 + 8 P3 + 5 P43 项 V10 关闭 |
| 2026-04-04 | M11-02 | OPEN → FIXED | generation/mod.rs Stage 1/2 LLM 调用添加 map_err 上下文描述 |
| 2026-04-04 | SEC2-P1-01 | OPEN → FALSE_POSITIVE | FactStore trait 已在先前清理中移除值类型保留TRUTH.md 已标记 FIXED |
| 2026-04-04 | V11-P1-03 | OPEN → FALSE_POSITIVE | telemetry_reports/key_usage_window 有活跃 JOIN 读取prompt_sync_status 写无读降级为 P3 |
| 2026-04-04 | M4-04 深层 | AUDITED → WONTFIX | 4 层防御深度评估Tauri 命令层已阻断手动触发scheduler bypass 有意设计 |
---
## V11 新增发现项 (2026-04-02)
### P1: 严重级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P1-01 | trigger_update 参数嵌套导致更新失败 | **IN_PROGRESS** | 修复前端(扁平参数) |
| V11-P1-02 | SaaS 配置同步不传播到 Rust Kernel | **IN_PROGRESS** | 立即修复完整链路 |
| V11-P1-03 | 3 个 SQL 表零读取 (prompt_sync_status, telemetry_reports, key_usage_window) | **FALSE_POSITIVE** | telemetry_reports/key_usage_window 有活跃 JOIN 读取prompt_sync_status 写无读(降级为 P3需接通 get_sync_status 路由) |
### P2: 高优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P2-01 | saas-admin.ts 30 方法零消费者 | OPEN | grep 方法名在 desktop/src/ |
| V11-P2-02 | 7 个 Role/Permission 路由无前端消费者 | OPEN | admin-v2 无 roles service |
| V11-P2-03 | deprecated gateway-storage sync 方法仍被生产代码调用 | OPEN | gateway-client.ts:44,71,211 |
| V11-P2-04 | ToolDefinition 在 types 和 runtime 重复定义 | OPEN | 比较两个定义 |
| V11-P2-05 | 62 个 Tauri 命令无前端调用 | OPEN | 逐一 grep invoke 调用 |
| V11-P2-06 | migration SQL 查询缺少 LIMIT | OPEN | 检查 config_items SELECT |
### P3: 中优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P3-01 | audit-logger.ts 导出但零 import | OPEN | grep "from.*audit-logger" |
| V11-P3-02 | OFP 能力定义无消费者 | OPEN | grep OfpDiscover |
| V11-P3-03 | extract_structured_facts() deprecated 未移除 | OPEN | grep 调用者 |
| V11-P3-04 | SaaS knowledge 3 个 handler 返回空数据 | OPEN | admin-v2 Knowledge 测试 |
| V11-P3-05 | Director 912 行 feature-gated 未启用 | OPEN | Cargo.toml 检查 |
| V11-P3-06 | 定时任务执行结果未持久化 | OPEN | scheduled_tasks schema |
| V11-P3-07 | secure-storage sync deprecated 零调用 | OPEN | grep 调用者 |
| V11-P3-08 | config 2 个预留参数未消费 | OPEN | grep batch_window_ms |
### P4: 低优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P4-01 | ContentBlock 4 处定义(不同域) | OPEN | 比较各定义用途 |
| V11-P4-02 | Desktop ↔ Admin 13+ 类型名称不一致 | OPEN | 比对类型文件 |
| V11-P4-03 | 文档数字不一致 (Skills 76 vs 66/75/77) | OPEN | ls skills/ |
| V11-P4-04 | A2A/WASM feature-gated 未启用 | OPEN | Cargo.toml 检查 |
| V11-P4-05 | embedding 生成已禁用 | OPEN | generate_embedding.rs:92 |
---
## 深度二次审计新增发现 (2026-04-02)
### P0: 阻断级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P0-01 | skill_execute 空 context 反序列化崩溃 | **FIXED** | kernel-skills.ts — 填充空 context 字段 |
| SEC2-P0-02 | TaskTool::default() 调用 unimplemented!() | **FIXED** | task.rs — 移除 Default impl |
### P1: 严重级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P1-01 | FactStore trait 定义但全 workspace 无 impl | **FALSE_POSITIVE** | trait 已移除值类型保留AUDIT_TRACKER 未同步 |
| SEC2-P1-02 | agent-templates API 缺少 /api/v1 前缀 → 404 | **FIXED** | saas-client.ts — 添加 /api/v1 前缀 |
| SEC2-P1-03 | hand-execution-complete 无前端 listener| **FIXED** | kernel-hands.ts — 添加 onHandExecutionComplete listener |
| SEC2-P1-04 | InMemoryStorage 6 处 RwLock unwrap() 级联 panic | **FIXED** | viking_adapter.rs — 替换为 expect() |
| SEC2-P1-05 | HandRun 持久化错误 3 处静默忽略 | **FIXED** | approvals.rs — 添加 tracing::warn 日志 |
| SEC2-P1-06 | FTS 索引更新失败 3 处静默忽略 | **FIXED** | sqlite.rs — 添加 tracing::warn 日志 |
| SEC2-P1-07 | Worker dispatch 失败 4 处静默忽略 | **FIXED** | knowledge/handlers.rs — 替换为 if let Err 日志 |
| SEC2-P1-08 | Desktop 前端零测试覆盖 | OPEN | ls desktop/src/**/*.test.* |
| SEC2-P1-09 | record_key_usage 错误忽略 → 计费数据丢失 | **FIXED** | relay/service.rs — 添加 tracing::warn 日志 |
### P2: 高优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P2-01 | hmac/sha1 unused deps in zclaw-hands | **FIXED** | Cargo.toml — 移除 unused deps |
| SEC2-P2-02 | serde_yaml 版本不一致 (desktop 0.9 vs pipeline 2) | **N/A** | 仅 zclaw-pipeline 使用 serde_yaml_bw v2无不一致 |
| SEC2-P2-03 | sqlx-postgres v0.7.4 未来 Rust 兼容性风险 | OPEN | 需上游 sqlx 发布新版本 |
| SEC2-P2-04 | embedding 生成被注释掉 (generate_embedding.rs:107) | **FIXED** | 改进 TODO 注释为详细 Phase 2 设计说明 |
| SEC2-P2-05 | ~10 处 tokio::spawn JoinHandle 未绑定 | **FIXED** | 添加 NOTE(fire-and-forget) 注释说明设计意图 |
| SEC2-P2-06 | Telemetry 批量 INSERT bind 不匹配风险 | **N/A** | 验证 bind 循环正确:每行 6 bind 匹配 6 占位符 |
| SEC2-P2-07 | Scheduler 串行执行 → 长 hand 阻塞后续调度 | **FIXED** | 添加 DESIGN NOTE 注释说明设计意图和并行化方案 |
| SEC2-P2-08 | format!("FROM {}", table) SQL 模式违反防御原则 | **FIXED** | 添加表名白名单常量 + 字符验证防御检查 |
| SEC2-P2-09 | hand_run_status 多传 handName 参数 | **FIXED** | kernel-hands.ts — 移除多余参数 |
| SEC2-P2-10 | kernel_apply_saas_config TOML 多行值 edge case | **FIXED** | lifecycle.rs — 添加三引号多行值支持 |
### P3: 中优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P3-01 | A2A Router 4 RwLock 锁顺序未文档化 | OPEN | a2a.rs:239-245 |
| SEC2-P3-02 | Admin Role 类型轻微不一致 (is_system) | OPEN | 比对 types/index.ts vs role/types.rs |
| SEC2-P3-03 | Admin Billing/Knowledge/Roles 页面缺测试 | OPEN | ls admin-v2/tests/pages/ |
---
## 二次审计状态变更日志
| 日期 | ID | 变更 | 备注 |
|------|-----|------|------|
| 2026-04-02 | SEC2-P0-01 | NEW | skill_execute 空 context 反序列化崩溃 |
| 2026-04-02 | SEC2-P0-02 | NEW | TaskTool::default() unimplemented!() |
| 2026-04-02 | SEC2-P1-01 | NEW | FactStore trait 零实现 |
| 2026-04-02 | SEC2-P1-02 | NEW | agent-templates API 路径缺 /api/v1 |
| 2026-04-02 | SEC2-P1-03 | NEW | hand-execution-complete 无前端 listener |
| 2026-04-02 | SEC2-P1-04 | NEW | InMemoryStorage RwLock unwrap 级联 panic |
| 2026-04-02 | SEC2-P1-05 | NEW | HandRun 持久化 3 处静默忽略 |
| 2026-04-02 | SEC2-P1-06 | NEW | FTS 索引 3 处静默忽略 |
| 2026-04-02 | SEC2-P1-07 | NEW | Worker dispatch 4 处静默忽略 |
| 2026-04-02 | SEC2-P1-08 | NEW | Desktop 前端零测试 |
| 2026-04-02 | SEC2-P1-09 | NEW | record_key_usage 错误忽略 |
| 2026-04-02 | SEC2-P2-01~10 | NEW | 10 项 P2 发现 |
| 2026-04-02 | SEC2-P3-01~03 | NEW | 3 项 P3 发现 |
| 2026-04-02 | - | 深度二次审计 | 5 维并行审计24 项新发现 |
| 2026-04-02 | AUD3-FE-01 | NEW → FIXED | chatStore.sendMessage 添加 isStreaming store 级互斥检查 |
| 2026-04-02 | AUD3-FE-02/API-01 | NEW → FIXED | SaaSClient 添加 refreshMutex() 共享 Promise 并发锁 |
## 第三轮审计新增发现 (2026-04-02)
### HIGH: 严重级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| AUD3-FE-01 | chatStore.sendMessage 无并发保护 | **FIXED** | chatStore.ts — 添加 isStreaming store 级 guard |
| AUD3-FE-02/API-01 | SaaS token refresh 无并发锁 | **FIXED** | saas-client.ts — refreshMutex() 共享 Promise |
### MEDIUM: 高优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| AUD3-FE-03 | initializeStores 可能调用 3 次 | OPEN | connectionStore.ts:415,589 + index.ts:99 |
| AUD3-FE-04 | window 全局变量存 interval | OPEN | App.tsx:257-258 |
| AUD3-FE-05 | 25+ 处 mixin `as any` | OPEN | gateway-heartbeat.ts 等 |
| AUD3-FE-06 | PropertyPanel 17 处 `as any` | OPEN | PropertyPanel.tsx:100-276 |
| AUD3-DB-01 | 无 down migration | OPEN | crates/zclaw-saas/migrations/ |
| AUD3-DB-02 | format! SQL 模式 | OPEN | agent_template/service.rs:136 |
| AUD3-API-02 | 前端错误处理不统一 | OPEN | desktop/src/ |
| AUD3-CONC-02 | ~15 处 fire-and-forget tokio::spawn | OPEN | main.rs, relay/handlers.rs, scheduler.rs |
### LOW: 低优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| AUD3-FE-07 | offlineStore 全局变量存储 timer | OPEN | offlineStore.ts:87-88 |
| AUD3-FE-08 | agentStore 读取中间态 | OPEN | agentStore.ts:254 |
| AUD3-FE-09 | retryAllMessages 无并发锁 | OPEN | offlineStore.ts:188-233 |
| AUD3-CONC-03 | approval polling 增加锁竞争 | OPEN | approval.rs:96 |
## 第三轮审计状态变更日志
| 日期 | ID | 变更 | 备注 |
|------|-----|------|------|
| 2026-04-02 | AUD3-FE-01 | NEW → FIXED | sendMessage 入口添加 `if (get().isStreaming) return` |
| 2026-04-02 | AUD3-FE-02/API-01 | NEW → FIXED | SaaSClient 添加 `_refreshPromise` + `refreshMutex()` 共享 Promise |
| 2026-04-02 | - | 第三轮审计 | 5 维并行审计14 项新发现2 HIGH + 8 MEDIUM + 4 LOW|
## V12 模块化端到端审计修复 (2026-04-04)
> 4 个 P0 全部修复16 个 P1 全部关闭13 FIXED + 1 WONTFIX + 2 FALSE_POSITIVE
### Batch 1: P0 + 核心 P1 修复 (`0576226`)
| M4-02 | 反思引擎 LLM 未接入 → **FIXED** | reflection_reflect 传入 Kernel driver |
| M3-01 | hand_execute 丢弃 run_id → **FIXED** | HandResult 添加 run_id 字段 |
| M5-01 | triggers 映射错误 → **FIXED** | skill-discovery.ts 使用 backend.triggers |
| M6-02 | pipeline_list 只用 v1 → **FIXED** | 先尝试 v2 再 fallback v1 |
### Batch 2: P1 连通性修复 (`6d1f2d1`)
| M4-03 | 心跳不自动启动 → **FIXED** | agent_chat_stream 自动初始化 HeartbeatEngine |
| M7-04 | refreshToken 未传 body → **FIXED** | 显式传 refresh_token + 轮换存储 |
| M7-02 | ConfigMigrationWizard PUT 用布尔值 → **FIXED** | 使用 existing.id |
### Batch 3: Hand 系统增强 (`59f660b`)
| M3-04 | max_concurrent 未实现 → **FIXED** | HandConfig 添加字段 + 全 9 个 Hand 初始化 |
| M3-05 | timeout_secs 未实现 → **FIXED** | tokio::time::timeout 包装 execute_hand |
| M2-01 | createClone 字段丢失 → **FIXED** | soul 字段透传到 kernel |
### Batch 4: 搜索 + 审批 (`985644d`)
| M4-05 | 记忆搜索用 LIKE → **FIXED** | FTS5-first + CJK LIKE fallback |
| M3-03 | browserHandStore 绕过审批 → **FIXED** | executeTemplate/executeScript 添加 canAutoExecute 检查 |
### Batch 5: 安全加固 (`619bad3`)
| M1-01 | Gemini API Key URL 泄漏 → **FIXED** | 改用 x-goog-api-key Header |
| M1-03/04 | Mutex unwrap 在 async → **FIXED** | unwrap_or_else(|e| e.into_inner()) |
| M2-08 | Agent CRUD 无验证 → **FIXED** | 空名/温度范围/max_tokens 验证 |
| M11-06 | chat message ID 冲突 → **FIXED** | crypto.randomUUID() 替代 Date.now() |
### Batch 6: 持久化 (`88172aa`)
| M11-03 | Classroom 数据内存丢失 → **FIXED** | SQLite persistence (persist.rs) + 自动保存 |
### Batch 7: 架构统一性 (`<pending>`)
| M11-03 | lib.rs 集成 persistence state 注册 → **FIXED** | Tauri setup hook + in-memory fallback |
| M3-02 | Browser Hand 双路径 → **DOCUMENTED** | Rust BrowserHand 明确标注为 schema validator + passthrough实际执行走 Tauri browser_* 命令 |
| M4-04 | 自主授权后端无强制 → **AUDITED** | execute_hand/execute_hand_with_source 添加 defense-in-depth 审计日志 |
| TYPE-01 | TS/Rust 类型不一致 → **FIXED** | AgentInfo 添加 camelCase serde + TS 补齐字段KernelStatus 对齐 baseUrl/model |
| TriggerSource | 缺少 PartialEq derive → **FIXED** | 添加 #[derive(PartialEq)] |
| SEC2-P1-01 | EXTRACTION_DRIVER OnceCell 死代码 → **DOCUMENTED** | 标注为 legacy pathKernel struct 为 active path |
### 待后续决策的 P1
| M4-04 深层 | 自主授权后端强制阻断 | **WONTFIX** | Tauri 命令层已阻断手动触发scheduler/trigger bypass 是有意设计4 层防御深度已足够 |