威胁建模、扫描、分类、修补的技能,外加一个可自行/customize的自主扫描工具集
一个基于我们与多个组织的安全团队合作的经验,使用 Claude 进行自主漏洞发现与修复的参考实现。关于这些经验及最佳实践的详细说明,请参阅随附博客文章(也可在 blog-post.md 中找到)。如需仅使用 SDK 的轻量级相同 recon → find → triage → report → patch 循环指南,请参阅配套食谱。
本仓库不被维护且不接受贡献。
🔒 需要托管方案? Anthropic 提供 Claude Security,一个托管产品, 可在多个项目中查找并修复源代码中的漏洞。Claude Security 扫描您的仓库以发现漏洞, 应用多阶段验证流程以减少误报,并允许您管理发现的整个生命周期:分类、修复验证 和快速修复生成。
本仓库是一个基于使用 Claude 查找漏洞的通用最佳实践的开源参考实现。您可以使用它 构建自己的漏洞发现管道,自定义逻辑,并且可以与您拥有的任何 Claude API 访问方式 一起使用(包括 Bedrock、Vertex 或 Azure)。
/quickstart、/threat-model、/vuln-scan、
/triage、/patch、/customize:交互式范围界定、扫描、分类
和修补。在 Claude Code 中打开此仓库并运行 /quickstart 以熟悉环境。harness/:自主参考管道(recon → find → verify → report → patch),
配置为使用 Docker 和 ASAN 查找 C/C++ 内存漏洞。此框架是参考,而非产品。
通用结构、提示和沙箱可重复使用,但该框架并非开箱即用于所有代码库。运行 /customize
以将其移植到您的语言、检测器或漏洞类别。⚠️ 安全性:
/quickstart、/threat-model、/vuln-scan和/triage仅读取和写入文件。对静态发现结果(TRIAGE.json或VULN-FINDINGS.json)运行/patch同样是只读和只写操作。/customize编辑 框架代码并运行验证命令。只要您在 Claude Code 中审查并批准每次工具使用,这些技能 都可以在无沙箱环境下安全运行。 自主参考管道(包括对管道结果运行/patch)会执行目标代码,因此除非显式覆盖, 否则它会拒绝在 gVisor 沙箱之外运行。要进行设置,请运行一次scripts/setup_sandbox.sh, 然后通过bin/vp-sandboxed调用管道。更多详情请参阅 docs/security.md 和 docs/agent-sandbox.md。
git clone https://github.com/anthropics/defending-code-reference-harness
cd defending-code-reference-harness
claude
# 30秒入门 + 在 canary 目标上引导首次运行
> /quickstart
> /quickstart how do I port the pipeline to Java?
> /quickstart how do I triage all these bugs?
与我们合作的最成功的安全团队是那些最快速动手实践的团队。尽管很容易花费数月设计完美管道,但我们建议从第一天开始小规模尝试,并在学习过程中逐步构建。以下步骤遵循这一模式,并根据我们所见设定了一个雄心勃勃(但合理)的节奏。
第 1 天的重点是端到端查看整个循环。仅使用交互式技能,您将构建威胁模型、运行按此模型限定的静态扫描、对返回结果进行分类,并草拟候选修复。您将在当天结束时获得威胁模型、静态发现排名列表和候选补丁。
相关技能仅读取和写入您仓库中的文件。只要您以交互方式运行 Claude Code 并批准每次工具使用,则无需沙箱。
# 将每个子代理固定到您想要的模型
export CLAUDE_CODE_SUBAGENT_MODEL=<model-id>
claude
# 0. 介绍 + 引导首次运行
> /quickstart
# 1. 构建威胁模型(先瞄准再射击)
> /threat-model bootstrap targets/canary
# 2. 运行静态扫描,按该威胁模型限定范围
> /vuln-scan targets/canary
# 3. 验证、去重并对返回结果进行排序
> /triage targets/canary/VULN-FINDINGS.json
# 4. 为已验证的发现生成候选修复方案
> /patch ./TRIAGE.json --repo targets/canary
此流程产生 THREAT_MODEL.md、VULN-FINDINGS.{json,md}、TRIAGE.{json,md} 和 PATCHES/。
步骤 1 中产生的漏洞候选来自 Claude 对源代码的静态审查(未构建或运行任何内容),因此在对非 canary 目标时预期会有更多误报。在步骤 2 中,您将产生经执行验证的发现。
注意: 在 canary 目标上,
/triage可能会将扫描结果视为误报而丢弃。entry.c声明自己是故意存在漏洞的演示代码,/triage正确排除了测试/固定代码中的错误。要查看完整的确认/去重/误报流程,请在精心策划的固定数据上运行它(/triage .claude/skills/triage/fixtures/canary-findings.json --repo targets/canary)或将步骤 1 技能指向您自己的代码。
在第 2 天,您将从交互式技能转向使用参考管道进行首次自主运行。您将在您的环境中对已知存在漏洞的开源库运行完整的 recon → find → verify → report 循环,然后为其发现的漏洞生成候选补丁。您将获得一组可重现的崩溃、可利用性报告和候选补丁,同时了解管道的工作原理。
运行管道很简单:
# 一次性设置
python3 -m venv .venv && .venv/bin/pip install -e .
./scripts/setup_sandbox.sh # 安装 gVisor、构建代理镜像并验证隔离;注意:需要 Docker
export ANTHROPIC_API_KEY=sk-ant-... # 或 CLAUDE_CODE_OAUTH_TOKEN,或 Bedrock — 参见 docs/agent-sandbox.md
# 运行 recon → find → verify → report 循环
bin/vp-sandboxed run drlibs --model <model-id> --runs 3 --parallel --stream --auto-focus
# 为每个发现生成候选补丁
bin/vp-sandboxed patch results/drlibs/<timestamp>/ --model <model-id>
# 或者,让 Claude Code 启动管道并为您监控运行
claude
> run the pipeline on drlibs and explain findings as they come
循环结果将保存在 results/drlibs/<timestamp>/ 目录中。使用 --stream 标志,第一份报告将在几分钟内出现在 reports/bug_NN/ 下。
⚠️
run会生成自主代理。 管道在 gVisor 容器内运行每个代理,出站流量仅限于 Claude API。除非显式覆盖,否则生成代理的子命令拒绝在容器外启动。更多信息请参阅 docs/security.md 和 docs/agent-sandbox.md。
在底层,管道经历七个阶段:
Dockerfile 自动构建此镜像。--auto-focus 标志,管道将使用目标 config.yaml 中的 focus_areas 列表。更多详情请参见 docs/pipeline.md。
在第 3-5 天,您将为自己的目标自定义框架。首先,将步骤 1 的技能指向您的代码,然后使用 /customize 将管道移植到您的技术栈。到本周末,您将拥有一个管道可以运行的 targets/<your-service>/ 目录,通过一次管道烟雾测试验证,并准备好在步骤 4 中扩展。
虽然参考管道设计用于查找 C 和 C++ 代码中的内存漏洞,但其结构是通用的。将其移植到新的漏洞类别或语言只需为您的目标技术栈回答以下问题:
| 问题 | C/C++ 参考 | 您的目标(示例) |
|---|---|---|
| 什么信号表示发现了漏洞? | ASAN 崩溃签名 | 异常 / 金丝雀文件 / DNS 回调 |
| 概念验证是什么样的? | 导致崩溃的输入文件 | HTTP 请求序列 / tx 列表 / 测试框架 |
| 目标如何构建和运行? |
在自定义之前,先将步骤 1 的技能指向您自己的代码。提醒一下,它们是只读和只写操作,因此可以无沙箱运行。
claude
> /quickstart how do I customize this for ~/code/my-service?
> /threat-model bootstrap-then-interview ~/code/my-service
> /vuln-scan ~/code/my-service
> /triage ~/code/my-service/VULN-FINDINGS.json --repo ~/code/my-service
然后,在 /customize 技能中使用这些技能产生的工作成果,该技能会修改框架以适应您的代码库。
> /customize use ~/code/my-service/{THREAT_MODEL.md,VULN-FINDINGS.json} and ./TRIAGE.md
当 /customize 完成后,您将拥有一个设置好的 targets/my-service/ 目录。在扩展之前,通过一次管道烟雾测试进行验证。
bin/vp-sandboxed run my-service --model <model-id> --runs 1
更多详情请参见 docs/customizing.md。
在第 2 周,您将在自己的目标上使用步骤 3 中自定义的管道,为内部管道循环添加一个外部循环——运行多次管道扫描、对来自这些运行的发现进行跨次分类、基于优先级进行修补,然后重复。
# 扫描 - 对您的目标运行一波并行运行
bin/vp-sandboxed run my-service --model <model-id> --runs 5 --parallel --stream --auto-focus
# 分类 - 使用您的威胁模型对所有波次中的每个发现进行去重和排序
> /triage results/my-service/ --repo ~/code/my-service --auto --votes 5
# 修补 - 生成并验证修复,从分类排名最高的开始
> /patch results/my-service/<timestamp>/ --model <model-id>
⚠️ 遵循与 步骤 2 中相同的沙箱指南。
给定的管道运行已经验证并对其自身发现进行了去重。/triage 跨多次管道运行工作。当指向 results/ 目录时,它会折叠所有运行中的重复项(以及来自 /vuln-scan 的任何静态发现,如果有),根据您的威胁模型重新校准严重性评级,并尝试将每个发现路由到组件所有者。
如果可能,快速修补发现有助于保持外部循环尽可能高效。当发现被修复后,模型无法重新发现它们,而是会浮现出全新的、通常更深层的问题。当您运行更多管道波次时,发现数量可能会减少,但复杂性也可能会增加。如果快速修补不可行,即使只是将先前的发现记录在目标的 known_bugs 中,也能帮助引导未来的运行转向更新颖的错误。
自主分类和修补仍然是开放性议题,本参考框架并未完全解决它们。/patch 中的验证策略有助于提高标准,但严重性和优先级最终是关于您环境的判断,且经过验证的补丁不一定能向上游提交。许多合作伙伴报告这些步骤是当前的瓶颈,您应该为此分配实际的工程时间。
更多详情请参见 docs/triage.md 和 docs/patching.md。
在初始提升阶段之后,与我们合作的团队往往会在以下几个方向上投入精力:
| 步骤 1 | 第 1 天 | 构建威胁模型并运行首次静态扫描 + 分类 |
| 步骤 2 | 第 2 天 | 在 C/C++ 库上运行参考管道 |
| 步骤 3 | 第 3-5 天 | 为您的目标自定义管道 |
| 步骤 4 | 第 2 周 | 开始自主扫描、分类和修补 |
Dockerfile(使用 clang + ASAN) |
| 您的语言在容器中的构建方式 |