本节摘要:VulnHuntr(约 2.8k stars,AGPL-3.0,2026-10 社区口径)是零样本 LLM 漏洞挖掘的开源代表:不写规则、不建数据库,纯靠多轮提问在代码库里挖洞,并交出带 PoC 与置信度的报告。本节拆它三层:先说清「零样本」的确切含义与适用面,以及它工具面的极简设计;再拆分阶段 prompt 编排——先找入口、再追链路、再证可达、最后出 PoC 与置信度分级,这与第 06 章污点追踪的 source、sink、path 结构惊人同构,只是把「引擎遍历」换成了「模型阅读」;然后盘点它在 gpt_academic、ComfyUI、Langflow、Ragflow 等项目找到的 LFI、RCE、XSS、SSRF、IDOR 真实战果;最后必须标注:项目推送停在 2025-02、仅支持 Python 代码库,截至 2026-10 已停滞——方法论比工具长寿,本节的重心是前者,并给出五条可迁移清单。
零样本在这里指:不针对目标语言或项目预先编写规则、模式、查询——挖掘过程没有人工特征工程。VulnHuntr 的工具面朴素到近乎寒酸:给模型一个代码库的文件访问能力,剩下的全靠提示词驱动多轮迭代:模型读文件、提出怀疑、自己去读下一个相关文件,循环往复。
这个设计有个直接推论:它的强项与短板都来自「模型阅读」而非「引擎遍历」。强项是零配置、跨项目即开即挖、对「语义化漏洞」(逻辑错误、鉴权缺失)也有想象空间;短板是深度受模型阅读能力限制、注意力随文件数衰减、只支持 Python 代码库(工具实现层面的限制)。
| 维度 | 零样本 LLM 挖掘 | 规则与查询引擎(第 06 章) |
|---|---|---|
| 前置投入 | 近乎为零 | 规则与建库成本 |
| 语义化漏洞 | 有想象空间 | 难以枚举成模式 |
| 深度与确定性 | 受模型能力限制 | 引擎级、可复现 |
| 输出形态 | PoC 加置信度 | 路径级证据 |
零样本是「无规则」的零样本,不是「无验证」的零验证——输出仍要靠 PoC 与置信度兜底,这正是它方法论上最值得学的部分。
零样本的三个常见误读,先掰正:
| 误读 | 实情 | 后果 |
|---|---|---|
| 零样本等于全自动无人复核 | 产出仍需人审与 PoC 判定 | 直接采信高危误报,透支信任 |
| 零样本等于全语言 | 工具实现仅支持 Python | 拿去扫 C++ 仓库白跑一场 |
| 零样本等于便宜 | 多轮追问的 token 成本并不低 | 没有预算线,成本悄悄失控 |
第三条误读最伤:第 10.3 节的成本敏感研究正是对它的回应——方法论必须自带「何时停」的开关。
VulnHuntr 把挖掘过程编成多段提示词,逐段聚焦(阶段划分以官方仓库说明为准):
| 阶段 | 提问焦点 | 输入 | 输出 |
|---|---|---|---|
| 一、概览 | 攻击面在哪儿 | 项目结构、入口文件 | 候选攻击点清单 |
| 二、初筛 | 有没有可疑漏洞 | 候选点相关代码 | 疑似漏洞描述 |
| 三、追踪 | 输入怎么流到危险点 | 可疑点上下游代码 | 全调用链路分析 |
| 四、可达 | 远程攻击者真的够得着吗 | 链路中每跳的代码 | 可达性论证 |
| 五、成文 | PoC 与置信度 | 前四段全部结论 | PoC 加零到十置信度 |
编排的精髓是「一次只问一个问题」:概览阶段不追问细节,追踪阶段不发散到新入口——每段收窄一次搜索空间。这与人类研究员「先看路由、再追 handler、再验证参数来源」的节奏完全一致,也是它比「把整个仓库丢给模型问有没有漏洞」的单轮提示强得多的原因。置信度输出同样有纪律:不是拍一个数字,而是附理由与限制条件——「7 分:链路完整,但未验证鉴权中间件是否在部署中启用」。
追踪阶段的提示词片段长什么样(示意,还原其「要求出处」的风格):
# stage3_prompt.txt —— 追踪阶段的提问骨架(示意) 请针对上一步发现的可疑点,完成以下工作: 1. 找到该输入进入项目的第一个函数(给出文件与行号) 2. 逐步列出数据经过的每个函数调用,每一跳必须引用真实存在的代码 3. 指出数据最终到达的危险操作及其所在文件与行号 4. 不允许出现「可能存在某函数」这类没有代码出处的跳转 5. 若链路中断,明确说明断在哪一跳、为什么断
第 5 条最见功力:允许模型说「链路断了」,而不是逼它硬编一条完整链路——给模型留退路,就是给诚实留出口。
把这个骨架移植到非 Python 语言时,注意两个适配点:外部入口的写法要换(Flask 的 request 之外还有各语言的路由与参数绑定约定);「文件访问」工具要自备(VulnHuntr 只支持 Python,移植即自建——这正好是第 05 章《REA聚合层》练习)。
第三、四阶段合起来就是第 06 章的语言:入口即 source,危险点即 sink,链路即 path。VulnHuntr 要求模型论证「从远程可控输入到危险输出」的完整调用链,每一跳都要引用真实代码——不允许「可能存在某函数」这种无出处的跳转。
# chain_proof.txt —— 全调用链证明的形态(每跳必须带出处) request.args.get("cmd") ← source(入口文件:行号) → view_tool() 参数透传 (app/views.py:42) → subprocess 工具封装 (app/tools.py:17) → shell=True 执行 ← sink(app/tools.py:23) 可达性:路由未挂鉴权装饰器(app/urls.py:8)→ 远程可达
同构关系带来一个立即可用的组合思路:模型阅读给出候选链路(快、宽、可能错),污点引擎验证候选链路(慢、窄、不会错)。第 06 章的 semgrep taint 规则与 CodeQL 查询正是现成的验证器——VulnHuntr 自己没有这一层(零样本的代价),本书读者完全可以补上:模型报「request 参数疑似流进 system」,一条 CodeQL 污点查询立刻给出机器判定。
按公开披露(以官方仓库与各项目的公开安全通告为准),VulnHuntr 在多个知名开源 Python 项目中发现过真实漏洞,类别覆盖:
引用时的两个纪律:其一,具体 CVE 编号与严重级别以各项目的官方通告为准,转述不添油加醋;其二,漏洞分类学的系统性知识不在本书展开,注入与执行类见《Strix 精读》第 05 章《Web漏洞核心·注入与执行》,访问控制与客户端类见第 06 章《Web漏洞核心·访问控制与客户端》,框架与云场景见第 07 章《专项渗透·框架与技术协议云》。
还有一个容易被忽略的战果维度:这些发现多数是「链路型」而非「单点型」——单个函数看着无害,链起来才成洞。这正是全调用链证明的价值,也是纯规则引擎的盲区。
引用它时的检查清单(引用不完整是最常见的失礼):
必须完整交代的现状:VulnHuntr 仓库的最后一次推送停在 2025-02,且仅支持 Python 代码库——截至 2026-10 已停滞(以官方仓库现状为准)。引用它时应明确标注,避免读者误以为这是一个活跃维护的工具。
但停滞不折损方法论的价值。五段式编排、全链路出处要求、置信度分级,这三件事在任何模型、任何语言、任何智能体框架上都成立。迁移清单五条:
迁移后的流程对照(VulnHuntr 原版对本书增强版):
| 环节 | 原版 | 增强版 |
|---|---|---|
| 文件导航 | 模型自读目录 | repo-map 与 agentic 检索 |
| 链路自查 | 模型自查自证 | 污点引擎与 CPG 查询判定 |
| 成本控制 | 无预算线 | token 与时间双预算线 |
| 结论归宿 | 对话输出 | 证据链四列加 PoC 判定 |
VulnHuntr 给了方法论,但「我的智能体到底几斤几两」需要另一套东西:可复现的任务集、统一的口径、对成本的诚实度量。下一节进入基准与评测。