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

191 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 份文档。*