这篇论文介绍了一个名为 PAGENT 的新工具,它的任务是帮程序员“抓虫子”——具体来说,是自动制造一个能触发软件漏洞的“概念验证”(PoC)输入。
为了让你更容易理解,我们可以把整个过程想象成在一个巨大的、复杂的迷宫里寻找一个隐藏的陷阱。
🕵️♂️ 核心故事:寻找迷宫里的陷阱
想象一下,你有一个巨大的迷宫(这就是软件源代码),里面有一个隐蔽的陷阱(漏洞)。
- 传统方法(以前的工具): 就像派一个只有地图但没眼睛的人进去,或者派一个拿着手电筒但只会乱撞的人。他们要么走得太慢(扩展性差),要么总是把墙上的裂缝误认为是陷阱(误报),或者根本找不到路。
- 纯 AI 方法(大语言模型 LLM): 就像一个博学但有点“爱做梦”的探险家。他读过很多书,知道迷宫的大概样子,但他经常瞎编(幻觉)。他可能会自信地告诉你:“陷阱在左边!”然后你跑过去一看,那里只有一堵墙。虽然他很聪明,但如果没有向导,他很容易迷路或犯错。
🚀 PAGENT 是什么?(三位一体的探险队)
PAGENT 聪明就聪明在它没有只依赖那个“爱做梦”的探险家,而是组建了一支三人探险队,分工合作:
1. 静态分析向导(Static Analysis):画地图的专家
- 角色: 这是一个严谨、不会做梦的工程师。
- 任务: 在探险家进迷宫之前,他先快速扫描整个迷宫的蓝图(源代码)。他不需要走进迷宫,就能画出哪些路是通的,哪些死胡同是走不通的。
- 比喻: 他给探险家一张精准的“寻宝图”,上面标明了:“陷阱可能在第 3 层,而且你必须先经过‘红色大门’才能到达。”
- 作用: 防止探险家(AI)在完全错误的方向上浪费时间,告诉他:“别瞎猜了,根据图纸,陷阱就在这附近。”
2. 探险家(LLM Agent):负责推理和制造钥匙
- 角色: 那个博学但爱做梦的 AI 大模型。
- 任务: 拿到“寻宝图”后,他开始思考:“既然要经过红色大门,那我需要一把什么样的钥匙(输入数据)才能打开它?”他负责编写具体的代码或数据,试图触发那个陷阱。
- 作用: 利用他的创造力,把地图上的线索变成实际的行动。
3. 动态分析裁判(Dynamic Analysis):现场测试员
- 角色: 一个拿着秒表和监控摄像头的裁判。
- 任务: 当探险家造好“钥匙”并尝试打开门时,裁判会立刻测试。
- 如果门没开(没触发漏洞),裁判会告诉探险家:“你走错了,你刚才只走到了第 2 层,还没到第 3 层,而且你走的那条路覆盖率只有 10%。”
- 如果门开了(触发漏洞),裁判就大喊:“成功了!”
- 比喻: 这就像试错反馈。探险家说:“我觉得这把钥匙能行。”裁判说:“不行,这把钥匙只打开了前门,没打开后门。再试一把。”
- 作用: 纠正探险家的错误,让他不断调整策略,直到成功。
🔄 他们是怎么合作的?(循环迭代)
这个过程就像一个**“猜测 - 测试 - 修正”**的循环:
- 向导给探险家看地图,指出陷阱大概在哪。
- 探险家根据地图,造出一个“钥匙”(PoC 输入)。
- 裁判拿着钥匙去试。
- 失败了? 裁判告诉探险家:“你离目标还差得远,你只覆盖了 10% 的路径。”
- 探险家听到反馈,结合地图,重新思考:“哦,原来我刚才选错了门,我应该选那个蓝色的门。”
- 探险家修改“钥匙”,再次尝试。
- 直到裁判宣布成功,或者尝试次数用完。
🏆 为什么 PAGENT 这么厉害?
论文通过实验证明,这种“向导 + 探险家 + 裁判”的组合拳非常有效:
- 更准: 即使使用一个比较弱的开源 AI 模型(DeepSeek),加上这个系统,它的成功率也比那些最强的闭源商业 AI(如 GPT-5)高出很多(提升了 132%)。
- 更省: 因为用了开源模型,成本只有商业模型的几十分之一。
- 能发现“漏网之鱼”: 有趣的是,PAGENT 甚至能发现一些已经修补了漏洞的代码中依然存在的隐藏漏洞(就像在修好的墙里发现了新的裂缝)。这是因为裁判的反馈让探险家去探索了代码的其他角落,意外发现了新陷阱。
💡 总结
简单来说,PAGENT 就是给那个“爱做梦”的 AI 侦探配了一个严谨的地图绘制员和一个严格的现场裁判。
- 以前,AI 只能靠猜,容易猜错。
- 现在,AI 有地图指引方向,有裁判实时纠正错误。
结果就是,它能更高效、更准确地帮程序员找到软件里的安全漏洞,并制造出能证明漏洞存在的“证据”(PoC),让软件变得更安全。这就像把“盲人摸象”变成了“有导航、有反馈的精准寻宝”。
论文技术总结:程序分析引导的 LLM 代理用于概念验证(PoC)生成
1. 研究背景与问题定义
在软件生态系统中,安全漏洞的发现和修复至关重要。当漏洞被发现时,开发人员需要生成一个概念验证(Proof-of-Concept, PoC)输入,以可靠地复现并触发该漏洞。然而,许多漏洞报告缺乏有效的 PoC,导致开发人员必须手动进行耗时的复现工作。
核心挑战在于如何自动化、可扩展地结合漏洞检测能力与代码语义理解,以生成能够触发特定漏洞位置的输入。
- 传统方法局限性:
- 静态分析:可扩展但误报率高,通常无法自动生成 PoC。
- 符号执行:能生成 PoC 但面临路径爆炸问题,且依赖人工建模和专家指导。
- 模糊测试(Fuzzing):需要专家指导(如 harness、语法、字典)才能有效。
- 大语言模型(LLM)的局限性:虽然 LLM 提高了自动化水平,但直接用于 PoC 生成时,由于缺乏精确的上下文引导,容易产生幻觉(Hallucination),导致生成结果不准确或无法触发漏洞。
2. 方法论:PAGENT 框架
作者提出了一种名为 PAGENT (Program Analysis Guided proof of concept generation agENT) 的新型混合框架。该框架将轻量级的静态分析、基于规则的漏洞检测与动态分析反馈相结合,引导 LLM 代理生成 PoC。
PAGENT 包含三个核心组件:
2.1 静态分析引导 (Static Analysis Guidance)
旨在为 LLM 提供可扩展且精确的漏洞特定指导,减少 LLM 的幻觉。
- 轻量级静态分析:
- 首先将源代码编译为 LLVM-IR。
- 构建入口点驱动的调用图(Entrypoint-driven call graph),识别从常见入口点(如
main, LLVMFuzzerTestOneInput)可达的函数。
- 利用函数签名分析(FSA)处理间接调用,过滤掉不可达代码,确保分析的可扩展性。
- 基于规则的静态分析:
- 使用 Datalog(通过 Soufflé 和 cclyzerpp 工具)定义漏洞模式规则(如缓冲区溢出、整数溢出、Use-after-free 等 12 种常见漏洞)。
- 生成漏洞报告,包含:漏洞类型、易受攻击的函数、污点路径(Taint Path)、入口点、漏洞位置及模板断言(Assertion Template)。
- 这些规则在 LLVM-IR 层面运行,可跨项目复用和扩展。
2.2 PoC 生成代理 (PoC Generation Agent)
- 基于 OpenHands 和 CodeAct 架构构建的通用 LLM 代理。
- 工作流程:
- 准备阶段:将静态分析生成的漏洞报告、源代码路径及任务指令封装为
README 文件,作为代理的上下文。
- 迭代循环:代理分析代码,生成候选 PoC 输入,并通过 Bash 命令提交到测试环境。
- 交互能力:代理拥有对源代码的交互式访问权限,可安装辅助库(如 Pwntools)并执行代码。
2.3 动态分析引导 (Dynamic Analysis Guidance)
旨在为代理提供执行反馈,修正其分析偏差。
- 带消毒器的构建 (Sanitizer-based Build):使用 AddressSanitizer (ASan)、MemorySanitizer (MSan) 等工具编译仪器化二进制文件,以检测内存错误和未定义行为。
- 反馈机制:
- 如果 PoC 触发崩溃(非零退出码),任务完成。
- 如果未触发崩溃,代理接收动态反馈,包括:
- 执行时间:判断是否被浅层条件拒绝。
- 入口点信息:确认实际执行的二进制入口。
- 覆盖率信息:文件、函数、行、区域和分支覆盖率。
- 作用:代理利用覆盖率数据(例如,发现易受攻击的函数覆盖率仅为 10%)推断执行路径偏差,进而调整输入策略(如修正架构常量),迭代优化直到成功触发漏洞。
3. 实验评估与结果
3.1 实验设置
- 数据集:来自 Cybergym 的 ARVO 数据集,包含 10 个开源 C/C++ 项目(如 GNU Binutils, libredwg, mosquitto 等)中的 203 个真实漏洞。
- 基线对比:
- Cybergym 中的顶级 LLM 代理(包括 GPT-5, Claude-4, Sonnet-4 等)。
- 其他 PoC 生成工具(PoCGen, Faultline)。
- 输入条件:PAGENT 仅使用源代码和代码位置作为输入,不依赖漏洞文本描述或堆栈跟踪(这是基线模型通常依赖的)。
3.2 主要结果
- 性能提升:
- PAGENT 使用开源模型 DeepSeek3.2 时,在 203 个漏洞上达到了 64.6% 的成功率。
- 相比表现最好的闭源模型代理(GPT-5),PAGENT 的性能提升了 104%(DeepSeek3.2 版本)或 132%(DeepSeek3.1 版本,尽管该模型本身性能较弱)。
- 即使使用较弱的 DeepSeek3.1 模型,PAGENT 也显著优于 GPT-5 和 Sonnet-4 等顶级闭源模型。
- 成本效益:DeepSeek 模型的 API 成本仅为 GPT-5 等闭源模型的 1/33(0.42 美元/百万 token vs 14 美元/百万 token)。
- 消融实验:
- 静态分析(SA)和动态分析(DA)各自对性能提升贡献巨大。
- 移除动态分析导致成功率下降约 25%-42%。
- 移除静态分析导致性能大幅下降,证明了程序分析引导的必要性。
- 补丁后漏洞检测:PAGENT 发现了 32 个 在修复补丁后仍然存在的“补丁后漏洞”(Post-patch vulnerabilities),其发现数量是其他基线代理的 4 倍。这表明 PAGENT 不仅能复现已知漏洞,还能发现补丁未覆盖的深层漏洞。
4. 核心贡献
- LLM 代理的静态分析引导:设计并实现了一种可扩展的静态分析流程,为 LLM 提供精确的漏洞特定信息(污点路径、断言模板),显著提高了 PoC 生成的精度。
- LLM 代理的动态分析引导:引入动态分析反馈循环,利用覆盖率信息帮助代理定位执行路径偏差,迭代优化 PoC 输入。
- 显著提升代理有效性:证明了混合方法(程序分析 + LLM)优于纯 LLM 方法。使用低成本开源模型即可超越顶级闭源模型,且成本降低 32 倍。
- 发现隐藏漏洞:展示了该方法在检测补丁后残留漏洞方面的强大能力,具有极高的安全研究价值。
5. 意义与影响
- 自动化安全响应:PAGENT 能够集成到 CI/CD 流水线中,在每次代码提交后自动检测新引入的漏洞并生成 PoC,加速漏洞修复流程。
- 降低门槛:通过程序分析引导,降低了对 LLM 模型本身能力的依赖,使得使用低成本、开源的 LLM 也能完成复杂的漏洞复现任务。
- 方法论创新:首次将静态和动态分析作为“一等公民”(first-class signals)紧密耦合到 LLM 代理的迭代合成循环中,为软件安全领域的自动化分析提供了新的范式。
总结:PAGENT 通过结合传统程序分析的精确性与 LLM 的语义推理能力,解决了自动化 PoC 生成中的可扩展性和准确性难题,在性能、成本和发现深层漏洞的能力上均取得了突破性进展。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。