Files
heicodedebug/chek/2026-06-02_全盘审计总报告.md
xiaohei 4e5571e352 docs: add 2026-06-02 全盘审计总报告(6维度合成)
汇总功能线/三仓内部/外围子系统/全路由鉴权/Swarm周边/跨仓一致性六维度审计,
列 Top 安全Critical(IDOR/SSRF/无鉴权/明文密钥)与链路阻断项,附置信度与分轨处置建议。
2026-06-02 19:45:24 +08:00

15 KiB
Raw Permalink Blame History

Heicode 全盘审计总报告

日期:2026-06-02 范围:heicode-mananger、HeiCode-Swarm、heicode-macos-release、heicode-winos-release 方法:6 个维度交叉审计——功能线逐跳对账 / 三仓内部代码审计 / 外围子系统 / 全路由鉴权矩阵 / Swarm周边 / 跨仓一致性 性质:只读代码核查 + 多轮子代理;标注置信度,跨 Runtime/运行时项标 ⬜ 需实跑确认。 关联(同目录):2026-06-01_Heicode全链路代码评审报告.md、2026-06-01_需要统一定义的标准清单.md、2026-06-02_产品维度复审-能力覆盖度.md、2026-06-02_功能线总问题台账.md


0. 总判断

后端控制面 / API 契约 / 鉴权框架成熟;执行层、客户端接线、安全加固、跨仓一致性大面积欠账。 产品叙事(全 SDLC AI 团队 + 蜂群 + 企业治理)显著超前于代码现实(单 Agent 写文件 + 控制面记录)。 最危险的不是“功能没做完”,而是多处“默认不安全”+ 凭证明文 + IDOR/SSRF + 客户端打废弃路由——这些上线即暴露。

置信度图例:⬛代码实证 / ◧子代理+抽查 / ⬜需实跑确认 严重度:🔴Critical / 🟠High / 🟡Medium / ⚪Low


1. 审计维度与覆盖

维度 内容 状态
D1 功能线逐跳 F1登录·F2 Sub·F3蜂群·F4凭证·F5产物·F6计费·F7客户端·F8鲁棒·F9驾驶舱 ✅ 见《功能线总问题台账》
D2 三仓内部 并发/异常/安全/死代码/测试 ✅ 本报告 §3
D3 外围子系统 adapters/skills/MCP/cron/computer-use/coordinator/daemon ✅ 本报告 §4
D4 全路由鉴权 Manager 路由穷举 + 鉴权矩阵 + IDOR/SSRF ✅ 本报告 §5
D5 Swarm周边 desktop-client/scripts/Redis模型/Docker ✅ 本报告 §6
D6 跨仓一致性 文档vs代码/契约两端/版本/命名/迁移 ✅ 本报告 §7

2. 最高优先级总清单(跨维度 Top 风险)

🔴 安全 Critical(上线即暴露)

编号 仓 问题 证据 置信
S1 客户端 本地 Bun server 默认无鉴权,本机任意进程可控制 /api//proxy//ws(列会话、读消息、改配置、注入消息、切 bypassPermissions) src/server/index.ts:64-78、middleware/auth.ts:8-30 ⬛
S2 客户端 Windows 设备私钥+device-bound sk 明文写 ~/.claude/.credentials.json(注释谎称 encrypted);Rust OS keychain 路径未被调用 secureStorage/index.ts:11-21、device_crypto.rs(零引用) ⬛
S3 Manager 未鉴权 MJ 图片 IDOR:GET /mj/image/:id 注册在 TokenAuth 之前,handler 无 user_id 过滤,枚举 id 拉他人图 registerMjRouterGroup;GetByOnlyMJId ⬛
S4 Manager artifact revision 读/写 IDOR:只校验 deployment 归属,不校验 artifact_id 属于该 deployment heicode_artifact_edits.go:49-163 ⬛
S5 Manager 回调可关鉴权:AGENT_CALLBACK_AUTH_DISABLED=true 完全开放,可伪造状态/产物/审批 agent_callback.go:130-132 ⬛
S6 Manager /api/heicode-auth/* 开放代理 + SSRF:可无登录、路径拼接 ../ 越路径打 APIM host heicode_auth_proxy.go:20-67 ⬛
S7 Swarm 遗留 REST/WS 完全无鉴权:/tasks、/agents、/handoffs、/ws/{agent_id} 可冒充 agent、读任务上下文、建任务 orchestrator/main.py:1350-1443,1462-1893 ⬛
S8 Swarm 回调 SSRF:callback.url 来自请求,向任意 URL POST,无私网拦截 swarm_runtime.py:451-493 ⬛
S9 Swarm Runtime token 未配置 → 整段 API insecure dev mode(仅 warning 一次) main.py:313-326 ◧
S10 客户端 proxy 对第三方 provider 开放 Bearer 转发(本地 SSRF+凭证滥用);GET /api/providers 明文返回 legacy apiKey proxy/handler.ts:557-594、api/providers.ts:83-85 ⬛

🔴 链路阻断 Critical(功能直接坏/假完成)

编号 问题 证据 置信
L1 客户端不消费 display_status → “只给方案”仍显示已完成(P1 修复对用户无效) heicodeTaskStore.ts:1226-1234 vs agent_runtime_client.go:788 ⬛
L2 客户端打废弃 /api/agnet/*,Manager 只有 /api/agent/* 无别名 → Sub/审批/产物 404 heicode-tasks.ts:231-305 vs api-router.go:510 ⬛
L3 回调路径 swarm-events(文档/env/smoke) vs runtime-events(代码) → 回调可能全丢 15 份文档/agent_sub_mode_smoke.py:106 vs api-router.go:62 ⬛
L4 macOS 首聊失败:anthropic preset 不走 V2 proxy + OAuth 下配对用空 JWT heicode-macos-release/.../providerService.ts:385-394 ◧
L5 产物双模型错位:Runtime 写真实文件,Manager 按单 markdown 解析;Swarm 无 content 路由;客户端未接 unified 产物 API task_executor.py:529 vs heicode_project_artifacts.go:92 ◧/⬜
L6 桌面无云端蜂群入口,且生产默认 SWARM_RUNTIME_ENABLED=false / ENABLE_SUBTASK_HANDOFF=false → 蜂群名存实亡 heicodeTaskStore.ts:1502、agent_control_plane.go:1267 ⬛

⚠️ L3/L5 含 caveat:生产可能跑另一套 agent_management Runtime 或 env 改了路径,必须实跑确认再定论。


3. D2 三仓内部审计

3.1 HeiCode-Swarm(Python)

  • 🔴 遗留 REST/WS 无鉴权(S7)、回调 SSRF(S8)、insecure dev mode(S9)。
  • 🟠 多处 KEYS * 全表扫描(run/task/agent/handoff);事件流 rpush 无 TTL/LTRIM → Redis 内存涨;主数据无 TTL 配 LRU 可静默丢状态。swarm_runtime.py:311、task_queue.py:437。
  • 🟠 LLM 调用 / git 子进程无超时 → agent 卡死;断线无重连直接退出。task_executor.py:313、git_operations.py:346、main.py:346。
  • 🟠 read_file 无路径校验(write 有)→ ../ 逃逸;git commit -m 未转义。task_executor.py:576,235。
  • 🟡 幂等键非原子、任务派发竞态、ConnectionManager 覆盖旧连接不 close。
  • 死代码:checkpoint_manager.py、model_tuner.py、tracing.py、select_target_agent。
  • 测试:仅 1 个 unittest + FakeRedis,掩盖 KEYS 性能与并发竞态;agent 侧无自动化测试。

3.2 heicode-mananger(Go)

  • 🔴 IDOR:artifact revision 读写(S4)、project artifact manifest/file/archive 未绑定 artifact↔deployment。
  • 🔴 回调可关鉴权(S5)、开放代理 SSRF(S6)。
  • 🟠 SSRF:KV MI token URL 可被 env 设任意地址;ARM nextLink 不校验 host。secret_store.go:158、azure_resource_discovery.go:201。
  • 🟠 计费 TOCTOU:DecreaseUserQuota 无 WHERE quota>=? → 并发可负余额;异步退款崩溃丢预扣;Settle 后 token 调整失败仍标 settled。pre_consume_quota.go:34、billing_session.go:52-122。
  • 🟠 HMAC 已配但无头时降级到全局静态 token。agent_callback.go:97。
  • 🟡 内存 map+DB 双写多实例不一致;审计 best-effort 吞错;多个弱 IDOR(approval/cloud-deploy 的 id 未交叉校验);legacy sk deadline=0 长期可绕过。
  • 死代码:GetTokenStatus 未挂路由、WssAuth 空实现。
  • 做得好:resource/grant 普遍带 user_id;用户态 deployment 有 requireAuthenticatedUserAgentDeployment;明文 secret 拒绝。

3.3 客户端(mac+win)

  • 🔴 本地 server 无鉴权(S1)、Win 私钥明文(S2)、proxy 开放转发(S10)、sidecar 崩溃不重启。
  • 🟠 /ws/{sessionId} 无 token;adapters.json 明文存 IM 密钥无 0600;providers.json 无 mode。
  • 🟡 scan-missing-imports 已覆盖真实类型文件(types.ts);mac/win proxy ~862 行 diff;CORS 不防本机非浏览器。
  • 版本漂移:win 0.5.0 / mac 0.4.17(不仅功能分叉,大版本也不齐)。

4. D3 外围子系统(客户端)

子系统 状态 关键问题
adapters(飞书/TG) 已实现 🔴 Feishu 卡片 card.action「永久允许」未校验 isAllowedUser(C2);TG inline 回调同样未校验(H1);出站图片 fetch 无 SSRF(C4);已配对 IM 用户≈本机 Agent 入口可批权限
skills 完整 🟡 技能 markdown 可触发 !/```! shell(MCP 技能已禁用);信任边界在首次调用
MCP 完整 🟠 /api/mcp 可增改 stdio MCP(command+args)→子进程执行;远程 MCP URL 无 SSRF 拦截
cron/scheduled-tasks 已实现 🟠 API 可 CRUD 全局任务、定时 spawn 完整 Agent;permissionMode 写入但执行未使用(假安全感)
computer-use 已实现 app blocklist + 审批 WS(较好)
coordinator/proactive/daemon 占位/feature gated proactive/daemon/self-hosted-runner/environment-runner/jobs.classifier 均 stub;coordinator 需 env 开
attachment 注入 — 🔴 attachment.path 原样注入 prompt 无路径约束(C3),配合 S1 可读任意本机文件

共性:IM/cron/MCP 都挂在“本机无鉴权 server”这同一信任模型上,S1 是放大器。


5. D4 Manager 全路由鉴权矩阵

  • 路由分五层:/api(公开/UserAuth/Token/Admin/Root/User|V2)、/v1 relay、dashboard、/heicode/oauth、静态前端。
  • admin/root 业务路由 group 级中间件覆盖完整,无遗漏;用户态资源普遍带 user_id 过滤。
  • 薄弱点:
    • 🔴 未鉴权 MJ 图片 IDOR(S3)、回调可关鉴权(S5)、APIM 开放代理(S6)。
    • 🟠 /api/status 信息泄露(OAuth client_id/passkey/倍率/server_address);OAuth 与 sign-in open redirect(redirect 参数无白名单);Session cookie Secure=false;TokenAuthReadOnly 不校验过期/禁用。
    • 🟡 WeChat OAuth 无 state(CSRF);/api/user/reset 返回明文密码;AGENT_SIMULATION_ENABLED 非 admin 可写模拟事件。
    • 前端:token 存 localStorage(XSS=账户接管);agent 工作台对普通用户可见(仅后端拦截)。
    • 中间件:OptionalV2DeviceAuth 非 V2 完全放行(开放代理依赖此);WssAuth 空实现。

6. D5 Swarm 周边

  • 🔴 desktop-client(Electron) = 绕过 Manager 的遗留 MVP 实验:nodeIntegration:true+contextIsolation:false(高危模板)、直连 /tasks、用 kubeconfig 直接 create/delete Pod、ORCHESTRATOR_URL 传 HTTP 而 agent 期望 ws(很可能连不上)。建议标 archived。
  • 🔴 脚本/文档硬编码公网 IP 52.139.240.116、20.212.121.126;run_swarm_poster_demo.py 默认 kubectl get secret 读真实集群 token。
  • 🟠 Redis 无 requirepass(集群内任意 Pod 可读写全量状态);task:/handoff: 存完整 context;deploy-agent.sh 经 env 写 ANTHROPIC_API_KEY。
  • 🟡 Redis 主路径无 TTL、KEYS 扫描、队列非原子;Dockerfile 无多阶段/非 root;artifacts/swarm-posters 提交了真实拓扑 ID。
  • 死代码:desktop-client 的 CostControlDialog/usage-tracker;checkpoint/model_tuner。

7. D6 跨仓一致性

级 不一致 详情
🔴 客户端 /api/agnet/* vs Manager /api/agent/* 无别名→404(L2)
🔴 客户端未接 /api/heicode/* 统一 API 文档称已闭环,客户端只走 legacy 代理
🔴 swarm-events vs runtime-events 15 份文档/env/smoke 写旧名,代码只注册新名(L3)
🔴 from-agnet vs from-agent 邮箱登录 Step2 404
🟠 Sub 烟测文档 /api/swarms vs Go 默认 /api/agent/sub-agile/deployments sub/swarm 入口混写
🟠 Manager 订阅 24 事件 vs Swarm 实际 emit phase.changed/agent.*/sk_tool.*/task.released Swarm 不发(应来自 agent_management)
🟡 版本四仓不齐:Manager 1.4.20 / 客户端 0.1.0(win0.5.0 mac0.4.17) / Swarm 1.0.0 / 文档 v0.1 无法据版本判兼容
🟡 默认模型多处冲突:代码/preset=gpt-5.4,文档示例=claude-sonnet-4-6,Swarm 默认=claude-opus-4-20250514 UI 显示 Claude 实跑 gpt
🟡 命名 agnet/agent、本地 swarm/云端 swarm 混用 沟通/排障易错
⚪ DB 迁移齐全(rename agnet→agent);legacy tenant/project 残留 非阻断

8. 按主题归纳的“系统性病灶”

  1. 默认不安全:客户端本地 server、Swarm 遗留 API、Manager 回调三处都有“某条件完全免鉴权”的默认/开关。
  2. 凭证两张皮 + 明文落盘:Manager 建好 grant/lease/KV,Agent 用全局 GIT_TOKEN;Win 私钥、IM 密钥、legacy apiKey 明文存且可被读出。
  3. 越权与 SSRF 成片:Manager MJ图片/artifact IDOR + 3 个 SSRF 入口;客户端开放转发;Swarm 回调 SSRF。
  4. 契约无单一权威:完成/交付物/状态/模型/事件名/路由前缀各处各写(详见《需要统一定义的标准清单》)。
  5. 客户端没接新后端:Manager 大改 unified API + display_status,客户端仍走废弃路径、不读裁决字段 → 后端修复白费。
  6. 执行层空心:角色无差异、Reviewer/Test/Deploy 占位、资源不注入执行、企业指标硬编码 0。
  7. 死代码/实验代码遍地:checkpoint、Rust device_crypto、CockpitView、desktop-client、proactive/daemon stub。
  8. 跨仓版本/命名/文档失同步:版本号、模型名、回调路径、agnet/agent 全线不一致。

9. 建议处置(分轨)

轨 A — 上线前必做(减法+验证,1天内)

  • 隐藏未就绪入口(蜂群/云部署/Reviewer/Test);客户端读 display_status(L1);确认 /api/agnet 是否有别名(L2);mac 暂缓只放 win(L4);核对生产默认模型可用(F1.5);真机冒烟登录→对话→正确状态。

轨 B — 安全加固(紧急,1周内)

  • 客户端 server 默认开鉴权(S1);Win 私钥移出明文(S2);MJ图片+artifact IDOR(S3/S4);禁用 AGENT_CALLBACK_AUTH_DISABLED(S5);APIM 代理加鉴权/白名单(S6);Swarm 遗留 API 加鉴权或封禁(S7);回调 SSRF 白名单(S8);Session cookie Secure。

轨 C — 契约收敛(中期)

  • 落地《需要统一定义的标准清单》8 个标准;统一 swarm-events→runtime-events、agnet→agent、模型清单、版本对齐。

轨 D — 执行层补齐(长期,结构性)

  • 角色分化、资源注入执行、Secret Broker 真派生、Deploy Worker、企业指标聚合、Swarm 原子领取/reconcile。

10. 置信度与边界

  • 多数 🔴 安全项是可直接核验的鉴权判断/文件存储事实(⬛)。
  • 跨 Runtime 路由/回调一致性(L3/L5)含“生产可能用别的 Runtime(agent_management,不在本四仓)”的 caveat,标 ⬜ 必须实跑确认。
  • 本报告为只读静态审计;可利用性、多实例竞态、生产 env 覆盖需运行时验证。
  • agent_management(Sub Agile 目标 Runtime)不在本次四仓内,相关 Sub 行为无法在仓库内完全验证。

证据均可在对应仓库 文件:行 复核。本报告汇总 6 维度审计,明细见同目录其余 4 份文档。