乐趣区

关于网络安全:论文精读-综述模糊测试的艺术科学和工程下

在综述《含糊测试:艺术、迷信与工程(上)》中,着重探讨了含糊测试的分类及其工作流程中的预处理和调度算法。本篇文章将重点介绍测试用例的生成策略、测试与评估办法、测试过程中的分流策略,以及反馈迭代机制,率领大家深刻理解更多对于含糊测试的内容。

测试用例生成策略生成

测试用例是含糊测试过程中一个关键环节,它间接决定了测试的有效性以及是否可能胜利发现缺点。含糊测试工具次要分为两类:基于生成和基于变异。

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% 的运行工夫开销。

● CaVer、TypeSan 与 HexType:专一于侦测 C ++ 中的不当类型转换,比方谬误地把基类对象转换为派生类对象。

2)未定义行为侦测工具

在 C 语言等编程语言中,许多未定义行为的具体实施可能因编译器而异。程序员的代码可能仅在某一编译器上无效,看似有害,实则编译器的实现形式可能由多种因素影响,包含优化设置、零碎架构和编译器版本。编译器实现与程序员预期不统一时,可能引发破绽。典型的未定义行为侦测工具包含:

● 内存查看器(MSan):专门侦测 C 和 C ++ 中应用未初始化内存导致的未定义行为。MSan 利用暗影内存追踪每个位的初始化状态,但导致约 150% 的性能开销。

● 未定义行为查看器(UBSan):通过编译时批改程序侦测多种未定义行为,如应用不对齐指针、零除法、解援用空指针和整数溢出等。

● 线程查看器(TSan):侦测数据竞争的工具,通过编译时批改程序,在精确性与性能间获得均衡。数据竞争个别产生于两线程并发拜访同一内存地位且至多一线程执行写操作,可能导致数据损坏且难以复现。

3)Web 破绽侦测工具

● KameleonFuzz:专门侦测跨站脚本(XSS)攻打的工具,通过解析实在 Web 浏览器中的测试用例、提取 DOM 树,并与 XSS 攻打模式比拟,来辨认胜利的 XSS 攻打。

● µ4SQLi:采纳相似技术侦测 SQL 注入。鉴于难以从 Web 利用响应中牢靠侦测 SQL 注入,它通过数据库代理拦挡 Web 利用与数据库间通信,查看输出是否触发无害行为。

4)语义差别侦测工具

差分测试在含糊测试中表演发现语义谬误的要害角色,通过比拟行为类似但不完全相同的程序揭发潜在谬误。多种含糊测试工具通过差分测试辨认程序间行为差别,这些差别通常标示着谬误。Jung 等提出了针对单个程序的黑盒差分含糊测试技术,通过剖析不同输出解决及相应输入的变异,无效侦测信息泄露等问题。

2. 测试优化策略

在本分析模型中,咱们假设含糊测试的各轮迭代程序执行。通常做法是,每启动一个新的迭代周期,就须要从新加载待测试程序(PUT)。然而,通过执行一些优化措施,能够大幅缩小反复加载的需要。比方,AFL 通过引进 fork-server 机制,使得能够从一个过程的已初始化状态开始,为每一轮新的含糊测试创立一个分支(fork)。同样,施行基于内存的含糊测试也能够显著放慢测试执行速度。不论采纳何种优化策略,反复的加载及初始化待测试程序的开销都能在多轮迭代中被无效地摊派。徐等人通过设计一种新的零碎调用来取代传统的 fork() 调用,从而进一步缩小了每轮迭代的老本。

测试过程中的分流策略

在测试流程中,分流策略要害地参加到剖析和上报违反预约策略的测试用例中,涵盖三个次要环节:去除反复的测试用例、对测试用例进行优先级排序、以及最小化测试用例。

1. 测试用例去重去重

在含糊测试过程中施展着至关重要的作用,其指标是剔除那些触发同一谬误的反复测试用例,从而造成一个能揭示独特谬误的测试用例汇合。这一步骤不仅有利于节约磁盘空间和资源,而且帮忙用户更加轻松地辨认和剖析不同的谬误类型,特地是对于那些仅对可能导致牢靠利用的重大破绽感兴趣的攻击者而言,这一点尤为重要。

目前宽泛采纳的去重技术有三种:

1)基于栈回溯哈希去重:这种办法通过捕捉解体时的调用栈回溯和调配栈哈希来实现去重,其实现细节可能包含不同的栈帧数量和信息量。为了晋升效率,某些实现会产生一个次要哈希和一个更准确的次级哈希。

2)基于覆盖率去重:工具如 AFL 通过源代码插桩来记录测试用例发现的新门路或者未笼罩的已知解体门路,把这类解体当作举世无双解决。

3)基于语义感知去重:RETracer 利用逆向数据流剖析技术从解体事件中提取语义信息以进行分群,剖析解体转储来审查导致解体的指针,辨认出触发谬误的具体指令,指标是辨认并将解体归类到负责的最高级别函数。

2. 优先级设置与破绽可利用性剖析

在含糊测试过程中进行的优先级排序,亦称为“驯服问题”,次要是基于测试用例展现的破绽的严重性及其独特性进行排序或归类。这一点在寻找内存破绽时分外重要,破绽的可利用性决定了攻击者是否可能制订出无效的利用代码来利用这些破绽。因而,进攻方通常优先修补那些可被利用的破绽,而这些破绽同样是攻击者极其关注的焦点。

微软的!exploitable 零碎引领了联合启发式算法与污点剖析对解体可利用性进行评估的趋势。自从!exploitable 面世当前,随之而来的是其余基于规定的启发式零碎,比方 GDB 的可利用性插件以及苹果的 CrashWrangler。尽管如此,这些零碎的准确度还没有通过系统性的钻研与评估来验证。

3. 测试用例最小化过程

测试用例最小化是含糊测试分流过程中的关键步骤,其次要指标是辨认并减简可能触发谬误的测试用例,从而发明出能触发雷同谬误的更小且更精简的原始测试用例版本。尽管它在减小输出规模的目标与种子修剪相仿,但测试用例最小化更侧重于依据谬误批示进行最小化解决。

各种含糊测试工具施行了不同的实现形式和算法以进行测试用例最小化。如,BFF 利用了一个为含糊测试特制的最小化算法,目标是尽量减少与原始种子文件之间的差别。AFL 也提供了测试用例最小化性能,通过将字节置零和缩减测试用例的长度来实现测试用例的简化。进一步,Lithium 是一种通用的测试用例最小化工具,旨在通过指数级减小尺寸,移除测试用例中的间断行或字节“块”,非常适合解决由脚本含糊测试生成的简单测试用例。

除了专为含糊测试设计的工具之外,还存在实用于含糊测试发现的测试用例的通用缩减工具,如实用于多种格局的格局无关技术 delta 调试,及针对特定格局的专用技术,例如 CReduce 是专门用于 C /C++ 文件的。尽管这些专用技术在解决文件类型上受限,但因为它们可能了解指标语法,通常比通用技术更高效。

反馈迭代机制

反馈机制在辨别黑盒、灰盒与白盒含糊测试工具的行为上表演了要害角色。这种能力确保在含糊测试的一个迭代周期中收集到的信息,可能被后续所有迭代所利用。举例来说,与黑盒和灰盒含糊测试工具相比,白盒含糊测试工具通常会针对每个新生成的测试用例创立新的含糊配置,起因是它们生成的测试用例数量绝对较少,但信息收集与反馈利用的过程更加精密和深刻。

1. 种子池的进化更新策略

含糊测试中的进化算法(EA)通过继续保护和更新一个充斥后劲的种子汇合,即种子池,对含糊测试的倒退起到了至关重要的作用。尽管 EA 的概念绝对间接,但它形成了泛滥灰盒含糊测试工具的外围。

在基于 EA 的含糊测试中,节点或分支覆盖率常被用作评估适应度的函数。新发现的节点或分支会导致相应的测试用例被增加到种子池中。思考到可达门路的数量远远超过种子的数量,种子池旨在作为一个代表所有可达门路的多样化汇合,映射出被测程序的摸索状态。值得一提的是,不同大小的种子池可能实现雷同的覆盖率。

EA 含糊测试工具通常采纳优化适应度函数的办法,以便捕获更粗疏的改良指标。例如,AFL 通过追踪分支的拜访频率来精细化适应度函数。STADS 引入了生态统计框架,以预测继续含糊测试可能揭示的新配置数量。其余策略包含测量简单分支条件满足水平的比例,如 LAF-INTEL 将多字节比拟分解成多个分支,以便察看新种子在两头字节比拟中的体现。LibFuzzer、Honggfuzz、go-fuzz 及 Steelix 通过插桩所有比拟操作,将有助于推动比拟停顿的测试用例退出种子池。Steelix 还额定剖析了影响比拟指令的输出地位。Angora 通过剖析每个分支的调用上下文来优化 AFL 的适应度评估规范。

作为一个基于 EA 的工具,VUzzer 的适应度函数基于专门的程序剖析来确定每个基本块的权重,首先对基本块进行分类,辨别为惯例块或错误处理块,并按基本块拜访概率的正比调配权重,激励对那些较少拜访的块给予优先思考。

这些种子池的进化更新策略晋升了含糊测试工具的效率和有效性,使其可能更精准地辨认和摸索潜在的破绽门路。

2. 保护最优测试用例集

在含糊测试中,随着测试配置生成能力的晋升,面临的一个挑战是防止生成过多的测试配置。为此,采纳了一种策略,即维持所谓的“最小汇合”,这意味着尽可能放弃一个小型的测试用例汇合以达到最大的覆盖范围。这个最小汇合的思维不仅在含糊测试的执行阶段有所利用,而且在预处理阶段也同样驳回。

特定的含糊测试工具采取了办法来优化更新过程中的最小汇合。以 AFL 为例,它施行了一种修剪流程,将属于最小汇合的测试配置标记为优选项。因而,这些被视为无益的测试配置将有更高的机会被选中执行。AFL 的开发者指出,这种策略无效地均衡了测试队列的循环速度与测试案例的多样性。

通过这种办法,可能在放弃测试的深度和广度的同时,无效地管制测试用例的数量,晋升含糊测试的效率与功效。这一最小汇合保护策略有助于聚焦于那些可能揭示潜在破绽的要害测试用例,从而优化测试后果。

总结

本文旨在提供一个无关含糊测试技术的全面察看。只管先前的诸多钻研曾经探讨了含糊测试的各个特定方面,但这些钻研通常聚焦于无限的畛域。相比之下,本文指标在于对含糊测试畛域的现有文献进行全方位梳理,涵盖含糊测试技术的最新动静,剖析不同含糊测试技术以及它们在多样化利用背景下的测试体现。

退出移动版