分享自:

利用大语言模型支持二进制污点分析

期刊:ACM Trans. Softw. Eng. Methodol.DOI:10.1145/3711816

大型语言模型赋能二进制污点分析:LATTE 的提出与验证

本文旨在介绍一篇于2025年1月发表在 ACM Transactions on Software Engineering and Methodology 期刊上的前沿研究论文。该论文由来自蚂蚁集团、清华大学、中国科学院信息工程研究所、加拿大滑铁卢大学以及独立研究员的多位学者共同完成,通讯作者为蚂蚁集团的彭迪博士。论文题为“Harnessing the Power of LLM to Support Binary Taint Analysis”,提出了首个由大型语言模型(Large Language Model, LLM)驱动的静态二进制污点分析工具——LATTE。以下将从学术背景、工作流程、主要结果、结论与价值等方面,对本研究进行全面介绍。

一、 学术背景与研究目标

本研究的核心科学领域是软件安全工程,具体聚焦于二进制程序的漏洞检测。在软件发布后,第三方安全审计,尤其是对缺失源代码的二进制程序(如嵌入式设备固件、商业软件)的分析,至关重要。静态二进制污点分析(Static Binary Taint Analysis,以下简称污点分析)是漏洞检测的有效手段之一。它通过追踪外部可控数据(被标记为“污染”数据)在程序内部的传播路径,检查这些数据是否最终被用于危险操作(称为“汇点”,sink),从而发现潜在漏洞。

然而,传统的二进制污点分析存在显著局限,核心在于其规则定义的强人工依赖性。分析的有效性高度依赖于三类规则的准确性和完备性: 1. 污点源(Source)规则:识别接收外部输入的函数(如recv, fscanf),并确定需要被标记为污染的返回值或参数。 2. 污点传播与净化(Propagation & Sanitization)规则:定义污染标签如何随数据依赖(赋值、计算、函数调用)传播,以及在何种安全检查下污染会被清除(净化)。 3. 汇点检查(Sink Inspection)规则:针对不同的漏洞类型(如缓冲区溢出、命令注入)和汇点函数(如strcpy, system, printf),定制复杂的检查逻辑。

为新的二进制程序或漏洞类型手动定义这些规则,是一项繁重、易错且需要深厚专业知识的工作,严重阻碍了污点分析的自动化、准确性和可扩展性。先前的研究(如EmTaint、Arbiter、Karonte)均未能根本解决此问题。

与此同时,以GPT系列为代表的大型语言模型(LLM)在代码理解、生成和摘要等任务上展现出卓越能力。LLM具备上下文感知、语义理解和自然语言交互的优势,为自动化复杂的代码分析任务提供了新可能。

因此,本研究的目标是探索LLM与污点分析概念的协同结合,提出一种全新的、自动化程度更高的二进制漏洞检测方法,旨在克服传统污点分析对人工规则的依赖,提升分析的准确性和效率。

二、 详细工作流程

LATTE的核心设计思想是:利用LLM的代码理解能力,自动化污点分析中原本依赖人工的组件(如源/汇识别、语义层面的净化和漏洞检查),同时结合静态程序切片技术,构建针对性的提示序列,引导LLM分步完成对危险数据流的漏洞检查。 其工作流程(如图6所示)主要包含以下三个核心模块与阶段:

第一阶段:函数调用链提取

此阶段的目的是找出所有可能通向“脆弱目的地”(Vulnerable Destination, VD)的数据传播路径。VD是指汇点函数的调用点。 1. 预处理:使用Ghidra等工具对输入二进制文件进行反汇编和反编译,恢复代码结构。 2. 识别汇点与脆弱目的地: * 提取二进制中所有外部链接函数。 * 利用LLM进行汇点识别:向LLM(如GPT-4)发送精心设计的提示(例如:“作为程序分析师,调用printf是否可作为污点分析中的汇点?如果可以,需要检查哪些参数?”),让其判断每个外部函数是否为汇点,并指明需检查的参数。例如,(printf; 1)表示需要检查printf的第一个格式字符串参数是否受污染。此过程可以缓存和复用。 * 在反编译代码中定位所有已识别汇点的调用点,结合具体的参数,形成VD列表,例如(代码行号18; printf; 变量d)。 3. 向后切片构建调用链: * 针对每个VD,从VD所在的函数开始,进行向后的、过程内和过程间的数据依赖分析。 * 利用Ghidra构建的调用图和控制流图,递归地追踪VD相关参数的来源。如果参数依赖于当前函数的形参,则分析该函数的调用者,并将调用者函数加入调用链。 * 最终,为每个VD生成一组函数调用链(Call Chains),例如[fun2, fun1]表示fun2调用了包含VD的fun1,且数据从fun2流向VD。

第二阶段:危险数据流生成

此阶段目标是从上一步的调用链中,筛选出那些起始于外部数据输入的真实危险路径。 1. 识别污点源:与识别汇点类似,利用LLM分析外部函数,判断其是否为可以接收外部输入的污点源,并指明存储外部数据的参数。例如,(fgets; 1)。此结果同样可复用。 2. 匹配与去重: * 遍历第一阶段得到的所有函数调用链。 * 检查调用链中的函数是否调用了已识别的污点源。如果调用,则进一步分析污点源参数的数据流是否与VD的数据流存在重叠(即存在数据依赖)。 * 若存在重叠,则将该调用链中从调用源点的函数开始,到VD所在函数为止的子链,标记为候选危险数据流。 * 进行去重处理:保留同一调用链中最长的候选流;如果一个流是另一个流的子链,则过滤掉较短的子链。最终得到一组精简且唯一的危险数据流(Dangerous Flows)。

第三阶段:提示序列构建与LLM交互检查

这是LATTE的创新核心。它不直接将整个程序或危险数据流丢给LLM,而是将分析任务拆解,构建一个引导式的对话序列。 1. 设计提示模板:研究设计了三类模板,均明确了LLM的“程序分析师”角色,并强调关注数据别名和污染数据操作。 * 起始提示:用于对话开端。指定初始污点源函数及其污染参数,并提供该函数代码片段,要求LLM开始提取数据流。 * 中间提示:用于危险数据流中的中间函数。指示LLM基于之前的分析结果继续分析当前函数的数据流,如果当前函数内有新污点源也需指明。 * 结束提示:用于危险数据流末端。要求LLM基于整个数据流分析结果,判断是否存在漏洞,并根据通用弱点枚举(CWE)类型进行解释。 2. 构建与执行提示序列:对于每个危险数据流,按函数顺序实例化提示模板,将函数代码片段填入,形成一个连贯的对话提示序列。然后将这个序列发送给LLM(如GPT-4),LLM会以对话形式逐步分析数据流,并最终在“结束提示”的回复中给出漏洞判断和解释。 3. 结果输出:收集并整理LLM对所有危险数据流的分析结果,生成漏洞报告。

三、 主要结果

研究通过全面的评估回答了五个研究问题(RQ)。

RQ1: 漏洞检查效果、稳定性与效率 * 有效性:在标准数据集Juliet测试套件(去除调试信息)上,LATTE在CWE-78(命令注入)、CWE-134(格式化字符串)、CWE-190(整数溢出)、CWE-606(未检查循环条件)四种漏洞类型的检测上,准确率和F1分数均显著优于基线工具EmTaint和Arbiter。平均检测准确率达到77%。 * 稳定性:在五次重复测试中,对于每种漏洞类型,LATTE检测到的真实漏洞集合有高度重叠(例如CWE-78的召回率交集为90.42%),表明结果稳定。研究还发现,将LLM的“温度”(Temperature)参数设置在0.4-0.6之间,可在稳定性和检测效果间取得最佳平衡。 * 效率:分析一个测试用例平均耗时约14秒(预处理和切片约2秒,LLM交互约12秒)。虽然略慢于EmTaint,但考虑到其更高的自动化程度和准确性,此开销是可接受的。每次分析危险数据流的货币成本约为0.35美元,远低于聘请专家进行人工审计的费用。

RQ2: 源与汇识别的有效性 * LATTE利用LLM自动识别汇点和源点的平均精确度达到82.1%。 * 关键的是,在Juliet测试用例的目标场景中(即设计用来触发漏洞的特定源-汇对),LATTE的识别结果实现了100%的覆盖。这意味着LATTE总能正确识别出测试用例中预设的危险函数。识别结果可缓存,供分析同类库的不同二进制文件时复用,极大提升了自动化水平。

RQ3: 危险数据流提取的有效性 * 在标记为包含漏洞的Juliet测试用例中,LATTE成功提取出危险数据流的比例超过95%。 * 所有成功提取的数据流都是正确的,即覆盖了从源点到汇点触发漏洞的关键代码路径。这证明了基于向后切片的数据流提取方法是可靠且有效的。

RQ4: 提示序列的影响 * 研究进行了消融实验,对比了不同提示构建策略(如直接分析整个程序、分析整个危险数据流、以及LATTE采用的按函数分步分析)。结果表明,LATTE采用的细粒度、任务拆分的提示序列构建方法,显著优于其他方法。它通过分步引导,为LLM提供了更聚焦的上下文和更清晰的分析指令,从而获得了最佳的漏洞检查准确率。

RQ5: 在真实世界二进制中的可扩展性 * 在真实世界的嵌入式设备固件数据集(来自Karonte)上,LATTE展现了强大的漏洞发现能力。 * 它共检测到119个独特漏洞,其中包括37个先前未知的漏洞,并有10个因威胁较高被分配了CVE编号。 * 这一表现超越了所有基线工具(EmTaint, Arbiter, Karonte),证明了LATTE能够有效地扩展到复杂、真实的二进制程序分析中,并发现新的安全威胁。

四、 结论与研究价值

本研究得出结论:LATTE是首个成功利用LLM能力来赋能静态二进制污点分析的技术。它通过结合LLM的语义理解能力和静态程序切片,实现了污点分析过程的高度自动化,摆脱了对人工定制规则的严重依赖。

研究的科学与应用价值体现在: 1. 方法论创新:为漏洞分析领域开辟了新方向。它首次系统性地探索并验证了将LLM强大的代码理解能力与经典的污点分析框架相结合,以解决长期存在的自动化难题的可行性。 2. 实用性突破:LATTE显著提高了漏洞检测的准确性和自动化程度,降低了工程成本。它不仅在有标准答案的测试集上表现优异,更在真实固件中发现了大量新漏洞,证明了其作为安全研究人员和实践者高效、可扩展解决方案的潜力。 3. 解决LLM应用挑战的范例:研究并未简单地将代码抛给LLM,而是通过代码切片缩小分析范围构建引导式提示序列分解分析任务,巧妙地解决了LLM上下文长度有限和漏洞发现指令难以泛化两大挑战,为在其他复杂代码分析任务中有效利用LLM提供了宝贵经验。

五、 研究亮点

  1. 首创性:首个LLM驱动的静态二进制污点分析器,开创了该领域的新方向。
  2. 高性能:在标准测试集和真实世界固件上的评估表明,其在漏洞检测能力上全面超越了现有最优技术,并发现了37个0-day漏洞。
  3. 高自动化:通过LLM自动化了源/汇识别、语义净化与漏洞检查等核心且繁琐的步骤,大幅降低了对安全专家人工经验的依赖。
  4. 巧妙的LLM集成设计:提出的“危险数据流提取”和“分步提示序列构建”双重机制,是针对LLM在复杂程序分析中应用挑战的有效、创新性解决方案。
  5. 低成本与可扩展性:分析过程工程成本低,LLM查询结果可复用,模型可替换,使得该框架能够适应未来更强大的LLM,具备良好的发展前景。

LATTE研究代表了软件安全分析领域一次重要的范式演进,展示了人工智能,特别是大型语言模型,在提升专业安全工具自动化与智能化水平方面的巨大潜力。

上述解读依据用户上传的学术文献,如有不准确或可能侵权之处请联系本站站长:admin@fmread.com