A Survey on Binary Code Vulnerability Mining Technology
A Survey on Binary Code Vulnerability Mining Technology
Xu, Pengzhi, Zetian Mai, Yuhao Lin, Zhen Guo, and Victor S. Sheng. "A Survey on Binary Code Vulnerability Mining Technology." Journal of Information Hiding and Privacy Protection 3, no. 4 (2021): 165.
作者单位:海南大学网络空间安全学院(密码学院),德克萨斯科技大学计算机科学系
二进制安全漏洞分析对于保护信息系统的机密性(confidentiality)、完整性(integrity)和可用性(availability)具有重要意义。
二进制分析较于源代码分析的必要性包括:
- 基于商业利益或则知识产权考虑,一些程序的源代码是不可得的
- 一些漏洞是在源代码编译成二进制后插入的,这些漏洞在源代码当中并不存在
- 二进制分析与程序实现的语言无关
鉴于传统分析方法在人力成本、路径爆炸等上德问题日益突出,基于机器学习的方法越来越受到青睐。
1. 二进制分析框架介绍
Angr
主要模块
- 中间表示模块(IR)
- 二进制程序加载模块(CLE)
- 程序状态表示模块(Simu VEX)
- 数据模型模块(Claripy)
工作流程如下所示:

作者指出: 尽管angr框架支持跨平台和跨架构,具有良好的兼容性,并且通过引入强大的符号执行引擎极大地提高了分析能力。然而,angr仍然需要手动辅助进行后续分析,因为它仅提供程序的路径信息,未集成其他更典型的分析技术。目前,无法进行完整的漏洞分析。因此,angr需要在自动化和整合其他分析技术方面进行进一步研究。
Harry:
angr主要用于解决以下问题:
- 将二进制文件加载到分析程序中;
- 将二进制文件翻译成中间表示;
- 执行实际的分析,可能包括部分或全部程序的静态分析,程序状态空间的符号搜索,或者这些方法的部分组合。
优点:
- 全面性:angr能够进行全面的二进制分析,包括静态分析和动态分析。
- 灵活性:angr提供了丰富的API,可以用于实现各种图的分析,包括控制流图、控制依赖图、数据依赖图等。
- 自动化:angr可以实现二进制文件的自动化分析,这对于处理大量二进制文件非常有用。
缺点:
- 复杂性:由于angr的功能非常强大,因此它的学习曲线可能会比较陡峭。
- 性能:尽管angr可以进行全面的分析,但是这可能需要消耗大量的计算资源和时间。
参考
(1) 利用angr进行二进制静态分析
(2) angr:基于python的二进制分析框架
(3) 初尝angr静态分析
(4) angr_ctf——从0学习angr(一):angr简介与核心概念
(5) 动若脱兔:深入浅出angr--初步理解符号执行以及angr架构
MBVA
MBVA是一个二进制程序漏洞分析工具,它通过抽象程序建模和模型检查的组合来检查程序规范,以便准确地检测和分析二进制程序中的漏洞。
MBVA框架的流程图下图所示:

Harry:
作者没有给出MBVA的官网,博主也没有找到官网或者github地址
Harry:
很显然,作者介绍的二进制分析框架太少了。下面其他一些二进制漏洞分析框架:
- BinAbsInspector:是一个二进制文件静态漏洞分析工具,它通过抽象程序建模和模型检查的组合来检查程序规范,以便准确地检测和分析二进制程序中的漏洞
- Manticore: 是一个符号执行框架,用于进行二进制程序的深入分析和自动化测试。
- Mayhem: 是一款高度自动化的二进制分析框架,它结合了符号执行、模糊测试和污点分析等技术,用于发现各种类型的漏洞。
- Qiling Framework: 是一个轻量级的二进制分析框架,它支持模拟执行和动态符号执行,用于自动化分析和挖掘漏洞。
- KLEE: 是一个符号执行引擎,用于自动化执行程序的各种路径,并发现输入数据使程序进入未预期的状态,从而发现漏洞。
- S2E: 是一个可扩展的符号执行框架,它用于自动化执行程序的多个路径,并进行安全性和稳定性分析。
- AFL (American Fuzzy Lop): AFL是一款用于模糊测试(Fuzz testing)的框架,它通过自动化生成输入数据并监控程序的执行来发现漏洞。
- honggfuzz: honggfuzz是另一个高效的模糊测试框架,它具有快速的执行速度和低的内存消耗,适用于大规模的漏洞挖掘任务。
- Syzkaller: Syzkaller是一个专注于内核漏洞挖掘的模糊测试框架,它自动化生成系统调用序列并在内核上执行,用于发现内核漏洞。
- Angora: Angora是一款基于AFL的高效模糊测试框架,它通过引入动态污点分析和路径约束来提高漏洞挖掘的效率。
2. 中间语言(IL)研究的背景和重要性
二进制程序的漏洞分析技术面临着底层指令集复杂和缺乏相应语义和类型信息的困难。研究人员提出使用中间语言来表示二进制代码。这种方法是将二进制代码转换为具有语义信息的中间代码,以便进行后续的分析和研究。通过分析具有丰富语义信息的中间语言,我们可以获得所需的程序CFG图,然后获得程序的信息流。因此,获取从二进制代码翻译过来的中间语言对后续工作具有重要意义。
作者介绍了两个IL的研究内容:
- 江等人(2009年):VINST中间表示方法,该方法遵循保持频繁执行部分的效率和保持其他部分正确的基本原则。这种方法形式相对简单,但效率非常低。
- 张等人(2013年):动态二进制翻译技术TCG,该技术使用基本块作为翻译单元来翻译二进制代码。动态翻译器将缓存翻译和优化结果,这可以为动态翻译提供更多的空间。
作者指出了中间表示(IR)存在的问题:
- 在翻译成中间语言的过程中,可能会丢失一些信息
- 中间语言将一条指令翻译成几条指令,这可能会降低效率。
关于翻译过程的效率和准确性:
- 可以设置翻译规则来删除冗余和多余的段落
- 在删除过程中尽量保证语义信息的完整性
Harry:
IL研究及其应用,极大地简化了二进制代码的分析过程,提高了分析的效率和准确性。具体的说,具有以下优点:
- 跨平台兼容性:二进制代码可能来自各种不同的硬件架构(如x86,ARM,MIPS等),每种架构都有其特定的指令集和语义。通过将二进制代码转换为中间语言,可以将特定架构的细节抽象出来,使得分析工具能够在多种架构上通用。
- 语义丰富:中间语言通常设计得更加高级和语义丰富,比如包含类型信息,控制流信息,数据流信息等。这使得基于中间语言的分析比直接对二进制代码进行分析更加容易。
- 方便优化和分析:中间语言通常设计得更接近于高级语言,这使得许多编译器中的优化技术和分析方法可以直接应用到中间语言上。例如,可以进行死代码删除,常量传播,循环优化等。
- 易于理解和使用:由于中间语言更接近于高级语言,因此对于人类来说,理解和使用中间语言比直接使用二进制代码要容易得多。
当前典型的IL包括:
- P-code:P-code是一种由IDA Pro,Ghidra等工具使用的中间语言,用于表示汇编代码的抽象。它将汇编指令映射到一组高级抽象操作,简化了二进制代码的分析过程。
- BNIL(Binary Ninja Intermediate Language):BNIL是Binary Ninja的内部表示形式,用于表示和分析二进制代码
- LLVM IR(LLVM Intermediate Representation):LLVM IR是LLVM编译器框架使用的中间语言。它是一种低级的静态单赋值形式(SSA)中间表示,支持多种架构和平台,广泛用于编译器优化和二进制代码分析。
- REIL(Reverse Engineering Intermediate Language):REIL主要由Zynamics公司(现在是Google的一部分)开发,作为他们的商业逆向工程工具IDA Pro的一部分。
- VEX(Valgrind Express):VEX是一种由Valgrind框架使用的中间语言,用于进行二进制分析和动态检测。它提供了一种抽象的指令级表示,适用于多种处理器架构。
- BIR(Binary Intermediate Representation):BIR是一种由IDA Pro反汇编工具使用的中间语言,用于表示和分析二进制代码。它提供了一种较高级别的抽象,方便分析人员理解和操作二进制代码。
- CIL(Common Intermediate Language):CIL是.NET平台上的一种中间语言,用于表示和执行托管代码。虽然主要用于.NET程序集,但也可以用于分析托管代码的二进制表示形式。
以下是关于IL研究的论文:
- "VEX IR: An Intermediate Representation for Binary Analysis",作者:Andrey Konovalov, Artem Dinaburg,发表时间:2018年。该论文详细介绍了VEX IR,这是一个由Valgrind工具集使用的中间表示,用于进行二进制代码的静态和动态分析。
3. 传统二进制漏洞分析技术
污点分析
污点分析最早由(Denning)于1976年提出[9]。目前,污点分析技术广泛应用于信息泄漏检测、漏洞检测和逆向工程。污点分析技术将系统或应用中的数据标记为有污点或无污点。当有污点的数据根据信息流传播策略影响到无污点的数据时,将无污点数据的标签修改为有污点。当带有污点标签的数据最终随着数据传播到指定的存储区域或信息泄漏点时,认为程序存在安全风险。 污点分析技术的处理过程可以分为三个阶段:污点源识别、污点传播分析和无害处理。 基本流程如下图所示。

Harry:
在污点分析中,确定数据是否是污点的方法有:
- 用户输入:如果数据来自用户的输入,例如用户在程序中输入的文本或文件内容,通常会被标记为污点。
- 外部输入:除了用户输入,还有其他外部输入,比如网络数据、文件内容等。这些数据也应该被标记为污点,因为它们可能受到攻击者的影响。
- API调用:一些系统调用或库函数可能会接收污点数据作为参数,或者返回污点数据。这些调用会将数据标记为污点。
- 数据传递:如果一个变量的值由一个污点数据直接或间接地影响,那么这个变量也应该被标记为污点。数据传递分析可以帮助追踪数据的传递路径。
- 敏感函数调用:如果数据作为敏感函数(例如加密函数)的输入,那么这个数据通常会被标记为污点。
- 用户定义的标记规则:在一些污点分析工具中,用户可以定义标记数据为污点的规则。这些规则可以基于模式匹配、API调用等。
在污点分析中,"无害处理"是指当污点(或标记)的数据流到达程序的输出点或其他特定敏感点时,对其进行处理以确保安全性。这种处理通常涉及将污点数据清除或替换为安全数据,以防止潜在的安全漏洞。无害处理是为了避免将敏感信息泄露到程序的输出或其他不安全的地方,从而保护系统的安全性。在进行污点分析时,识别和处理潜在的污点传播路径以及在适当的时候进行无害处理是确保程序安全性的关键步骤。
在污点分析中,确定输出点或敏感点(泄漏点)的方法包括:
- 已知的敏感函数或API调用:某些函数或API调用可能会导致敏感信息的泄漏,例如文件写入、网络发送等。在分析的初期,可以将这些函数或API调用标识为潜在的泄漏点。
- 用户定义的敏感点:对于特定的应用程序,可能存在用户自定义的敏感点,例如密码字段、加密密钥等。在分析中,这些用户定义的敏感点需要特别关注。
- 控制流分析:分析程序的控制流,确定哪些路径上的数据可能会影响程序的输出。例如,当用户输入直接或间接地影响到程序的输出时,这些输入点就是潜在的泄漏点。
- 数据流分析:通过数据流分析,追踪数据在程序中的传递路径。当敏感数据流经某个点时,该点可能是泄漏点。数据流分析可以帮助确定数据传递的路径,从而找到泄漏点。
- 模式匹配:使用预定义的模式或规则,例如正则表达式,来匹配代码中的敏感信息。如果在代码中发现了这些模式匹配的数据,那么相应的位置可能是泄漏点。
- 静态分析工具:使用静态分析工具(如静态分析编译器、污点分析工具等)来帮助识别代码中的潜在泄漏点。这些工具可以自动分析代码,找出可能的泄漏点。
- 经验法则:基于经验,分析师可能知道常见的安全漏洞模式,例如缓冲区溢出、格式化字符串漏洞等。这些漏洞可能导致敏感信息泄漏,因此,经验法则也是确定泄漏点的一种方法。
静态污点分析
静态污点分析主要使用词法和语法分析等方法,在离线状态下分析变量之间的数据和控制依赖关系。与其他静态分析技术一样,静态污点分析技术仍然存在分析结果不够准确的问题。
动态污点分析
动态污点分析技术的原则是标记来自不受信任源的数据,追踪并记录程序执行期间其传播过程,并检测污点数据的非法使用,以实现检测漏洞的目的。
动态二进制仪器分析侧重于程序运行时的实际行为。它直接监视程序执行过程,并在不破坏目标程序原始逻辑的基础上插入指令流。以 Pin [10] 平台为例,动态二进制仪器分析框架如下图所示。

研究现状
- Dong等人(2018年)提出了一种用于挖掘二进制漏洞的动态污点分析系统ODDTA。该系统在污点识别过程中扩展了污点状态的定义,并在污点标记过程中细化了污点状态属性的定义。在污点检测阶段,进一步扩展了安全检测规则,并根据安全规则的不同级别设计了不同的响应策略。
- Yin等人(2010年)提出了基于QEMU虚拟化器的扩展平台TEMU。TEMU使用系统范围的视角分析内核和多个进程之间的交互,并以细粒度的方式进行深入分析。
- 其他研究:将动态污点分析和静态污点分析结合,弥补动态分析中路径覆盖不足导致的信息损失,还可以提供静态分析无法获取的一些准确操作信息。
存在的问题
- 隐式流分析问题
静态隐式流分析面临的核心问题是无法在准确性和效率之间取得平衡。路径敏感的数据流分析往往会引起路径爆炸问题,导致无法接受的开销。为了降低成本,一种简单的静态传播分支语句污点的方法是标记所有受其控制的语句。然而,这种方法会导致一些不携带私人数据的变量被标记,从而引发过度污染。
动态隐式流分析的主要问题是在污点控制条件下确定需要标记的语句范围。目前的研究大多使用离线静态分析来辅助判断。Clause等人[13]提出使用离线静态分析获得的控制流图节点之间的后支配关系来解决动态污点传播中的隐式流标记问题。第二个问题是由于某些受污染信息泄露而导致潜在安全问题的被漏报。Vogt等人[14]在传统动态污点分析的基础上增加了离线静态分析,用于追踪动态执行过程中的控制依赖关系,并标记在污点分支的控制范围内的所有赋值语句中的变量。但仍然存在污染问题。第三个问题是如何选择适当的污点标记分支进行污点传播。污点标记分支的选择策略可以根据信息泄露的不同范围进行定量设计。
Harry:
在污点分析中,污染问题是指当程序中的某个变量或数据被标记为"污点"(即可能受到恶意输入或不受信任的数据影响时),这个标记可能会在程序执行过程中扩散到其他变量或数据上。这种扩散可能会导致本不应该受到影响的变量或数据被误认为受到了污点数据的影响,进而引发错误的污点传播,最终导致分析结果的不准确性。
污染问题的出现主要是由于程序的复杂性和数据流的复杂交织关系。在分析过程中,如果对程序的控制流和数据流没有准确的把握,污点标记就可能被错误地传播到不应该被标记的变量上,从而引发污染问题。
- 缺乏语义信息的问题
由于二进制代码缺乏必要的语义和类型信息,动态污点分析技术在二进制程序分析中的应用受到限制。Zhuge等人提出了一种基于类型感知和面向类型变量的符号执行技术的动态污点分析技术。这项技术将二进制程序分析中的动态污点分析推进到了变量级别。
- 分析开销问题
当前的解决方案之一是选择性地控制需要被标记为污点的指令数量,并结合其他方法以获得更好的优化结果。
符号执行
符号执行的概念最早由King等人于1975年提出。其基本原理是使用抽象符号替代程序变量。程序计算的输出被表示为输入符号值的函数,并且根据程序的语义遍历程序的执行空间,以进行相关分析。
在通过符号执行对二进制程序进行漏洞分析时,首先需要获取程序的中间表示。然后进行符号执行和约束求解,以获得漏洞分析结果。该分析过程如图所示。

- 经典符号执行:执行基于分析过程,通过符号值模拟执行。由于经典符号执行缺乏程序动态运行时信息,难以完全模拟程序执行,因此分析结果不够准确。
- 动态符号执行:结合了具体执行和经典符号执行的优势,提高了分析的准确性。
研究现状
- Bush等人(2000年)提出了一种基于静态符号执行的漏洞挖掘工具Prefix,它利用路径敏感性和进程分析提高了准确率。因此,符号执行技术可以应用于漏洞挖掘领域。
- 动态符号执行技术如KLEE (2008年)、Mayhem (2012年)、SAGE(2008年)、S2E(2011年)、KLEE(2008年)。
- 其他二进制分析工具如BitBlaze、SmartFuzz
存在的问题
- 路径爆炸问题
路径爆炸问题是限制符号执行在实际程序分析中应用的主要因素。在符号执行的分析过程中,在每个分支节点,符号执行将推导出两个符号执行实例,程序分支路径的数量随着程序分支数呈指数增长。
缓解路径爆炸问题的主要思路如下:
- 使用启发式搜索方法搜索程序路径空间。Sen等人[28]在CUTE和jCUTE中使用了混合随机符号搜索策略,以改善测试的广度和深度。
- 状态合并。2014年,Avgerinos等人[29]提出了Veritesting的概念,通过状态拟合减少程序的状态空间,提高了动态符号执行的可用性。
- 剪枝多余路径。在程序分析过程中,一些路径是多余的。通过分析确定并剪枝这些多余的路径。挑战在于多余路径的判断更加复杂,难以全面判断。对多余路径的错误判断可能导致对目标分析的错误。
- 约束求解问题
符号执行在程序分析中的效率在很大程度上取决于约束求解的效率。约束求解的核心问题是将路径条件的算术约束转化为基本求解器问题。
非线性整数约束通常会使路径条件无法解决,具有非线性约束的约束集的可解性通常是不可判定的[30]。
- 求解器无法处理路径约束条件中包含的外部库函数调用[31]。研究人员还提出了一些约束求解的优化方法:无关约束消除技术和缓存解决策略[20]。
- 消除无关约束。无关约束消除的目的是通过分析减少约束项的数量。原因在于,程序分支通常只依赖于程序变量的一小部分,并且分支依赖的程序变量可能与路径上其他约束中包含的变量无关。
- 缓存解决策略。相邻执行之间的约束信息仅略有不同,因此理论上,解决结果也只有轻微的差异。Ramos等人[32]于2015年提出了一种懒惰的约束解决策略。核心思想是仅当分支判断到达目标位置时,查询求解器验证路径的可达性并生成测试用例。
模糊技术
模糊测试技术最早由Miller等人[33]于1989年提出。模糊测试是一种基于缺陷注入的自动化软件测试技术。它使用大量半有效数据作为应用程序的输入,并利用程序的异常作为标志,发现应用程序可能存在的安全漏洞。
模糊测试的工作流程大致经过三个基本阶段。
- 预处理阶段:收集与目标相关的信息,并制定模糊测试策略。
- 测试阶段:进入数据链路以获取大量数据后,通过输入选择链路过滤无效输入数据。判断部分主要是设计适当的实验,并根据终止条件评估和判断模糊测试。
- 结果分析阶段
模糊测试的工作流程如图所示。

根据对程序内部结构分析的深度,模糊测试技术可以分为白盒、黑盒和灰盒模糊测试。
根据样本生成方式,模糊测试的测试输入可以分为两种方式:基于突变和基于生成的方法[8]。基于突变的模糊测试方法使用现有数据的突变技术来创建新的测试用例。基于生成的模糊测试方法是通过对要测试的特定程序进行建模,从零开始生成测试用例。
研究现状
模糊测试可以追溯到1989年。1999年,芬兰奥卢大学的协议测试项目团队开发了网络协议安全测试软件PROTOS [34],将模糊测试首次应用于网络协议的测试。这标志着模糊测试技术作为实际工具的开始。
- 在2004年,IOACTIVE发布了著名的跨平台模糊测试框架Peach[35],Peach是基于语法生成输入数据思想的早期应用。
- 同年,Dave发布了开源模糊测试工具SPIKE [36],它采用了基于块的方法,并具有描述可变长度数据块的能力。
- 2008年,微软研究院的Godefroid [37–38]引入了模糊测试方法中的白盒测试思想,并同时将符号执行和约束求解方法应用于模糊测试,提高了模糊测试的覆盖范围。
针对模糊测试在遇到校验和保护机制时的局限性
- 2010年,北京大学的王教授结合了符号执行和细粒度动态污点传播技术,提出了一种绕过验证的方法,并开发了相应的工具TaintScope,为模糊测试应用找出深层次的漏洞排除了障碍。
- 2013年American fuzzy lop (AFL) [40]是一种灰盒模糊测试工具,使用少量内部信息来实施模糊测试思想一种。它以覆盖率为导向,通过仪器化方法,收集与输入数据相对应的边缘覆盖率,作为选择模糊测试种子的度量标准。
存在的问题
- 测试用例生成策略的优化问题
传统的模糊测试在生成测试用例时通常会盲目地突变正常测试用例的某个部分,导致测试用例规模膨胀,测试效果较差。目前的改进方法有:
- 引入模拟退火遗传算法 [41–42] 来改善测试规则,使最小的测试用例集合能够覆盖最大的代码执行路径,以便发现那些隐藏的软件漏洞。
- 还可以考虑将模糊测试与其他二进制漏洞分析技术结合起来,相互借鉴经验。
- 自动化程度需提高 模糊测试是一种盲目注入方法,通常需要手动确定输入数据的约束并生成测试用例,这影响了其实际价值。因此,当前研究的重点主要集中在自动化和智能化的模糊测试方法上。一方面,可以考虑使用遗传算法来提高测试自动化程度。另一方面,随着机器学习的迅速发展,如果能找到两者的合适结合方式,就能够最大程度地发挥两者的优势。
4. 机器学习技术
利用机器学习技术帮助相应的漏洞挖掘工具训练海量漏洞数据并生成模型,用于分类和预测样本。最终提高软件漏洞挖掘的准确性和效率。
在基于机器学习的软件缺陷预测方法中,数据预处理比分类器的选择更为重要。
机器学习的基本过程如图所示。

研究现状
- 基于软件度量的漏洞预测
软件度量 [46] 是对软件开发过程中的产品进行持续定量分析的过程。软件度量是特定软件属性的定量表示,包括复杂性、耦合度和内聚性等指标。软件度量方法只需将软件度量作为特征集,然后使用机器学习中的监督学习方法来训练模型,以预测软件组件的漏洞。
2。 基于异常检测的漏洞预测
异常检测是指发现不符合正常行为模式的数据的过程。
- 2010年,Gruska等人 [47] 提出了一个跨项目异常检测模型,该模型提取了指定函数中所有可能的函数调用序列和相关信息,并最终建立了该函数的有限自动机模型。
- 2013年,Yamaguchi等人 [48] 提出了一个结合机器学习和静态代码分析的系统,用于检查源代码中的遗漏检查。通过使用最近邻技术找到指定函数的邻居,然后将该函数及其邻居函数映射到向量空间,计算映射后的向量中心,并将距离中心较远的函数标记为异常。其优势在于它可以自动发现由于API的不当使用和忽视条件和遗漏检查而引起的软件漏洞。
- 基于漏洞模式识别的漏洞预测
使用机器学习方法从漏洞代码样本中提取易受攻击的代码模式,然后使用模式匹配技术在软件中检测和定位漏洞。
- 2012年,Yamaguchi等人 [49] 使用信息检索技术提出了一种漏洞提取方法,用于辅助软件安全审计。
- 2014年,Yamaguchi等人 [50] 将传统程序分析中的抽象语法树、控制流图和程序依赖图的概念合并到一个代码属性图中,然后以图遍历的形式进行漏洞建模。
- 2014年,Pewny [51] 首次提出使用文本分析技术预测易受攻击的软件组件。
- 2017年,Young等人 [52] 提出了一种基于深度学习的汇编代码表示方法。基于Word2Vec,他们提出了一种适用于汇编指令向量表示的Instruction2vec方法,然后采用卷积神经网络模型和循环神经网络模型来预测软件缺陷,结果显示效果非常好。
目前,大部分研究集中在源代码上,只有少数研究二进制软件。
二进制程序功能识别是二进制分析的基础。然而,由于二进制代码缺乏高级语言程序中的信息,因此通常难以识别函数。
- Bao提出了ByteWeight方案,使用机器学习算法实现了对二进制程序函数的识别。首先,使用加权前缀树学习函数的签名,然后通过签名与二进制片段匹配的方式来识别函数。然后,使用值集分析和增量控制流恢复算法来实现对函数边界的识别。
Harry:
论文中缺少了ByteWeight的论文引用,补充如下:
Bao, Tiffany, Jonathan Burket, Maverick Woo, Rafael Turner, and David Brumley. "{BYTEWEIGHT}: Learning to recognize functions in binary code." In 23rd USENIX Security Symposium (USENIX Security 14), pp. 845-860. 2014.
存在问题
- 数据收集
目前还没有可用作基准的公开漏洞数据集。
对于二进制程序,通常需要在使用机器学习模型进行训练之前将其转换为中间语言。因此,需要建立一个包含相关语义信息的开放且功能强大的中间语言数据集。
- 特征选择
在二进制程序中,静态特征可以从调用图、控制流图、数据流图等中获取,但是建立基于图的结构会涉及大量计算。
动态特征可以通过插桩执行,跟踪实际函数调用并捕获调用参数的方法,但插桩的开销也非常大。甚至在程序实际执行时可能影响内存的空间布局。
- 模型选择
将机器学习应用于漏洞研究,特别是二进制程序的漏洞挖掘,仍处于初级阶段。如何利用机器学习模型的强大性能进行漏洞挖掘和漏洞评估是一个难题。某些机器学习模型通常只适用于特定场景,甚至在相同场景中,不同模型的效果也会有很大差异。
5. 展望
- 在直接利用二进制代码中的漏洞时,构建相应的二进制信息数据库,以便进行后续分析;
- 在使用中间语言进行漏洞挖掘时,确保二进制信息完整。
- 在使用污点分析、符号执行和模糊测试分析程序之前,可以使用机器学习对数据进行预训练,并生成模型以引导生成高质量的测试输入样本。
- 利用污点分析技术跟踪影响条件分支的测试输入中的字节,以减少路径数量;同时,结合符号执行技术和模糊测试进行漏洞挖掘。该二进制漏洞分析框架的流程如图所示。

