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 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) |
V12 模块化端到端审计修复 (2026-04-04)
4 个 P0 全部修复,16 个 P1 中 13 个已修复(3 个待后续架构决策)
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) + 自动保存 |
待后续决策的 P1
| M3-02 | Browser Hand 双路径 | OPEN | 需架构决策:移除 Rust BrowserHand 或统一路径 |
| M4-04 | 自主授权后端无强制 | OPEN | 需在 Rust middleware 层加授权检查 |
| M11-03 相关 | lib.rs 集成 persistence state 注册 | IN_PROGRESS | 需 Tauri setup hook 完成 |