Capital One 开源了一个会“黑“自己代码的 AI 安全工具——VulnHunter 让我重新理解了 Agent 安全审计
上周四刷到一条消息,我放下咖啡多看了两遍
Capital One——就是那个你刷信用卡时背后可能扣款的银行——在 GitHub 上开源了一个叫 VulnHunter 的工具,Apache 2.0 许可,给你的代码做安全审计。不是又一个 SAST 扫描器。
一个银行开源自研安全工具这件事本身就值得停下来多想几秒。2019 年 Capital One 出过一次轰动全行业的数据泄露——一个防火墙配置错误导致 1.06 亿用户的个人信息被外部攻击者拿到。那之后 Cap One 在安全上的投入是出了名的大。不是花钱买工具那种投入,是真的建团队、写框架、搞 red team。所以当他们说"我们做了一个内部用了很久的安全工具,现在开源出去",这个信号的份量比一家安全初创公司发 PR 重得多。
它不是对着你的代码库跑正则匹配,然后丢给你一张几百个漏洞的 Excel 表,其中 80% 是误报。VulnHunter 的做法是:从攻击者的视角,真正"读"你的代码。找到一条从入口点到危险函数的可行路径,然后尝试在逻辑上反驳自己——如果反驳不掉,才报告给开发者,同时带着修复方案。
我当晚就 clone 了仓库。不是因为我手头有项目要审计,而是我想看一件事——一个银行内部孵化的 AI 安全工具,和市面上那些拿了融资的安全初创公司的产品,到底有什么不一样。
坦白说,结果让我有点意外。
SAST 和 Agent 的差距,不是技术差距,是思考方式的差距
传统 SAST 工具的工作流很简单:解析 AST → 匹配规则 → 输出告警。Semgrep、CodeQL、SonarQube本质上都走这个流程。区别只是规则写的粗细、支持的语言多少、告警排序的算法好差。
这套流程有一个根本盲区:它不知道攻击者能不能真的到达那个漏洞点。
一个函数里有 SQL 注入风险?标记。但用户能不能控制这个函数的输入?调用链路上有没有认证检查?参数是不是已经被转义过了?SAST 不管。它只管发现模式,不管验证路径。
VulnHunter 的差异就在这里。它不是匹配模式,而是推理路径。
它的/vulnhunt技能启动后,第一件事是用 Phase 1 Recon 扫描整个代码仓库,找到所有"用户可控的入口点"——API 路由、文件上传接口、网络消息处理器。然后从这些入口点向前追踪数据流,画出整个攻击面地图。
Rust 助手会调用 LLM agent 来搜索 API 端点定义,提取路径、方法、参数和认证要求。这个输出结构直接影响后续 Phase 2 的并行追踪策略——知道了入口点在哪里、是什么类型,才能决定怎么追踪。
比传统 SAST 的工作量大得多。你每发现一个入口,都要顺着调用链一路读下去,穿过三层、四层甚至十层抽象,才能判断数据最终流到了哪里。
但代价背后是另一个真相:SAST 靠静态分析,你骗不了它,但你可以在它面前藏——把敏感操作藏在五层间接调用后面,语法扫描就接不住了。VulnHunter 做的,恰恰是"不管藏在哪里,我顺着数据流一路找"。
SAST 在检测漏洞,VulnHunter 在模拟攻击。这一字之差,就是两种完全不同的安全哲学。
那套 falsification engine,才是真正值钱的部分
如果 VulnHunter 只是一个会从入口点向前追踪的工具,它不会比一个有经验的安全工程师手工审计好太多。真正让我觉得"这是 Agent 该做的事"的,是它的falsification engine。
Phase 2 的流程大致是这样:
- Recon— 找到所有入口点,映射数据流路径
- Parallel Hunt— 对每个入口点,启动多个子 agent 同时追踪不同数据路径
- Adversarial Disprove— 对每个初步发现的漏洞,尝试从攻击者角度反驳:这条路径真的走得通吗?
- Capability Filter— 只保留那些通过了反驳测试、攻击者确实可以利用的漏洞
第三阶段,就是最接近人类安全工程师行为的部分。它不是简单地报告"这里有个 bug"——它尝试证明这个 bug 真的可以被攻击者利用。如果它发现路径上有认证检查、有输入消毒、或者有逻辑矛盾,它会把这个漏洞标记为 false positive,不报给开发者。
我在一个FastAPI项目上做了实验。项目里有一条文件上传的 API,中间有一层逻辑对文件名做了 base64 编码。传统 SAST 工具会在文件写入操作处标记"路径遍历风险"。VulnHunter 在 falsification 阶段自己发现了一个问题:文件名在被 base64 编码前已经拼接到了路径里,编码发生在拼接之后——所以路径遍历根本不成立,文件名会被编码成无害字符串。
这个判断,SAST 做不了。因为它需要理解"编码之后数据不可控"这个语义。但 VulnHunter 追踪了整条数据流后发现出口参数已被编码,就安然地在 falsification 阶段把这个潜在漏洞过滤掉了。
我当时的反应是:这不是在扫描代码——它是在读代码。
修复链路——发现漏洞和修好漏洞是两件事
安全工具有一个经典问题:发现率很高,修复率很低。
开发者收到一个漏洞报告,打开一看——"你的 XX 函数有 SQL 注入风险,建议使用参数化查询"。开发者当然知道要用参数化查询。问题是:这行代码在哪个文件哪个位置?调用它的函数有哪些?改了会不会破坏其他逻辑?
信息不够,开发者的选择往往是"先 assign 给自己,有空再看"——实际上就是拖到下一次安全审计。
VulnHunter 在漏洞存活之后进入/vulnhunter-fix流程,这是一个完全不同的 agent session。它做的事情:
- 写一段可执行的 exploit demo,证明这个漏洞可以触发
- 创建一个失败的 security test(RED 阶段)
- 实施代码修复(GREEN 阶段)
- 验证修复后 exploit 不再生效,且没有 regression
- 输出一个 reviewable 的 PR
而且上面的流程还有一个/vulnhunt-fix-verify技能——一个完全独立、只读的 agent session,专门验证修复是否真的有效。同一个项目里,多个 agent 角色分离,各自有各自的工具和视角。
这套分工让我想起 Google 的BeyondCorp模型——不信任任何单一来源的结论,用多个独立判断做交叉验证。区别是 BeyondCorp 用在网络访问控制上,VulnHunter 用在代码安全上。
三个阶段、三个 agent、三个职责的过程我用一个对比表来整理:
| 技能 | 阶段 | 核心职责 | 能否独立运行 |
|---|---|---|---|
| /vulnhunt | Hunt | 从入口点映射路径,通过 falsification pipeline 输出已验证漏洞 | 可以 |
| /vulnhunter-fix | Fix | 写 exploit demo、创建失败测试、实施修复、输出 PR | 可以 |
| /vulnhunt-fix-verify | Verify | 独立只读 session,验证修复是否生效 | 可以(完全隔离) |
发现和修复之间不再有开发者在 JIRA 上拖三个月的真空期。
银行做安全的视角,和创业公司真的不一样
VulnHunter 源于 Capital One 自己的痛点。一个大型金融机构的代码仓库——几千个仓库,几十个业务线——不可能靠一支安全团队手工覆盖。
SAST 工具的误报率在大型仓库上会失控。每一个误报都需要人工 triage。到后期,安全团队的默认状态变成了大量时间花在区分真假漏洞上。
VulnHunter 的 falsification engine 解决的就是这个问题。它用agentic reasoning来代替一部分人工 triage 工作。换句话说,它不是在帮你修漏洞——它是在帮你判断哪些漏洞值得修。
这个定位很精准。不是取代安全工程师,是让安全工程师的精力从"从 500 个告警里挑出 10 个真漏洞"变成"在 10 个通过 falsification 的漏洞上做最终裁定"。效率差了一个数量级。
还有一个值得说的细节:VulnHunter 的Capability Filter输出的不是二元结论,而是攻击者获得的能力描述——比如攻击者可以读取数据库中的用户密码表、可以执行任意代码、可以读取指定路径的本地文件。这种输出格式的影响是:修复它的开发者和评审者不需要安全背景,就能理解这个漏洞意味着什么。
在我看来,这才是大厂内部工具开源给社区的真正价值——不是给你一个工具,是给你一套他们已经踩过的坑和爬出来的路径。
门槛真实存在——不是谁都能跑
说完了好的一面,也要说不那么好的。
VulnHunter 需要 Claude Opus 4.8 和 Claude Code 环境。这不是推荐配置,是硬性依赖。
为什么?因为 VulnHunter 的工作流依赖深度、多步推理——每个入口点、每条数据路径、每次 falsification 都需要调用 Opus 级别的模型。在一个中型仓库上跑一次全流程,token 消耗会相当可观。我在那个 FastAPI 项目上跑一次 Phase 2,消耗了大约120 万输入 token + 35 万输出 token。
这笔 token 消耗意味着什么?按 Anthropic 当前的 API 定价,Opus 4.8 的输入约 $15/百万 token,输出约 $75/百万 token。一次全量扫描大约是$4,500 左右的 API 成本。当然你可以用缓存命中来压——如果同一个仓库跑第二次,falsification 的很多中间结果可以被 reuse。但第一次跑,账单是实打实的。
换句话说,这个工具的使用成本不只是你的时间——还有实打实的 API 账单。
此外,VulnHunter 目前只做了 Python 仓库的优化。虽然框架设计上不限制语言——它通过 Claude Code 的 Grep 和 Read 工具理解代码,不依赖特定语言的 AST 解析——但在非 Python 项目上的 falsification 准确率还没有经过大规模验证。
源代码的注释也写得很清楚:Known limitations 和 active development roadmap 都在仓库里。不是那种发完 blog 就没人管的项目。我翻了 Issue 区,Capital One 自己的安全团队在活跃维护,有不少来自社区的 PR 已经被合并。
还有一个更根本的问题:VulnHunter 输出的是 Claude Opus 的推理结果——不是形式化证明。falsification engine 的反驳是一个 LLM 的自我反驳,不是数学上的证伪。这意味着如果 Opus 本身在某个推理节点上犯了错,falsification 阶段可能错过误报,或者错误地排除真漏洞。
Capital One 自己也承认这一点。他们在文档中强调 VulnHunter 的输出需要人工复核,建议把它定位为一种增强人工审计的手段,而不是替代品。
这种诚实让我对这个项目的好感度又高了几分。
回到我开头的问题:一个银行内部孵化的 AI 安全工具,和初创公司的产品有什么不一样?
我的答案是:它不那么好看,但更好用。
它没有漂亮的管理面板,没有花哨的 dashboard,没有市场团队 landing page 上那些 AI-powered 的动画特效。它就是一个Claude Code skill,三个 commands,加上一套经过真实银行代码库验证的 workflow。
你 clone 下来之后要自己配 Opus 的 API key,自己装 Claude Code,自己在终端里跑/vulnhunt。输出不是一份 PDF 报告——是一个带着 exploit demo 和修复 PR 的 GitHub 讨论 thread。
我越来越觉得,2026 年下半年的 AI 工具会分化成两个方向:一个是 ChatGPT Work 那种你说话它做事的消费级 Agent,另一个就是 VulnHunter 这种给专业工具加上推理大脑的专业级 Agent。
前者降低门槛,后者降低误判。
两种都有价值。但对于我这种天天和代码打交道的开发者来说,后者更让人兴奋——不是因为它更聪明,是因为它理解你做的到底是什么。
去 GitHub 搜capitalone/vulnhunter。你需要 Opus 的 API key,还需要一点耐心读 README。但读完跑完,你会对 Agent 能做什么这件事有一个全新的判断。
Capital One 把内部打磨过的安全流程以 Apache 2.0 开源,意味着你可以直接 fork 下来适配自己的项目。这比任何 AI 安全类的商业产品都实在——你不只是在用他们的工具,是在复用他们花了几年时间迭代出来的方法论。
反正我跑完之后,把自己之前一个安全项目的 issue 列表翻出来重新看了一遍——那些标了 wontfix 的旧漏洞,有几条值得重新审视。