title: 让智能体审计你的后端:100 个智能体查 261 个接口,留下 149 条经得起反驳的发现(作者自述,公开 PR 可核)
category: 编程搭建
score: 82
status: 已实现(作者自述,PR 与运行记录公开;金额为按官方价目折算,非实际账单)
source_author: mewset(作者博客 githero.dev 署名 @mewset;个人全名未给出)
source_url: https://githero.dev/blog/claude-100-agents-audit
source_date: 2026-10-16(审计 2026-10-14 至 15 日,修复 15 至 16 日;博文日期以原文页脚口径为准,发布前补核)
tools: [Claude Code 工作流, Fable 5.1, Opus 5.5]
cost: 按 API 价目折算约 $467(审计约 $295 + 修复约 $172);作者实际用 Claude Max 5x 订阅,未产生该笔账单;超过 $50/月,须显眼标注
time_needed: 照做一次缩小版审计约半天;全量版作者用了约 2.5 天 + 26 小时修复
---
速览卡
- 分类:编程搭建
- 结果:261 个接口被审,149 条发现通过“反驳”环节(1 高 / 30 中 / 76 低 / 42 信息,另 33 个死接口),随后 29 个 PR 合并(已实现,作者自述,PR 数字来自 GitHub 记录)
- 状态:已实现(作者自述,未经审计);成本 $467 为按价目折算、非已付账单,同屏标注
- 成本:约 $467 折算(显眼标注:重度用法,第一晚就用掉 Max 周额度的 96%)
- 耗时:审计两段共约 6 小时墙钟(受本机 4 核并发上限拖慢),修复 26 小时
一句话
一个独立开发者让 Claude 自己写了一套多智能体审计工作流:审的人、专职反驳的人、找漏的人分工,最后每条发现都要拿出代码路径证据才算数。
原作者怎么做的
- 先小后大:10 月 3 日先用 5 个智能体清
lib/(约 380 行死代码、3 个导入 bug、5 个 PR);10 月 10 日加一层“验证者专职反驳审查者”,10 个智能体约 27 分钟,两个安全问题恰恰是验证者发现的。 - 10 月 13 日深夜只说了一句“run a workflow, no limit”,Claude 自己写了约 400 行 JavaScript 工作流:13 个分区审查者(每人填一张接口矩阵:登录怎么查、权限怎么查、订阅怎么查、用的哪个数据库客户端)、6 个横切清扫者(只盯一个问题,如“所有绕过行级安全的 service role 用法”)。
- 每条审查结论配一个验证者,任务是独立重读代码、尽量推翻它;中高危安全发现再配两个“怀疑者”,分别用复现与可达性两种视角,不确定就判推翻——存活规则是两个怀疑者都推翻才作废。16 条严重发现走了 32 次怀疑者运行,0 条被推翻、若干条被降级;验证者自己还补了 42 条发现。
- 覆盖率不用模型数:一段普通代码先核对 261 个接口是否每个都进了某张矩阵,结果 0 遗漏;再让一个“批评者”专找没人看透的流程,提出 5 个缺口,每个缺口重新走审查→验证→怀疑全链。
- 中途批评者发现本地数据库是从生产转储建的、权限比生产宽,本地“证明”不可信;工作流改到只由迁移脚本构建的 staging 环境复证(27 条中高危逐条复证,测试事务全部回滚),并把“本地权限证明不算数”写回提示词后断点续跑。
- 唯一的高危是真的且已上线:管理后台在布局层查管理员 cookie,但 Next.js 16 里布局与页面并行渲染,未登录者拿到跳转的同时已经收到了管理数据。Claude 先在生产复核、写修复与测试(1,216 个测试全跑)、在 staging 验完每个管理页,然后停下来等人说“push”才上线。
- 修复阶段作者给了总授权:每个 PR 必须先证明 bug 在主干存在、修复分支消失(如脚本主干 0/9、分支 9/9),本地 + staging 双验后才合并,碰到需要人拍板的 14 个决定与 Stripe 相关 PR 一律停下。
结果
- 发现:149 条存活(已实现,作者自述;计数来自工作流运行、审计报告与 GitHub),另 2 条被推翻、33 个死接口
- 修复:29 个 PR 在约 26 小时内合并,+7,924 / −3,853 行(已实现,作者自述)
- 成本:总 token 折算约 $467,其中缓存读取超 10 亿 token;作者明示若按普通输入价计,仅缓存读取一项就约 $4,500——这个数是反事实折算,不是节省,同屏标注
- 缩小版复用:同一形状用在另一个小项目(Rust 后端启动性能),5 个智能体 72 分钟出 33 个候选,冷启动窗口显示约 792ms → 约 351ms(作者自测)
提示词结构
(按原文的威胁模型与证据规则还原,非原文提示词;原文提示词由瑞典语译出)
```
威胁模型(每个智能体开头必带):
导出的 server 函数 = 公开接口,任何人可直接调用;[绕过行级安全的密钥]每次使用前必须自查权限;
[付费门]之外的路径、时区差异、[项目规则文件]里的不变量,逐条核对。
证据规则:一条发现必须给出 文件:行号 + 具体场景(谁用什么参数调用、发生什么);
给不出代码路径的猜测不算数,宁少勿滥。
验证者:你的任务是推翻下面每条发现,独立重读代码;不确定就判推翻。
怀疑者视角 A(复现):写出确切调用并实际跑;跑不出来 = 推翻。
怀疑者视角 B(可达性):找让它无害的保护(策略/触发器/约束/上游检查);找到 = 推翻。
```
中国读者怎么迁移
国内用 Claude Code / Codex / 通义灵码等都能搬这套形状,值钱的不是“100 个”这个数字,是三件小事:给每个审查者一张要填的矩阵表、给每条结论配一个专职反驳者、覆盖率用普通代码数不用模型数。先在自己一个小仓库用 5 个智能体的缩小版跑一遍(作者的小项目版 72 分钟出结果),别一上来全仓审计。
风险与限制
- 成本显眼标注:全量版折算约 $467 且吃满订阅周额度,属重度用法;读者先跑缩小版估单价,超过 $50/月必须有预算闸门。
- 作者只有 handle 署名(@mewset),个人全名未给出——按本站博客署名先例(Devaland 等)列入推荐,但发布前如能补到实名应补。
- 单人小项目口径:接口 261 个、付费客户真实存在,但规模远非大厂后端;149 条里 76 条是低危、42 条是信息项,不要把总数读成“149 个大 bug”。
- 安全细节作者故意略去:高危的成因讲了,完整利用路径未公开,复现时以自己项目为准。
- 与已发布 Anthropic 代码评审、GitLab Duo 五智能体的区别:那两条是评审/流水线分工,本条是“审计 + 对抗验证”的证据链,分工对象与产出都不同,编辑部按门槛 5 判定不重复。
原文链接
https://githero.dev/blog/claude-100-agents-audit