Files
zclaw_openfang/docs/features/AUDIT_TRACKER.md
iven 305984c982
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
fix(saas): P2 code quality fixes + config PATCH/PUT alignment
P2 code quality (SEC2-P2-01~10):
- P2-04: Replace vague TODO with detailed Phase 2 design note in generate_embedding.rs
- P2-05: Add NOTE(fire-and-forget) annotations to 4 long-running tokio::spawn in main.rs
- P2-07: Add DESIGN NOTE to scheduler explaining sequential execution rationale
- P2-08: Add compile-time table name whitelist + runtime char validation in db.rs
- P2-02: Verified N/A (only zclaw-pipeline uses serde_yaml_bw, no inconsistency)
- P2-06: Verified N/A (bind loop correctly matches 6-column placeholders)
- P2-03: Remains OPEN (requires upstream sqlx release)

Config HTTP method alignment (B3-4):
- Fix admin-v2 config.ts: request.patch -> request.put to match backend .put() route
- Fix backend handler doc comment: PATCH -> PUT
- Add @reserved annotations to 6 config handlers without frontend callers
2026-04-03 21:32:17 +08:00

14 KiB
Raw Blame History

ZCLAW 审计追踪表 (V10)

创建日期: 2026-03-29 审计版本: V11 + 深度二次审计 最后更新: 2026-04-02 追踪规则: 每个发现项记录状态变更,修复后需附验证方法


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 关闭

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) OPEN grep SELECT FROM 在 SaaS crate

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 OPEN grep "impl FactStore" crates/
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