关于网络安全:论文精读-综述模糊测试的艺术科学和工程下
在综述《含糊测试:艺术、迷信与工程(上)》中,着重探讨了含糊测试的分类及其工作流程中的预处理和调度算法。本篇文章将重点介绍测试用例的生成策略、测试与评估办法、测试过程中的分流策略,以及反馈迭代机制,率领大家深刻理解更多对于含糊测试的内容。 测试用例生成策略生成测试用例是含糊测试过程中一个关键环节,它间接决定了测试的有效性以及是否可能胜利发现缺点。含糊测试工具次要分为两类:基于生成和基于变异。 1.基于生成的含糊测试工具 基于生成的含糊测试工具采纳详尽模型创立测试用例,这些模型精确形容了应用程序冀望的输出格局。形容可能涵盖输出格局的准确语法,或定义文件类型的特定标识符等更含糊的约束条件。 此类工具模仿指标利用的输出构造以生成测试数据,尤其实用于对结构化数据(例如网络协议或文件格式)的测试。此办法在维持格局或协定标准的根底上变异数据,探寻潜在缺点。 例如,测试音频播放器如何解决MP3文件时,基于模型的测试生成合乎MP3格局标准的数据,并在某些字段引入异样或非标准值,以检测播放器的错误处理能力和安全性。 基于生成的含糊测试的一大挑战是确保模型的精确与全面。模型须要准确地形容输出构造以产生无效的测试用例,同时宽泛涵盖各种输出变量,这须要对指标利用的输出格局有深刻的理解和剖析。 其次要办法分为三类:预约义模型、主动推断模型以及编码器模型。 1)预约义模型 泛滥含糊测试工具,如Peach、PROTOS和Dharma,依附用户定义的预设模型工作。这些工具容许用户依据编写的标准来定制输出模型。同时,Autodafé、Sulley和SPIKE等其余工具提供API,反对用户依据需要自定义输出模型。例如,Tavor容许应用扩大的巴科斯-诺尔范式(EBNF)编写标准,以生成遵循特定语法的测试用例。在网络协议测试方面,如PROTOS和SNOOZE这样的工具,要求用户提供具体的协定标准。进行内核API测试时,通常须要根据零碎调用模板来定义输出模型。工具如Nautilus采纳基于语法的办法来生成测试用例,并通过对种子数据的优化修剪,以晋升测试效率。 2)主动推断模型 近期,主动推断模型的应用在含糊测试工具中变得越发广泛,诸如TestMiner、Skyfire、IMF、CodeAlchemist、Neural及Learn&Fuzz等工具,通过在预处理和反馈更新阶段对输出模型进行剖析、学习和推断,加重了对预设模型的依赖并晋升了测试用例生成的自动化程度。 ● 在预处理阶段进行的模型推断:工具在含糊测试启动前,通过剖析目标程序或其相干数据来推断输出模型。例如,TestMiner通过剖析被测程序数据来预测适当的输出;Skyfire采纳数据驱动策略,从特定种子和语法中推导出概率性上下文敏感语法;IMF剖析零碎API日志以把握外围API模型;CodeAlchemist解析JavaScript代码为模块,并定义模块间的组合束缚;Neural与Learn&Fuzz利用基于神经网络的办法从测试数据中学习模型。 ● 测试过程中通过反馈更新进行的模型推断:工具利用测试迭代后生成的数据更新和优化输出模型,促使测试过程动静调整,实现精细化摸索。例如,PULSAR依据捕捉的网络数据包揣测网络协议模型;Doupé等钻研人员察看I/O行为以推断Web服务状态机;Ruiter等钻研人员则专一于TLS的相干工作;GLADE通过剖析I/O样本合成上下文无关文法;go-fuzz为退出种子池的每个种子构建模型。 3)编码器模型 含糊测试常常被利用于检测解码器程序,这类程序用于解析各种特定文件格式。这些文件格式的编码器程序,实际上可被视为文件格式的隐式模型。MutaGen是一款独特的含糊测试工具,它通过利用这些编码器程序内的隐式模型生成新的测试用例。不同于大部分基于变异的含糊测试工具仅变异测试用例,MutaGen间接变异编码器程序自身。具体操作是,MutaGen计算编码器程序的动静程序切片并执行之,以此为伎俩,通过轻微调整程序切片来扭转编码器的行为,进而生成蕴含小缺点的测试用例。 2.基于变异的含糊测试工具 基于变异的含糊测试法是一个在解决需结构化输出的软件测试中特地高效的办法。通过对已知良质的输出(即种子)做出小范畴且受控的批改,它可能产生新的测试用例,目标是发现软件潜在的谬误或破绽。 挑战在于变异种子:对构造良好的输出,例如MP3文件,随机生成一个满足软件特定门路条件的无效测试用例十分难。以一个简略的条件判断为例,if (input == 42),如果input是一个32位整数,那么随机猜到正确的input值的机率只有1/2^32。因而,通过采纳种子文件和变异策略,基于变异的含糊测试能无效晋升产生无效测试用例的几率。 基于变异的含糊测试工具通常应用以下几种变异策略: 1.比特翻转: 随机抉择种子文件的一个或多个比特位并翻转。这个简略但无效的办法能模仿数据传输谬误或损坏。 2.字节替换:随机或选择性地替换种子文件中的字节,这些替换的值能够是随机产生的,或来自特定测试汇合。 3.块变异:在种子文件中插入、删除或替换数据块,既能够是随机生成的,也能够是源自文件其余局部的数据块。 4.魔术值替换:用一系列预约义的“魔术值”替换文件中特定的数据,这些魔术值常是导致软件异样解决的特定数字或字符串。 5.格式化字符串:在种子输出中退出格式化字符串,试图触发格式化字符串的破绽。 6.含糊增量:对数值做渺小减少或缩小,试图引发边界条件的谬误。 3.基于白盒的含糊测试工具 白盒含糊测试,作为一种无效的软件测试策略,依赖于对程序内部结构信息的深刻理解来产生测试用例。这类测试工具依据其所采纳的技术,次要分为两大类:基于生成的工具与基于变异的工具。在白盒含糊测试畛域,有三种先进技术特地值得注意:动静符号执行、疏导含糊测试以及看待测程序的变异技术。 1)动静符号执行(Concolic Testing) 动静符号执行,亦称具体与符号测试(concolic testing),交融了传统符号执行与具体执行的劣势。此技术采纳符号值运行程序,并为遇到的每个条件分支建设门路公式,而后利用SMT求解器来查看这些门路公式的满足状况,以产生具体的输出值。动静符号执行的次要长处是它能升高符号束缚的复杂度并晋升门路覆盖率。因为需对程序指令进行粗疏剖析,其执行速度较慢。为提高效率,罕用策略包含放大剖析范畴及联合灰盒含糊测试技术。Driller、Cyberdyne和QSYM等工具展示了动静符号执行在实践中的利用,优化了灰盒与白盒含糊测试的联合,晋升了测试的效率及成绩。 2)疏导含糊测试 疏导含糊测试联合了程序剖析技术(无论是动态还是动静)与含糊测试,以加强测试用例的生成效力。此办法先对程序进行剖析,捕捉要害信息,而后基于这些信息生成更有针对性的测试用例。 ● TaintScope通过细粒度污点剖析辨认影响要害零碎调用的输出字节(热字节),以生成更无效的测试用例。 ● Dowser联合动态剖析和污点剖析寻找可能的谬误循环,并确定输出字节与这些循环的关系,最初利用动静符号执行以晋升性能。 ● VUzzer和GRT通过动态与动态分析技术提取程序的控制流和数据流特色,疏导测试用例生成。 ● Angora和RedQueen剖析种子执行状况来升高剖析老本,Angora关联门路束缚与输出字节,并采纳梯度降落法优化变异策略,RedQueen则通过插装比拟操作来检测输出应用形式,以解决束缚。 3)待测程序变异与校验绕过 含糊测试面对的一大挑战是如何无效绕过待测程序内置的校验和验证机制,这些机制通常在输出数据被理论解决前执行,导致某些测试用例因为不满足特定条件而被提前排除,限度了含糊测试摸索程序潜在破绽的范畴。以下三种先进技术通过看待测程序进行智能变异,无效绕过内置查看机制,晋升测试用例生成效率和发现潜在破绽的能力。 ● 校验和感知含糊测试:TaintScope引入了一种新鲜的“校验和感知含糊测试”解决方案。利用污点剖析技术,精准辨认执行校验和计算的代码指令,并批改这些指令以绕过校验和验证,使得批改后的测试用例亦能被程序承受解决。若程序解体,它能生成与正确输出校验和匹配的测试用例,为未修改的程序生成无效数据。 ● 拼接动静符号执行:Caballero等提出了“拼接动静符号执行”技术,特地适宜解决蕴含校验和验证的场景,通过动静符号执行技术生成能绕过校验和验证的测试用例,晋升含糊测试的有效性及覆盖范围。 ● TFuzz的非关键查看(NCC)办法:TFuzz在灰盒含糊测试畛域扩大了这一思路,首先标识所谓的非关键查看(NCC)分支,即那些能够批改而不影响程序主逻辑的条件分支。当发现新门路停滞时,TFuzz会批改一个NCC并从新进行含糊测试。如果批改后的程序版本发现解体,TFuzz尝试通过符号执行技术在原程序上复现解体,以验证其有效性。 测试与评估在含糊测试过程中,首步是创立一批测试用例,而后由含糊测试器执行这些用例并对其后果进行评估,此步骤被称为输出评估。尽管含糊测试的一大长处在于它可能以简略间接的形式执行待测程序(PUT),但进行输出评估阶段的优化和设计抉择对于加强测试工具的效率和成果具备至关重要的作用。 1.Bug Oracle 机制 糊测试采纳的一种外围安全策略是把程序因为致命信号(如段谬误)引起的意外终止看作违规行为。这种办法无效地辨认出各类内存破绽,这些破绽通常会引发段谬误或导致程序非正常终止。此策略的次要长处在于其高效率和繁难施行——无需对操作系统进行非凡配置就能捕获这类异样。 然而,这个传统的解体侦测策略无奈捕捉到所有品种的内存破绽。例如,在堆栈缓冲区溢出导致堆栈上的指针被替换为另一个非法内存地址的状况下,程序可能会失常终止,即便输入后果不正确,含糊测试在这种状况下可能辨认不出问题。为解决这个问题,研究者们开发了多种高效的程序转换技术,这些技术能够检测到不平安或异样的程序行为,并相应地终止程序。这些技术通常称为“sanitizers”。 1)内存谬误侦测工具 内存谬误侦测工具次要针对两大类平安问题:空间谬误与工夫谬误。空间谬误包含缓冲区溢出或下溢,产生于指针解援用越过其指标对象边界的情景。工夫谬误产生在对象销毁后,指针还尝试拜访那个内存地位,如应用已开释的内存。典型的内存谬误侦测工具包含: ● 地址查看器(ASan):一个编译时插桩工具,能疾速侦测空间与工夫谬误,通常会导致约73%的运行工夫开销减少。ASan通过暗影内存技术,在内存被解援用前测验其有效性,无效地辨认不平安内存拜访。MEDS通过创立“红区”加强了ASan,这些不可拜访区域晋升了程序解体的可能性,从而改良了谬误侦测。 ● SoftBound/CETS:不同于ASan,这个工具在编译时追踪指针的边界和生命周期信息,能实践上侦测所有空间和工夫谬误,但带来了约116%的运行工夫开销。 ...