如需转载请注明出处,侵权必究。
论文题目:AIFORE: Smart Fuzzing Based on Automatic Input Format Reverse Engineering
发表会议:Security 23
本篇论文的第一作者是来自清华大学的 Ji Shi 和 Zhun Wang ,来自张超老师的课题组,课题组主要研究方向为漏洞挖掘和 AI 安全。
概述
Fuzzing 是一种高效的寻找程序中漏洞的技术。通常情况下,Fuzzing 产生大量的输入提供给被测试程序来检测程序漏洞。输入格式描述了程序希望输入的字节是如何组织的。理想情况下,格式良好的输入将被正确地解析和处理,以达到预期的结果。不符合格式的输入将被程序中的解析器过滤掉,并提前丢弃。因此对一个程序的输入格式的了解程度对于有效生成 Fuzzing 的输入至关重要。自动输入格式逆向工程是一种有吸引力但具有挑战性的分析格式的方法。
本文提出了一个智能Fuzzing解决方案AIFORE,AIFORE充分利用逆向格式智能指导 Fuzzing。输入字段的结构和语义是由处理它们的基本块 (Basic Block, BB) 而不是输入规范决定的。AIFORE首先使用字节级的污点分析来识别每个BB处理的输入字节,然后用最小集群算法来识别总是一起处理的不可分割的输入字段,并用一个神经网络模型来学习它们的类型,该模型描述了基本块的行为。最后,作者根据推断出的格式知识设计了一种新的能量调度算法来指导智能Fuzzing。本文实现了AIFORE的原型,并评估了格式推断的准确性和对最先进的 格式逆向解决方案和Fuzzer的性能。AIFORE在字段边界和类型识别的准确性上大大超过了SOTA的基准(baseline)。通过AIFORE,本文在15个程序中发现了20个被其他Fuzzer遗漏的Bug。
贡献
本文的贡献主要有以下四点:
-
本文提出了一种字段边界识别方法,该方法使用污点分析来识别输入字节与基本块之间的关系,并利用最小集群算法分割出不可分割的输入字段。
-
本文提出了一种新颖的基于深度学习的方法来预测基本块所处理的输入字段的类型。
-
本文提出了一种新的基于格式的能量调度算法,以探索不经常出现的输入类型。
-
本文实现了一个新的智能Fuzzing解决方案 AIFORE,并对其进行评估。评估结果表明,AIFORE在输入格式识别和基于格式的Fuzzer的性能优于目前SOTA的解决方案。
挑战
在格式知识的指导下,Fuzzer 可以产生有价值的输入用于探索程序新的路径和利用漏洞。在输入格式推断和格式引导的 Fuzzing 方面目前有很多研究工作,他们试图回答关于输入格式的三个核心问题:不同输入字段的边界在哪里、这些字段属于哪种类型、如何利用输入格式知识来指导 Fuzzing 。
关于输入字段的边界识别,现有的研究主要依靠统计分析或动态污点分析。动态污点分析将由同一指令处理的字节归入一个单一字段,但是这种方法的局限性在于一条指令可能会处理多个输入字段或者一个长字段会被不同指令处理而造成字段的错误识别。统计分析需要大量的输入,这些输入往往不可用。
关于输入字段类型的识别,现有的解决方案一般都依赖于先验知识来提取被传入的字段的类型,这些先验知识比较分散且需要大量的人工分析来构造启发式规则并应用,这将不可避免的引入假阳性和假阴性,另外现有的工作只能识别字段的基本类型,例如 int ,而不能识别其语义类型,例如校验和。
关于输入格式的利用,现有的解决方案一般使用输入格式来指导输入的生成或突变,以尝试测试目标程序中更深的代码,或者使用格式知识来验证种子的有效性。然而,现有的工作(如 AFLSmart)需要人工编写输入格式规范,而如果缺乏字段关系约束的简单模版,就无法区分格式的质量。
Insight
作者分析程序发现以下三点:
-
在大多数情况下,一个不可分割的字段中的字节被放在一个基本块中一起解析
-
当程序处理不同类型字段时,程序代码显示出不同的模式
-
程序可能会根据输入结构的不同调度不同的代码来解析输入
作者根据以上三点观察,认为由于输入字段是由基本块分析的,无论输入格式规范如何,都可以从基本块中推断出输入的结构和语义信息,因此可以通过分析处理不同输入字段的基本块来学习输入字段的结构和语义,然后利用这些知识来进行智能 Fuzzing 。
工作流程
AIFORE的工作流程图1所示。在Fuzzing的过程中,如果一个种子会带来显著的覆盖率提升,就把它称之为有价值的种子。对于每一个有价值的种子,AIFORE分析它的的格式知识,包括字段边界和字段类型知识,来指导Fuzzing。AIFORE使用三个模块共同逆向输入格式知识。第一个模块分析字段边界并将输入分成字段,即具有相同语义的连续字节。第二个模块通过一个基于CNN的模型预测字段类型信息。第三个模块决定哪些种子值得进行格式分析,并将更多的能量分配给那些变异次数较少的格式。
图 1
字段边界分析
考虑到一个由连续的输入字节组成的字段通常在BB中被作为一个整体处理。因此AIFORE使用最小集群( MC )的方法从块级分割字段。首先,作者将二进制代码分割成基本块,如图2所示。然后,作者收集并合并在一个基本块中处理的输入字节。以图2为例,在第一个基本块中收集了偏移量为18、19的两个字节,在第二个BB 中收集了偏移量为16-19和40-51的字节。最后,作者利用污点分析和 最小集群算法来分割字段,例如图2中的18、19字节将被识别成一个字段。
图 2
字段类型分类
因为当程序处理不同类型字段时,程序代码会显示出不同的模式,AIFORE 据此通过对 BB 进行分类以推断出它们所处理的输入字段的类型。具体来说,给定一个字段类型和解析使用这个字段的代码片断,建立一个 CNN 模型将后者映射到前者。
对于 CNN 模型的训练,首先定义支持的六种语义信息:大小、枚举、magic number、字符串、校验和、偏移。然后根据 010 editor 所提供的输入格式知识作为基础知识,并挑选一些著名的程序进行污点分析。给定一个输入字段,作者定位其偏移,从基础知识中确定其类型,使用污点分析确定其相关的 BB 并对 BB 进行前向切片,以合并对给定字段有重要语义依赖的连续子 BB 。在训练 CNN 之前,作者需要对代码片段与类型成对的数据进行数据矢量化得到特征向量。首先对 BB 中的指令进行简化,作者选择了100种常用 IR 语法,将 BB 中的指令转化为中间表示,并用热编码对相应的 IR 操作进行量化。BB中使用的标准库函数和格式化字符串也会作为重要的量化信息。如果一个字段被多个代码片段处理,那么这些代码片段的特征向量将被加在一起,得到这个字段的总特征向量。最后作者使用 (特征向量,字段类型)对来训练 CNN 模型。
能量调度
通过以上两个模块就可以获得输入字段的边界和类型作为输入格式知识。能量调度模块根据输入格式知识对种子进行变异。首先,能量调度模块将分析初始种子以建立格式模型。然后在格式知识的指导下对种子进行变异,如果新变异的种子是有价值的,那么就重新分析它的格式,当Fuzzer未能在规定时间获得新的覆盖率,能量调度模块把能量分配给那些变异较少的格式多对应的种子。
实验评估
RQ1 : AIFORE 的每个格式提取模块的性能如何?
在本文中,作者收集了17个程序以及15中格式来评估 AIFORE ,包括文件输入、网络协议类程序,并且使用010 editor的公共格式模板来解析文件,导出所有带有边界和类型信息的字段记录进行人工预处理作为基础事实。
对于字段边界识别的准确性评估,使用 AIFORE 正确识别的字段数除以基础知识中的字段总数作为准确性的衡量标准。评估结果如图3所示,根据评估结果得出了两个结论。首先,准确性与编译器优化水平无关,这是因为最小集群方法是从语义块的角度考虑的,他几乎不会收到编译器优化影响。第二,作者手动调查了准确率低的目标,原因是程序解析字段的方式,例如程序逐字节检查输入的 magic number,将会导致每个字节使用不同 BB 处理,最小集群算法错误地将 magic number 的每个字节分成一个字段。虽然结果与规范不同,但作者认为这不会影响(甚至有利于) Fuzzing 的效果,因为 Fuzzing 是为了测试程序,而不是为了还原程序输入的规范。
图 3
对于字段类型识别的准确性,作者评估了CNN模型的性能。作者使用8种格式中收集的10,582个字段,以及对应的解析程序来训练模型,并且分别在不同的编译器优化下进行训练,结果如图4所示,CNN模型在不同编译器优化水平下平均准确率超过85%,即使有混合编译器优化,准确率结果也很稳定,这意味着该模型适用于现实世界的情况。
图 4
作者进一步在不同数量的数据上训练模型并取得准确性,将10,582个字段设定为单位(即1.0)尺度,并使用不同的尺度(即0.2到2.0)来训练相应的模型,结果如图5所示,更多的训练数据会带来更高的模型精度。然而,当规模大于1.0时,增长率很快就会停滞。
图 5
作者在对于经过训练的程序,测试了程序是否可以预测未见过的格式的字段类型,应用 AIFORE 对那些已经用某些格式训练过的程序进行测试,对于未经训练的程序,作者选择7个未经训练的程序和相应的格式来测试 AIFORE 的准确性,并验证 AIFORE 是否能识别这些程序的格式,结果如图6所示,AIFORE 可以很准确地预测未见过的格式中的字段类型,而Top-1的准确率平均超过80%,Top-2的准确率超过90%。对于未经训练的程序,AIFORE 能够以平均81%的Top-1准确率和88%的Top-2准确率来预测字段类型。
图 6
RQ2:格式提取的比较
作者使用 AIFORE 与现有的输入格式逆向工程工具 ProFuzzer、AFL-Analyze、TIFF-fuzzer 进行比较,以衡量确定格式逆向的性能。图7的结果显示了字段边界和类型分析的准确性,AIFORE 在字段边界识别和字段类型预测方面都取得了较高的准确性,此外,AIFORE 在训练过的程序中比未训练过的程序表现得更好。
图 7
图8分别显示了解析一个输入的平均时间成本。平均来说,AIFORE 类型预测时间稳定,精确度较高。
图 8
RQ3: Fuzz 性能的比较
作者使用AIFORE与6种Fuzzer进行了比较,分别是AFL、AFLFast、ProFuzzer、TIFF-fuzzer、WEIZZ、EcoFuzz,从图9的结果可以看出,AIFORE增加了代码覆盖率,但是在pngtest上WEIZZ表现更好,原因是WEIZZ不仅能检测到文件中的校验和字段,而且还能修正校验和值,而AIFORE不能进行修正。
图 9
并且,为了探索AIFORE发现漏洞的能力,作者进行了为期7天的测试,AIFORE共发现了34 个bug,其中20个漏洞也被其他Fuzzer发现过。
RQ4: 每个模块的贡献
根据图9的第三栏到第五栏,字段边界识别模块帮助AIFORE对具有相同语义且属于一个字段的字节进行变异,它使AIFORE比AFL多覆盖9.3%的BB,AIFORE使用人工智能模型来预测字段类型,AIFORE对所有目标的代码覆盖率平均又增加了6.9%。最后,AIFORE利用一种新的能量调度算法,帮助Fuzzer为那些没有被充分变异的格式分配更多的能量,使覆盖率增长8.8%。
总结
输入格式知识对于Fuzzing发现程序中的漏洞非常有用。现有的方法在正确识别或应用输入格式方面存在困难。本文引入AIFORE来自动逆向输入格式,然后指导Fuzzing。具体来说,AIFORE利用污点分析来推断负责处理每个输入字节的 BB,并通过最小聚类算法对输入字节进行分组。此外,AIFORE利用一个CNN模型来推断基于BB行为的输入字段的类型。基于输入格式知识,AIFORE使用了一种新的能量调度算法。经过系统的评估表明,这个解决方案比现有的工具有更好的有效性和效率。
供稿:孟煜川、陈波妃
审稿:边顾、洪赓
排版:边顾
戳“阅读原文”即可查看论文原文哦~
。
复旦白泽战队
一个有情怀的安全团队
还没有关注复旦白泽战队?
公众号、知乎、微博搜索:复旦白泽战队也能找到我们哦~
原文始发于微信公众号(复旦白泽战队):白泽带你读论文|ALFORE