摘  要:近年来,随着模糊测试的不断发展,模糊测试工具在实际应用上取得了很好的效果,但是现有模糊测试工具容易陷入停滞状态或无法探索某些路径。基于群体智能的思想,提出了一种基于人机协同的二进制漏洞挖掘框架,该框架实现了基于知识图谱描述的个体库、任务自动化拆解和分配模型、并行化 Fuzz 引擎 3 个部分。大量实验结果证明,人的先验知识对模糊测试有益,在覆盖率和 crash 数量上有更好的表现。

内容目录:

1 相关技术介绍

1.1 模糊测试

1.2 符号执行

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

2.1 基于知识图谱的个体库

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

2.3 并行化漏洞挖掘引擎

3 实验结果分析

4 结  语

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

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

相关技术介绍

1.1 模糊测试

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

1.2 符号执行

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

1.3 污点分析

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

整体流程与核心模块设计

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

图 1 基于人机协同的漏洞挖掘框架

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

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

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

2.1 基于知识图谱的个体库

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

表 1  专家个体库的特征维度

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

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

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

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

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

2.3 并行化漏洞挖掘引擎

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

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

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

实验结果分析

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

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

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

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

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

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

结 语

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

引用格式:方恩博 , 范希明 , 贾鹏 . 基于人机协同的漏洞挖掘框架设计 [J]. 通信技术 ,2024,57(2):173-178.

作者简介 >>>

方恩博,男,博士,高级工程师,主要研究方向为网络空间安全;

范希明,男,博士研究生,主要研究方向为网络空间安全;

贾  鹏,男,博士,副研究员,主要研究方向为网络空间安全。

选自《通信技术》2024年第2期(为便于排版,已省去原文参考文献)

声明:本文来自信息安全与通信保密杂志社,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。