文章总结: 本文实测ClaudeCode配合security-auditskill对开源项目z-cmdb进行源码级安全审计。该skill通过六阶段流程与五条纪律实现可复核的审计账本,区分已确认与待验证项,并明确不替代人工审计与渗透测试。实测发现多项高危边界失败问题,但强调动态验证缺失时需降级处理,报告可信度取决于执行策略与覆盖账本的完整性。
综合评分: 82
文章分类: 代码审计,安全工具,AI安全,红队
让 Agent 给代码做安全审计,实测security-audit-skill
原创
Zer0o0n
Zer0o0n
Zer0的微观
2026年9月22日 12:00
辽宁
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
用 AI 帮忙看代码安不安全,这件事已经很常见了。真正的问题是:看完之后,你敢不敢拿着那份结果去 改生产 ?
我拿自己的开源项目当靶子,用 Claude Code 配 security-audit skill 跑了一轮完整审计,想搞清楚四件事:它 到底在干什么 、在真实项目上能 覆盖哪一段 、报告能不能信、以及能不能替代 代码审计和渗透测试 。
01
PROBLEM
让 Agent 审代码,别让它只报漏洞
让 AI 看代码,常见的翻车情况就三种。
1
它给你一份长长的清单,读起来像安全教材目录。
2
假阳性刷屏,你花半天去核对,发现大部分都是扯淡。
3
代码里只是少了一层防御,前面其实已经挡住了,它却写成「发现漏洞」。
这并不是模型笨,也不是模型不适合做审计。更常见的原因是审计 没有流程 :没有记账审了哪些模块,没有专门来证伪,也没有规定什么叫「可以确认」。最后你得到的,只是一堆 口气很硬的断言 。
「security-audit-skill 做的不是让模型更会说话,而是让它交出一份能复核、下一轮还能接着用的账本。」
我拿一个案例做测试:调度用 Claude Code,后端模型走火山方舟的 doubao-seed-evolving ,目标仓库是我的开源项目 Zer00n/z-cmdb ,一个基于 FastAPI + Vue 3 + SQLite 的 CMDB 系统。问题也很直接:它到底在干什么、怎么用、在真项目上能覆盖哪一段、报告能不能信、能不能替代人审和渗透测试。
02
MECHANISM
security-audit 是什么
这是一套 给 Agent 用的安全审计编排 。装上之后,模型不能想到哪写到哪,得按六个阶段走,并且留下 AI 也能校验的记录。
六个阶段可以看成六种分工:
1
侦察:先画架构、信任边界、入口,把「准备审哪些单元」写进覆盖账本。
2
按单元狩猎:每个单元派独立的 hunter 去找候选,另有 critic 专门挑覆盖缺口。
3
验证候选:换一个新的判断者来分真假,结果落成三类:已确认、待验证、已驳回。
4
结构化落盘:写入发现清单,并用 schema 校验格式。
5
独立核验记录:再换一个 Agent,对照源码核最终记录。过不去就改,不准将就。
6
生成报告:只从已经核过的记录派生文字,产出总报告、发现详情、待验证清单。
这套流程背后有五条纪律:
1
覆盖要记账,不能凭感觉。进度写在 coverage-ledger 里,每个单元有 planned、covered、candidate、deferred 这些状态。AI 自己觉得「我扫过了」,账本没记,就不算覆盖。
2
只有「边界已经在源码里失败」才能标成已确认。确认的最低要求是两条:能从源码追出一条路(入口到传播再到汇聚点),并且能说清影响。关键事实在部署或运行时里的,只能进待验证,还得写死「卡在哪一个外部事实」。
3
发现者 Agent 和验证者 Agent 必须分开。找到候选的 hunter,不许给自己的发现盖章;独立 verifier 的工作是尝试证伪、压假阳性。
4
严重级别必须挂上影响,大致是可能性乘影响;待验证项没有严重级别,这是刻意的。缺一层纵深防御、但上层已经挡住的,记加固说明,不升格成漏洞。
5
没有操作系统级强制沙箱,就不执行目标代码。构建、测试、起服务、对外发请求,都要求隔离。没有隔离,就只走静态源码路径,跑不完的线索停在待验证。我们在 Windows 上跑 z-cmdb 时,skill 就明确走了这条降级路线。
看到这里应该明白它在做什么了。好比某些杠精抓住一个漏洞,就开怀畅谈如何利用这个漏洞搞垮一个机构,完全不从现实角度考虑这个漏洞是不是真的能被有效利用。
03
SETUP
Claude Code + Evolving
…repo
官方仓库:https://github.com/cloudflare/security-audit-skill.git
我的汉化版:https://github.com/Zer00n/security-audit-skill.git
(Branches:docs/zh-cn-and-best-practices)
实测组合是这样的。
调度和工具调用
Claude Code 负责读仓库、派 Agent、写文件、跑校验。
后端模型
doubao-seed-evolving,官方介绍是更强的 Agent 执行能力与多模态理解,模型能够持续推进复杂任务、协同并验收异步子任务,把图片、视频和页面理解用于推理判断与实际操作,让深度调研、办公协作和长程任务的交付更稳健。
流程本体
security-audit skill 本体。
代码审计不太像「问一句、答一段」。它是多阶段、多子 Agent、要跨很多文件,还要吞下 skill 自己那一长篇说明书。模型得把 几十步工具调用跑稳 ,并且在 hunter 和 verifier 切换时,别把结论写飘。
进入 Claude Code 直接让它安装这个 skills 即可。第一次建议把 范围、档位、输出目录 写死,少让模型自己猜你要审多深。
…prompt
请用 security-audit skill 对本仓库做一次安全审计(full audit mode)。
范围:优先 backend/app(认证/JWT、权限、上传与解析、密钥与 DB 加密/keystore、配置与 CORS)。
Profile:quick
输出目录:~/audits/z-cmdb/run-1
要求:
1) 生成并校验 coverage-ledger 与 findings
2) 对抗式验证:发现者不得核验自己的候选
3) 无沙箱能力时不要执行目标代码,未决事实写入 needs_validation
4) 产出 REPORT / FINDINGS-DETAIL / NEEDS-VALIDATION
跑完后,优先看四份东西: 覆盖账本 (审了什么、故意没审什么)、 发现清单 (已确认 / 待验证 / 已驳回)、REPORT.md(态势和摘要表)、NEEDS-VALIDATION.md(卡在哪条外部事实上,并且不配严重级别)。
04
FIELD TEST
在 z-cmdb 项目上实测
| 项 | 值 |
| — | — |
| 项目 | Zer00n/z-cmdb(FastAPI + Vue 3 + SQLite CMDB) |
| 工具 | 本地 Claude Code + security-audit skill |
| 后端模型 | doubao-seed-evolving |
| Profile | quick |
| Scope | backend/app(认证、权限、上传解析、密钥/库加密、CORS/配置) |
| 主机 | Windows;没有操作系统级强制沙箱 |
| 执行策略 | 自动降级为只审源码:不执行目标代码,不发探测流量 |
在声明的范围内,它做源码级的 信任边界映射和攻击类选择 ,给多条路径写出「入口 → 传播 → 汇聚点」。用独立验证把已确认和待验证分开,在没有沙箱时,拒绝把 部署猜测 写成已确认漏洞。
没做到、也不该假装做到的,同样要写在前面:没有 动态 PoC ,没有对运行实例发请求,没有证明「某台线上机器此刻正用默认 JWT」,那是部署事实。quick 加单个 scope,不等于全仓库穷尽,账本里会有 deferred,它也不替代配置加固验收,更不替代 持授权的渗透测试 。
本轮对外能公开写的,只保留 边界失败类型和影响类型 ,不展开利用细节。
| 级别 | 边界失败类型 | 影响类型 |
| — | — | — |
| high | 未认证可读资产检索接口,并可触发持久化写入 | 机密性 + 完整性 |
| high | 初始化口令明文落在数据目录/标准输出 | 静态加密承诺被旁路 |
| medium | 字段加密主密钥与 JWT 密钥同源派生 | 密钥域未分离 |
| medium | LLM 回调地址缺少出站约束 | SSRF + 凭据外带风险 |
| medium | 上传大小限制在整包缓冲之后才生效 | 内存耗尽 / DoS 面 |
| medium | 只读角色绑定在可写业务路由上 | 授权边界失效 |
| medium | 扫描上传明文落在加密库外的 uploads | 主机/备份读取者可直接拿到 |
另外还有若干低危项,例如 登出不吊销令牌 。以及一批待验证项,例如默认密钥是否出现在真实部署、解锁时序能不能远程测到,后者在报告里 故意不配严重级别 。
05
REPORT
如何读报告
先看 执行参数 ,再看发现。好的审计报告会交代:审的是哪一版、哪个档位、哪个模型、能不能跑目标代码。这一轮可以概括成下面这份元数据。
…report
Mode: full audit · Profile: quick · Scope: backend/app
Model: doubao-seed-evolving(方舟周更通道)
Source: clean worktree on master
Execution: source-only(win32 无 OS 强制沙箱 → 不执行目标代码)
Validators: parent-side schema checks on ledger & findings
「如果一份 AI 审计报告既不写执行策略,也不写范围,却从第一页堆到 critical,一定是耍流氓。」
已确认的漏洞如下所示。
这里重要的产物有两项: 被破坏的不变式 ,以及能直接开 issue 的 最小修复 。
待验证则应该把「还差哪一个外部事实」写死。
它宁可把报告写成「需要人工确认」,也不用一个 medium 把猜测包装成结论。
06
TRUST
哪些能信,哪些必须打折
相对能站住的,通常是这几类:带着 完整源码追踪 、并且经过独立验证叙述的已确认项;写清了执行策略、模型和范围的报告元数据;已驳回记录,能让下一轮少走重复假说;以及账本里对「没覆盖」的诚实交代。
必须打折的也不少:任何没做动态验证的「可利用」措辞;把缺最佳实践、缺加固层直接写成 漏洞 ;没有写清阻塞项的待验证,那是没写完;把单次 quick 结果说成项目已全面审计;以及把模型周更后的能力波动,理解成「漏洞忽有忽无」,却不回头对源码。
比较稳的用法是四步。
1
先读总报告里的执行策略、模型和覆盖声明。
2
只把已确认项开成缺陷单,并且抽查源码追踪是否对得上。
3
待验证进观测清单,补上沙箱或预发证据后再决定升不升格。
4
修复之后,带着上一轮账本做增量再审,避免修 A 破 B。
07
BOUNDARY
它替代不了人审,也替代不了渗透测试
| 维度 | security-audit + Agent | 传统代码审计 | 渗透测试 / 红队 |
| — | — | — | — |
| 主要输入 | 源码 + 本地仓库上下文 | 源码,有时加设计文档和访谈 | 运行系统,有时加源码和配置 |
| 核心问题 | 哪些信任边界在源码上已经失败 | 设计/实现是否满足安全需求 | 授权范围内能不能实际打穿 |
| 假阳性控制 | verifier 证伪;没沙箱就降级 | 人工判断 | 以可复现利用为准 |
| 对运行时依赖 | 可选;没沙箱则不做 | 通常低 | 高 |
在安全层面,没有谁可以替代谁。Agent 先铺 覆盖账本和候选 ,人盯高危边界和业务逻辑。给渗透测试供靶点:已确认的源码路径变成优先验证点,待验证变成 上线前要看的配置项 。做回归时,修复后带着旧发现再跑一遍。
security-audit 不能代替持授权、对着真实环境的渗透测试和红队演练;不能代替人对复杂业务逻辑、欺诈路径、组织级权限模型的理解;不能代替供应链、云账号、办公网、物理和社会工程这些源码外的面;也不能代替 合规签字和风险接受 。AI 报告不是审计意见书。
「一套可重复的、源码向的安全审查引擎,模型负责把跨文件推理跑稳,skill 负责不让结论瞎写。」
传统审计补 深度和语境 ,渗透测试补 现实可利用性 ,三个叠在一起才完整。
∞
THE END
最后
security-audit 能不能用,不看它报了多少高危漏洞,而看流程是否承认: 覆盖要记账 ,判定要对抗,影响要能从源码或运行事实里证出来。动态验证做不到,就写进待验证, 不要硬编 。
以及,注意账单。
7000 万
本轮总 token 消耗
订阅 + 超出43 元
模型侧实际花费
本次测评 Z-CMDB 总计耗费大概 7000 万 token,火山方舟 Agent Plan 承担大概 4000 万,剩下 3000 万左右 doubao-seed-evolving 应该花费 43 块左右(缓存命中还可以),还好有火山的慷慨相助, 不至于爆钱包 。
END
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Zer0的微观 Zer0o0n
Zer0o0n《让 Agent 给代码做安全审计,实测security-audit-skill》