基于人机协同的漏洞挖掘框架设计*

2024-03-20 01:16方恩博范希明
通信技术 2024年2期
关键词:测试工具污点漏洞

方恩博,范希明,贾 鹏

(1.中国电子科技集团公司第三十研究所,四川 成都 610041;2.四川大学 网络空间安全学院,四川 成都 610200)

0 引言

模糊测试是现代漏洞挖掘最有效的技术之一,其为被测程序提供大量输入,并监视其出现的异常行为,例如堆栈溢出、越界读写、内存泄漏等[1]。自从模糊测试的方法问世以来,其在业界和学界受到广泛关注并不断发展,基于此,研究人员开发了各种工具应用于不同的测试场景。近年来,随着AFL[2]家族的出现,灰盒模糊测试的发展不断完善,并取得了优秀的成果。

群体智能思想是近年来热门的研究方向,研究人员将人的先验知识与机器的算力相结合,在部分领域取得了很好的成果。基于此,本文在模糊测试中引入人机协同的思想,让专家来解决模糊测试执行中遇到的问题。首先,对每一个专家的特点和经验进行量化描述并绘制知识图谱,以此作为任务分配的依据;其次,实现了任务自动化拆分和分配模块,将每一个漏洞挖掘任务自动化拆分为若干子任务,再对每一个子任务分配相应的专家或机器;最后,每一个漏洞挖掘任务都由若干台底层机器完成,每一台机器都配有若干个漏洞挖掘工具,按照专家的建议选择某种工具。在LAVA-M 测试集和两个真实程序上进行实验,底层使用20台并行化的主机,结果远优于AFL。

1 相关技术介绍

1.1 模糊测试

模糊测试是指向待测程序提供大量畸形数据作为输入,监视程序的异常情况,并基于导致异常的输入分析发现漏洞的一种方法[1]。根据测试用例生成的方法,模糊测试可以分为基于生成的模糊测试和基于变异的模糊测试。前者需要已知的数据格式,在不破坏格式的前提下生成测试用例;后者是将初始数据进行大量变异,生成测试用例。按照对待测程序的分析程度,模糊测试方法可以分为白盒模糊测试、灰盒模糊测试和黑盒模糊测试。白盒模糊测试需要全部源代码,黑盒模糊测试则不需要任何待测程序的信息,灰盒模糊测试介于二者之间,通过运行时的反馈来指导模糊测试。模糊测试已在漏洞挖掘领域发挥重要作用,但其仍然面临着许多问题,如代码覆盖率不高,不能完全探索程序空间等。目前主流的模糊测试工具有Peach[3]、AFL、AFLGo[4]等。

1.2 符号执行

符号执行是指将程序的约束条件转化为抽象的符号,则一个程序的输出即可转化为一个关于输入的函数。符号执行可以得出到达目标代码段所需要的输入条件。符号执行分为静态符号执行和动态符号执行,其中静态符号执行是通过符号值模拟程序执行,而动态符号执行是在程序运行时进行约束求解。虽然符号执行可以达到较高的代码覆盖率,但是其状态空间爆炸、复杂约束无法求解、资源开销过大等问题限制了符号执行的实际使用[5]。目前,主流的符号执行工具有KLEE[6]、CUTE[7]、DART[8]、angr[9]等。

1.3 污点分析

污点分析的核心思想是跟踪污点数据在程序执行中的传播情况。污点分析可以分为静态污点分析和动态污点分析。静态污点分析通过对源码或者汇编代码进行分析,建立寄存器和数据之间的顺序依赖关系,依次判断污点数据的传播路径;动态污点分析是指在程序执行过程中,结合插桩的手段跟踪污点数据的流向。污点分析同样面临着隐式流、污点清除和开销过大的问题。目前主流的污点分析工具有TaintCheck[10]、Dytan[11]、libdft[12]等。

2 整体流程与核心模块设计

该框架整体流程如图1 所示。首先,当框架收到一个Fuzz 任务时,该框架将Fuzz 任务和其相关信息传入漏洞智能拆分模块。该模块依据环节不同、策略不同,将一个Fuzz 任务拆分为若干子任务。

其次,当任务拆分结束后,该框架将每一个子任务与相关信息传入漏洞智能分配模块。该模块通过任务类型、个体特长、任务完成情况等信息对每一个个体进行打分,得出结果后,将每一个子任务分配给相应的个体。其中每一个个体都由事先的个体建模得到。

再次,当每一个个体收到子任务后,开始执行相关的漏洞挖掘任务,其中,机器自动化执行过程中,遇到问题可以参考专家意见或者由专家介入代为处理。

最后,在所有机群和人群个体完成任务后,将所有任务进行汇总。汇聚的结果经过去重后传入结果与crash 分析,以详细获取漏洞信息。根据每个个体产生的结果,系统会评估每一个个体的工作情况并打分。该分数将不断积累并影响接下来的任务分配,如果某一个体在其从事的任务上效果并不理想,则根据相关算法降低其再次接受同种任务的概率。

2.1 基于知识图谱的个体库

个体库从多个维度对专家和机器进行描述,其中,专家个体库的特征维度如表1 所示,机器个体库的特征维度如表2 所示。

表2 机器个体库的特征维度

基于上述维度,对每个个体进行建模,并基于neo4j 数据库建立知识图谱。在后续的任务分配算法中,会根据各个维度的值对子任务进行合理的分配,每个子任务会选择最合适的专家或机器。

2.2 自动化任务拆解和分配模型

如图2 所示,将一个漏洞挖掘任务拆分为若干个子任务,这样每一个个体可以寻找到最适合其自身优势的子任务。以模糊测试为例,将一个模糊测试任务拆分为种子选取、测试过程、异常处理和crash 分析4 个子任务。其中,测试过程是通过并行若干台模糊测试终端实现。种子选取是指,由被指派该子任务的专家个体对当前待测试程序进行静态分析,得出哪些种子可能对模糊测试效果更好,对初始种子队列进行精简和增添。异常处理是指,当模糊测试工具长时间陷入覆盖率停滞状态时,该框架允许专家介入程序现场,通过逆向分析的方法判断当前程序是已经达到了覆盖率饱和状态,还是无法通过某些路径,专家可以手动分析该路径的约束条件,从而修改种子或修改模糊测试工具的字典,以通过该路径约束,crash 分析是指当模糊测试工具发现crash 时,需要对所得的种子进行crash 分析,判断crash 成因并生成poc。虽然对不同的模糊测试工具存在不同的子任务拆解策略,但是模糊测试的大体拆解思路按照上述实现。当任务拆解完成后,根据各项维度的值选择最合适的个体进行任务分配,并在每一次任务完成后,根据评估算法调整个体的表现情况,以便在下一次任务分配时可以制订更加合理的分配方案。

图2 自动化任务拆解和分配模型(以Fuzzing 任务为例)

2.3 并行化漏洞挖掘引擎

如图3 所示,当专家完成种子选择后,即开始模糊测试。每一台机器中都包含如AFL、AFL-Fast[16]、InsFuzz 等开源模糊测试工具,按照专家的建议采用相应的模糊测试工具。在并行化中,最重要的问题是解决bitmap 合并,本文采用的方法是在服务器端不断地轮询每一个节点,从中取出位图和种子文件,然后在服务器端进行合并,合并后再分发给每一个节点。如此一来,实现了位图和种子队列的同步。虽然在过程中会因为轮询顺序导致节点存在同步的滞后性,但是从长时间来看,每一个节点都会分配到其他节点具有价值的种子,并且位图保持一致。

图3 并行化漏洞挖掘引擎框架

此外,本文在某些节点提供了若干符号执行和污点分析工具,虽然这二者由于代价问题不可能每次漏洞挖掘任务都会应用,但是针对某些特殊的场景,需要二者与模糊测试工具相互配合。其中,符号执行工具包括KLEE、S2E、angr 等,污点分析工具包括TaintCheck、TaintDroid 等。

3 实验结果分析

为了验证基于人机协同的漏洞挖掘框架的有效性,选择LAVA-M 测试集和真实世界的两个程序nm-new、readelf 进行测试。为了体现人的先验知识的效果,本次实验采用专家进行预先的静态分析,针对每一次比较指令的判断做出处理,将比较指令的值作为字典加入模糊测试工具中。本次模糊测试使用添加了人工字典的20 台AFL 和20 台AFL 运行5 h 进行对比,体现人的先验知识的效果。

如表3 所示,加入人工先验知识的AFL 效果远优于原版AFL,因此证明,这种基于人机协同的漏洞挖掘框架会大幅度提高漏洞挖掘的效率。

表3 AFL 与AFL(含专家知识)运行5 h 的覆盖率和crash 数量对比

同时,进行另一个实验测试,将专家指导的快速到达目标点的策略引入AFLGo,专家在不同阶段进行不同的种子筛选策略。在Binutils 测试集上与AFLGo 进行对比,将每个实验运行20 次取平均值,时间预算设置为8 h。观察专家指导下的漏洞挖掘框架在通用漏洞披露(Common Vulnerabilities&Exposures,CVE)复现上的能力。

如表4 所示,引入专家知识后的AFLGo 效果优于原始AFLGo,这是因为AFLGo 并没有对更有价值的种子进行排序,而专家知识改变了AFLGo原始的种子选择策略,优先运行更有价值的种子,从而提高了命中目标点的次数,并缩短了CVE 的复现时间。

表4 AFLGo 与AFLGo(含专家知识)的命中目标点次数和CVE 复现时间对比

4 结语

本文实现了一种基于人机协同的漏洞挖掘框架设计,该框架主要由基于知识图谱的个体库、任务智能拆解与分配、并行化漏洞挖掘引擎3 个模块组成。在人的参与下,实验证明其结果要优于传统的漏洞挖掘工具,这种人机结合的思想发挥了作用。在未来的工作中,将会进一步完善人的参与过程,将人机交互接口化,构成一个完整的人机交互漏洞挖掘系统。

猜你喜欢
测试工具污点漏洞
边缘智力儿童及其智力测试工具的研究进展
漏洞
基于代码重写的动态污点分析
Http并发连接测试工具
使用Lightroom污点去除工具清理照片中的瑕疵
三明:“两票制”堵住加价漏洞
漏洞在哪儿
基于移动平台APP 测试
高铁急救应补齐三漏洞
我国“污点证人”刑事责任豁免制度的构建