汇总功能线/三仓内部/外围子系统/全路由鉴权/Swarm周边/跨仓一致性六维度审计, 列 Top 安全Critical(IDOR/SSRF/无鉴权/明文密钥)与链路阻断项,附置信度与分轨处置建议。
15 KiB
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_managementRuntime 或 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)、/v1relay、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. 按主题归纳的“系统性病灶”
- 默认不安全:客户端本地 server、Swarm 遗留 API、Manager 回调三处都有“某条件完全免鉴权”的默认/开关。
- 凭证两张皮 + 明文落盘:Manager 建好 grant/lease/KV,Agent 用全局 GIT_TOKEN;Win 私钥、IM 密钥、legacy apiKey 明文存且可被读出。
- 越权与 SSRF 成片:Manager MJ图片/artifact IDOR + 3 个 SSRF 入口;客户端开放转发;Swarm 回调 SSRF。
- 契约无单一权威:完成/交付物/状态/模型/事件名/路由前缀各处各写(详见《需要统一定义的标准清单》)。
- 客户端没接新后端:Manager 大改 unified API + display_status,客户端仍走废弃路径、不读裁决字段 → 后端修复白费。
- 执行层空心:角色无差异、Reviewer/Test/Deploy 占位、资源不注入执行、企业指标硬编码 0。
- 死代码/实验代码遍地:checkpoint、Rust device_crypto、CockpitView、desktop-client、proactive/daemon stub。
- 跨仓版本/命名/文档失同步:版本号、模型名、回调路径、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 份文档。