APP下载

面向HDF5格式预训练模型的模糊测试方法

2023-01-09瞿铸枫张立强

郑州大学学报(理学版) 2023年1期
关键词:测试用例确定性字节

严 飞,瞿铸枫,张立强

(武汉大学 国家网络安全学院 空天信息安全与可信计算教育部重点实验室 湖北 武汉 430072)

0 引言

近年来,深度学习技术不仅应用在自然语言处理、图像识别等传统场景中,还开始应用在自动驾驶、语音指令识别等新场景中。随着对可信运行环境要求的日益提高以及可信服务技术的不断发展,深度学习系统也被提出了更高的可信性与安全性要求。HDF5文件格式可以存储大型复杂数据,其文件结构包含数据集和群组两种对象类型。同时,HDF5使用B树索引对象,形成一个分层的文件结构。深度学习库Keras[1]使用HDF5文件格式进行模型序列化,存储模型的权重数值,实现模型在其他工程中的快速部署。此外,其他开发者可以通过互联网方式获取预训练HDF5模型文件并在工程中导入模型,省去训练开销。这使得HDF5文件成为机器学习系统的一个攻击面,如果开发者获取被恶意篡改的HDF5文件,那么深度学习系统可能面临被攻击的风险。

目前,对深度学习系统的模糊测试目标集中在预测准确性上[2-8],意图通过对图像进行变换等操作发现深度学习模型中存在的漏洞,并实现类似对抗样本的攻击方式。传统的对抗样本攻击不会影响机器学习系统的基础功能,只有在遇到某些特定输入时机器学习系统才会有预期以外的表现。加载恶意HDF5模型文件引发的安全问题,不仅有可能修改模型参数导致深度学习系统预测精度的下降,还有可能影响系统的稳定性、可靠性。

模糊测试是公认的最有效的漏洞挖掘与安全测试技术之一,已经在各种应用程序[9-10]、系统内核[11]、通信协议[12]、智能合约[13]等领域表现出优异的漏洞挖掘性能。AFL是目前最流行的灰盒模糊测试工具之一[14],可以在不同类型的测试目标上快速实施模糊测试。但是AFL缺乏对输入文件格式结构的关注,导致其在不同的模糊测试任务中的表现存在较大差异,并且对输入格式有较严格约束的对象效果较差。

本文结合HDF5的官方文档,对输入的模型文件进行轻量级文件结构识别,并生成扩展影响图。根据扩展影响图,在确定性阶段对种子文件中特定区域着色,以此减少不必要的尝试次数。而后定义了扩展影响图的变异策略,使得输入文件在经过小幅度位翻转、数值加减以及内容增删之后,扩展影响图仍具有较高的指导作用。在变异输入文件时,同步操作扩展影响图,并且对操作区域作一定程度的扩散,在下一轮测试中使用新扩展影响图进行指导,对扩展影响图上新增标记位进行考察,撤销无价值的新标记位。在对HDF5文件进行模糊测试时,本文工作能在保持不大量损失覆盖率、崩溃触发等收益的前提下更快速地完成一轮测试,探索程序的深层路径。

1 相关工作

1.1 HDF5

HDF5是一种分层数据存储结构[15-16]。HDF5文件以有向图的形式向用户开放,其文件结构和对象结构如图1所示。HDF5以树状结构存储在磁盘中,这也是HDF5工具集以及深度学习框架加载模型时直接接触到的存储格式。HDF5使用底层对象组成用户可以接触到的上层对象,在树形结构中将底层对象分为三个层级。其中,0级定义了文件的元数据,1级以B树结构定义了文件的基础结构,这两层构成了数据对象存储框架;2级为数据对象,存储了用户最终将接触到的所有数据。

1.2 文件格式模糊测试

文件格式模糊测试通常不需要提供种子文件作为初始的测试用例,而是根据一个模板生成测试用例。Peach是一个经典的开源文件格式模糊测试框架[17],被广泛应用于挖掘各种文件解析软件的漏洞,近年来也被应用于对工业控制网络协议进行安全分析[18]。Peach使用XML格式的输入模型详细地记录输入的文件结构,然后根据模型生成新的输入,对输入进行建模使得Peach能生成合法的输入。但是,Peach生成的初始种子的质量,高度依赖于给予的XML模型质量。而文件建模通常必须经由人工分析文件格式进而编写得出,当输入文件格式没有官方文档可供参考(如生僻、私有格式等)时,人工成本会大幅增加,并且生成文件的建模质量会下降,进而导致模糊测试性能不佳。

由于Peach只关注了输入的文件结构,缺少灰盒模糊测试的覆盖反馈[19],这使得Peach在实验中的性能甚至低于AFL。因此,AFLSmart将Peach与AFL相结合,同样使用XML模型生成输入,以确保生成的输入具有较高的有效性,利用AFL的灰盒模糊测试策略对输入进行测试与变异,并且提出基于有效性的能量调度策略,为具有更高有效性的输入分配更多能量。在输入建模方面,AFLSmart引入了十六进制编辑器010Editor[20],丰富文件结构模板,进而简化人工分析的工作量。尽管010Editor提供了202个常见文件格式的结构模板[21],但是它依然不支持解析HDF5文件格式。

ProFuzzer[22]不同于传统的文件格式的模糊测试,该方法不需要文件格式的先验知识,而是在模糊测试过程中增加一个探测过程。该过程尝试根据每个字节的不同取值对程序执行路径的影响来推断该字节的数据类型,并将相邻同类型的字节合并为该类型的字段。接着,ProFuzzer将探测过程得到的推断结果传递给正式的模糊测试过程来指导未来的输入变异。但是,整个探测过程需要遍历文件的每个字节,并且每个字节都要尝试0x00~0xFF的取值,如果文件很大,测试目标执行速率又低,探测过程将相当漫长。

1.3 AFL

AFL通过变异用户提供的种子文件生成新的测试用例来到达程序中未探索过的新路径,提高测试的覆盖率指标。为了避免过大的开销影响模糊测试的效率,AFL使用轻量级的编译时代码插桩技术,以捕获分支覆盖率并粗粒度地记录分支命中计数。AFL的变异主要分为确定性阶段以及非确定性阶段。在确定性阶段,AFL按字节序对测试用例执行不同长度与步长的位翻转、小数值的加减、有趣数值(0,1,最大整数等)的覆写;在非确定性阶段,AFL会随机叠加多次位翻转、块插入、块删除、数值加减和不同测试用例间的块拼接等变异操作。确定性阶段倾向于生成紧凑的测试用例,并且察觉崩溃输入与未崩溃输入之间的细小差异[23],而非确定性阶段则引入更多的随机性,尝试生成更分散的输入。由于确定性阶段需要对测试用例空间进行遍历,导致该阶段会占用一次模糊测试过程中的大部分时间[24]。Zong等[25]指出,在一个完整的模糊测试过程中,极大比例的测试执行都是无收益的。EcoFuzz则直接删除了整个确定性变异阶段,完全使用非确定性阶段对目标程序进行模糊测试[10]。

AFL在对一个测试用例的一次确定性模糊测试中维护一个影响图。在进行逐字节翻转阶段中,AFL筛选出能到达新路径或程序状态的字节并在影响图中置位。在接下来的多字节翻转以及数值加减阶段中,当AFL正在测试的位未在影响图中置位时,AFL会跳过对这个位的剩余确定性阶段测试而向后探索测试用例的后续位。该策略使得AFL在对某些冗长的文件进行测试时,削减了10%~30%的无用执行。

2 方法概述

本文提出一种HDF5文件格式敏感的灰盒模糊测试方法,对初始种子文件进行结构分析,筛除重复类型对象以及冗余数据块;使用分析结果指导模糊测试框架削减确定性变异阶段的无效变异尝试次数,并增加非确定性变异阶段中对测试输入文件结构的关注。

2.1 面向HDF5模型文件的确定性变异阶段削减

HDF5文件格式被Keras用于存储深度学习模型。一个经验性结论是:在HDF5格式的模型文件中,全零字节的预留字段以及浮点数类型的权重参数字段占比较大,但翻转这些数值位并不会对程序执行状态产生影响。即在模糊测试过程中对这些字段进行突变并不能获得良好收益,而且会消耗不必要的计算资源和时间成本。

2.1.1扩展影响图 扩展影响图定义了当前正测试用例中值得进行测试的字节,其大小与测试用例相同,且随着测试用例的变化同步更新。扩展影响图中每个字节的值代表了测试用例中对应字节的变异价值,即MAP[offset]=Valuable(Testcase[offset])。

2.1.2轻量级HDF5文件结构识别 对于给定的种子输入,根据HDF5 V1.1规范文档,从测试用例中提取关键非数据集结构体,在结构体对应位进行标记,并生成扩展影响图。结合官方文档提供的详细数据结构信息,识别出HDF5文件中的超级块、B树节点、组节点、本地堆、全局堆等基础结构对象,并分别记录其起始地址以及对象大小,接着从识别出的组节点符号表中提取出数据对象的地址。提取数据对象中存储的数据类型,剔除HDF5模型文件中用于存储各个层权重参数的大数据块,将其余识别出的结构在扩展影响图中进行标记,认为其是有探索价值的。

2.1.3测试用例变异空间缩减 对HDF5文件中同类型对象的相同字段进行同样的变异,对执行路径的影响是几乎相同的。AFL依据边覆盖情况来判断一个崩溃是否不同于已经发现的崩溃,即当且仅当:① 崩溃路径中包含一个未在已有崩溃中出现过的边;② 崩溃路径中缺少一个已有崩溃中时常出现的边时,AFL会将其识别为两种不同的崩溃,即记录为两个唯一崩溃。由于程序对同类型对象的处理存在先后差异,导致AFL将本质相同的崩溃识别为不同的崩溃。同时,不加约束的输入变异空间也导致了极长的模糊测试确定性阶段。

本文通过对扩展影响图进行着色,收缩模糊测试确定性变异阶段的测试用例变异空间。对于HDF5格式的测试用例中相同类型的对象,随机选择小部分在确定性变异阶段进行变异尝试。换言之,对测试用例变异探测范围的树状结构进行修剪,在一轮模糊测试的确定性阶段忽略这部分重复类型的对象。随机选取测试用例t中不同类型的若干对象,在扩展影响图的对应比特位置位,即着色。在确定性变异阶段,使用扩展影响图指导模糊测试框架仅对测试用例着色区域进行位翻转、字节翻转等确定性变异,从而降低对测试用例t中冗余或重复部分的关注,将计算资源集中在扩展影响图标记的更具变异尝试价值的位置,减少无用执行次数以及重复崩溃数量。

2.2 HDF5格式敏感的对象变异策略

原始的AFL变异策略不考虑测试用例的格式与结构。受AFLSmart中以结构块为单位进行变异的启发,设计了HDF5文件结构敏感的以对象为单位的变异策略:对象删除、对象复制、对象覆写。

2.2.1对象删除 如图2所示,给定一个HDF5格式的测试用例,随机选择并删除一个对象。分析当前队列中测试用例t的结构,从中随机选择任一类型的一个对象O。接着从内存中删除对象O的对应区域,将对象O前后两块内存拼接生成新的测试用例new_t。对新测试用例new_t进行评估,选择是否保留。如果保留,则同步更新扩展影响图,删除扩展影响图中的对应区域。

图2 对象删除Figure 2 Object deletion

2.2.2对象复制 如图3所示,给定一个HDF5格式的测试用例,随机选择并复制一个对象,插入随机位置中。与智能对象删除策略类似,随机选择测试用例t中任一类型的一个对象O和一个随机位置insert_pos,将对象O插入该位置中,生成新的测试用例new_t。对新测试用例new_t进行评估,选择是否保留。如果保留,则同步更新扩展影响图,复制扩展影响图中的对应区域进同一位置insert_pos。

图3 对象复制Figure 3 Object clone

2.2.3对象覆写 如图4所示,给定一个HDF5格式的测试用例,随机选择源对象O1与目标对象O2,将对象O1复制到O2位置并覆写对象O2区域。该变异策略首先决定源对象与目标对象是否为相同类型,以及以等概率选择本次变异为同类型对象间覆写或跨类型对象间覆写。然后,考虑源对象与目标对象长度差异的三种情况,分别提出不同情况下的处理策略:① 当两对象长度相同时,直接进行覆写即可;② 如果源对象O1的长度O1.size大于目标对象O2的长度O2.size,随机选择仅覆写源对象O1的前O2.size长度内容,或是完整覆写源对象O1内容;③ 如果源对象O1的长度O1.size小于目标对象O2的长度O2.size,随机选择保留覆写后剩余的(O2.size-O1.size)长度的内容,或者以随机字符填充该剩余区域。

图4 对象覆写Figure 4 Object overwrite

3 系统实现

在AFL2.57b基础上加入确定性变异阶段削减、对象变异策略等模块,实现了原型模糊测试框架HDFL。HDFL保留了原始AFL中的预处理、输入生成、输入评估等组件结构,增加了确定性变异阶段削减与HDF5格式敏感的变异策略模块。HDFL框架如图5所示。

4 实验与评估

4.1 实验设置

实验机器为Intel I5-9400处理器,16 G内存;实验平台为64位 Ubuntu20.04操作系统的虚拟机;使用的种子文件为互联网上可获取的HDF5格式模型参数文件[26]。通过与AFL进行比较,对HDF5 1.13版本提供的工具集程序进行测试,对比8 h内HDFL与AFL、EcoFuzz分别获得的覆盖率以及挖掘得到的唯一漏洞数。实验中的HDFL、AFL、EcoFuzz以及目标程序h5debug、h5dump、h5ls均使用gcc9.3.0编译。

图5 HDFL框架Figure 5 Framework of HDFL

4.2 实验结果

首先分析了HDFL生成的扩展影响图的着色规模。在大小为48 544字节的测试用例扩展影响图中共标记了3 200字节,仅为原测试用例大小的6.59%。图6和图7分别为AFL、EcoFuzz、HDFL对h5debug、h5dump、h5ls经过8 h的模糊测试获得的覆盖率结果和崩溃数量结果。结果表明,与AFL相比,本文提出的对确定性阶段的精简方法并不会引起覆盖率或崩溃数量的严重缺失,反而因为HDFL压缩了确定性变异阶段,减少了一次确定性变异过程所需要的时间,使得HDFL比AFL有更多的时间进行更具随机性的非确定性变异环节,以探索更多的程序空间。

图6 覆盖率结果Figure 6 Coverage results

图7 崩溃数量结果Figure 7 Crash number results

由图6可知,原型系统HDFL在对h5debug、h5dump、h5ls的测试中均获得了接近甚至略高于AFL的覆盖率结果。由于h5debug和h5ls的代码逻辑较简单,对测试输入中结构的约束不强,在这两个程序上并没有得到很好的收益。而在对输入文件整体有较高结构完整性要求的h5dump程序中,得益于HDFL中更简短的确定性变异阶段以及更关注HDF5文件格式的智能对象变异策略,原型框架提前约5.25 h达到了AFL测试8 h获得的覆盖率。由图7可知,原型系统HDFL发现的崩溃数量比AFL多出约30%。此外,可以观察到,除h5dump的覆盖率收益,HDFL在其他程序上得到的覆盖率与崩溃收益均略低于EcoFuzz。经分析,这是由于EcoFuzz跳过了确定性变异阶段,直接使用高度随机化的非确定性变异去探索程序的执行路径,借助自定义的能量调度策略,实现了更高的覆盖率与崩溃数量。而后尝试了使用跳过确定性变异阶段的AFL(AFL-d模式)对h5dump进行测试,得到了高于原始AFL和EcoFuzz的覆盖率收益,结果如图8所示。这在一定程度上反映了确定性变异阶段中存在相当多的冗余或无意义测试执行。

图8 h5dump额外实验覆盖率结果Figure 8 Extra coverage result of h5dump

但是,跳过确定性变异阶段而直接进行充满随机性的变异会导致测试结果也充满了不确定性。在分析了EcoFuzz和HDFL在h5dump上发现的每个崩溃的栈回溯信息后可以看出,尽管EcoFuzz发现了更多的崩溃,但是由于EcoFuzz复用了AFL中对唯一崩溃的评判标注,其中大量的崩溃实际上是输入文件中不同对象的相同类型字段导致的相同原因的崩溃。此外,由于EcoFuzz的策略大大增加了模糊测试的随机性,在多次重复实验中,EcoFuzz时常会遗漏HDFL记录的崩溃。因此,对本实验对象而言,完全跳过确定性变异阶段并不是一个明智的选择。本次测试中使用HDFL挖掘了多个首次发现的漏洞,并报告给HDF5组织。

5 结束语

本文提出一种面向HDF5文件格式的深度学习模型模糊测试方法。与传统的模糊测试方法相比,该方法在避免投入大量人工成本对模型文件结构进行分析的同时,用轻量级的结构分析方法标记测试用例中有变异价值的字节,并筛除文件树状结构中相似度较高的重复结点,生成扩展影响图,接下来的变异探索依靠扩展影响图指导模糊测试框架精简确定性变异阶段。考虑HDF5文件结构的智能变异策略,分别对HDF5模型文件中的对象结构进行删除、复制与覆写。搭建模糊测试原型框架HDFL,对HDF5配套工具进行测试,实验结果表明,本文方法在有效减少确定性变异阶段无价值执行的同时,不会造成覆盖率与崩溃数量的大幅度减少。目前,本文方法初步实现了对HDF5格式的深度学习模型文件的测试,后续可以考虑增加对其他模型文件格式的支持,以提高本工作的通用性。

猜你喜欢

测试用例确定性字节
论中国训诂学与经典阐释的确定性
论法律解释的确定性
含混还是明证:梅洛-庞蒂论确定性
No.8 字节跳动将推出独立出口电商APP
回归测试中测试用例优化技术研究与探索
基于SmartUnit的安全通信系统单元测试用例自动生成
No.10 “字节跳动手机”要来了?
基于MSP430的四旋翼飞行器的S-BUS通信协议的设计与实现
法律确定性的统合理性根据与法治实施
基于依赖结构的测试用例优先级技术