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
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
14 KiB
14 KiB
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 P4),3 项 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) |