← 最新论文
💻 computer science

Guiding Symbolic Execution with Static Analysis and LLMs for Vulnerability Discovery

本文提出了 SAILOR 框架,通过结合静态分析定位漏洞、大语言模型迭代合成执行桩以及符号执行与具体重放验证,实现了在大规模 C/C++ 项目中自动化发现 379 个此前未知的内存安全漏洞,其效果显著优于现有基线方法。

原作者: Md Shafiuzzaman, Achintya Desai, Wenbo Guo, Tevfik Bultan

发布于 2026-04-09
📖 1 分钟阅读☕ 轻松阅读

原作者: Md Shafiuzzaman, Achintya Desai, Wenbo Guo, Tevfik Bultan

原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明

这篇论文介绍了一个名为 Sailor(水手)的全新系统,它的任务是自动在巨大的计算机代码库中寻找“漏洞”(就像寻找建筑物里的裂缝或电路里的短路)。

为了让你更容易理解,我们可以把寻找代码漏洞的过程想象成在一个巨大的、迷宫般的废弃工厂里寻找隐藏的炸弹

1. 为什么以前的方法行不通?(旧方法的困境)

在 Sailor 出现之前,人们主要用三种方法找炸弹,但都有大问题:

  • 静态分析(Static Analysis):像拿着放大镜看图纸。
    • 比喻: 你有一张工厂的图纸,用放大镜看哪里画得不对(比如“这里没画保险丝”)。
    • 缺点: 图纸太复杂,放大镜看一遍会看到成千上万个“可能有问题”的地方,但其中 99% 都是误报(其实那里并没有炸弹,只是图纸画得奇怪)。这就像大海捞针,效率极低。
  • 模糊测试(Fuzzing):像往工厂里扔石头。
    • 比喻: 你往工厂各个角落扔石头,看哪里会爆炸。
    • 缺点: 如果炸弹藏在工厂最深处的一个上了锁的保险柜里,而你扔的石头根本打不开门,或者你扔的石头形状不对,你就永远触发不了爆炸。
  • 大语言模型(LLM):像请了一个博学的侦探。
    • 比喻: 你请了一个读过很多书、很聪明的侦探(AI)来看图纸。
    • 缺点: 这个侦探虽然聪明,但他没有亲眼见过工厂内部。他可能会自信满满地告诉你“这里肯定有炸弹”,但实际上那里很安全;或者他漏掉了真正的炸弹。而且,如果工厂太大(代码几百万行),侦探的脑子(上下文窗口)也装不下整个工厂的图纸。
  • 符号执行(Symbolic Execution):像派一个超级机器人进去模拟。
    • 比喻: 这是一个能模拟所有可能情况的超级机器人。它能精确地算出:“如果输入是 A,炸弹会炸;如果输入是 B,炸弹不会炸”。
    • 缺点: 这个机器人不会自己开门。它需要有人(专家)给它写一张详细的“入场指南”(Harness),告诉它从哪个门进、怎么开保险柜、怎么绕过守卫。写这张指南非常难,需要专家花大量时间手动编写,这成了最大的瓶颈。

2. Sailor 是怎么工作的?(三阶段接力赛)

Sailor 的创新之处在于,它把上述四种方法结合了起来,组成了一支完美的三人探险队,分三个阶段工作:

第一阶段:静态分析(SA)—— “地图标记员”

  • 角色: 拿着放大镜的初级侦察兵。
  • 任务: 它快速扫描整个工厂(代码库),虽然它分不清真假,但它能圈出所有“看起来像炸弹”的可疑地点
  • Sailor 的魔法: 它不只是扔出一堆乱码,而是把每个可疑地点整理成一张**“寻宝卡片”**(Vulnerability Specification)。卡片上写着:“这里有个可疑的 memcpy 函数,可能没检查长度,请重点调查。”
  • 作用: 把大海捞针变成了“在几个特定的盒子里找针”。

第二阶段:大语言模型(LLM)+ 符号执行(SE)—— “智能向导与超级机器人”

这是 Sailor 的核心(也是论文最厉害的地方)。

  • 角色: 一个聪明的向导(LLM)和一个超级机器人(SE)。
  • 任务:
    1. 向导(LLM)看卡片: 向导拿到“寻宝卡片”后,开始研究工厂的局部结构。它需要写一张**“入场指南”**(Harness),告诉机器人怎么进那个特定的房间。
    2. 试错与修正(迭代): 向导写的指南第一次可能不行(比如门打不开,或者机器人撞墙了)。这时候,编译器机器人会反馈错误信息:“门打不开,因为少了一把钥匙”或者“机器人卡住了”。
    3. 向导修改指南: 向导看到反馈,立刻修改指南,再试一次。这个过程会重复很多次(就像玩游戏通关,死了读档重来),直到向导写出完美的指南。
    4. 机器人执行: 一旦指南完美,超级机器人(符号执行引擎 KLEE)就进去模拟。它能计算出:“只要输入一个长度为 17 的字符串,炸弹就会爆炸!”并生成具体的**“触发密码”**(Witness Inputs)。
  • 比喻: 以前写指南靠专家手动写,现在靠 AI 向导自己试错、自己修改,直到把机器人送进最深处。

第三阶段:具体验证(Concrete Validation)—— “真人实测”

  • 角色: 勇敢的拆弹专家。
  • 任务: 机器人算出的“触发密码”是理论上的。为了确认它真的能炸,我们需要在真实的工厂(未修改的代码)里,用真实的炸弹(AddressSanitizer 工具)试一次。
  • 作用: 如果真人试了真的爆炸了,那就100% 确认找到了真炸弹。如果没炸,说明之前的 AI 向导可能被骗了(误报),直接扔掉。

3. 结果有多厉害?

研究人员在 10 个著名的开源大项目(总共 680 万行代码,相当于几百万行文字)中测试了 Sailor:

  • 战绩: 发现了 379 个 以前没人知道的、真实存在的内存安全漏洞(比如缓冲区溢出,会导致黑客控制电脑)。
  • 对比:
    • 最强的竞争对手(一个拥有无限权限、能自由探索整个代码库的 AI 代理),只找到了 12 个 漏洞。
    • 如果没有静态分析(让 AI 自己瞎找),找到的漏洞数量会暴跌 12 倍
    • 如果没有 AI 向导的反复修改,一个漏洞都找不到
    • 如果没有最后的真人实测,就无法确认哪些是真正的漏洞。

4. 总结:Sailor 为什么成功?

这就好比找宝藏:

  • 静态分析帮你缩小了搜索范围(从整个森林缩小到几棵树)。
  • AI 向导帮你画出了通往树洞的地图,并且通过不断试错,把地图画得完美无缺。
  • 符号执行机器人按照地图,精确地算出了宝藏的位置和打开方式。
  • 真人实测最后确认宝藏是真的。

Sailor 的核心思想是: 不要指望一种技术解决所有问题。让擅长“找线索”的静态分析、擅长“写代码和推理”的 AI、擅长“精确计算”的符号执行引擎,以及擅长“验证事实”的真人测试,分工合作,互相补位

这就是为什么 Sailor 能像一位经验丰富的“水手”,在代码的汪洋大海中,精准地找到那些隐藏最深的“暗礁”(漏洞)。

您所在领域的论文太多了?

获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。

试用 Digest →