# 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 份文档。*