漏洞挖掘之Fuzzing和AFL原理理解

本文摘录自链接: Eastmount大佬的文章.

漏洞挖掘技术

漏洞挖掘发展过程中,有很多的技术被提出,最有效的技术仍然是Fuzzing。学术界提出的包括静态分析,动态分析,污点分析,符号分析等方法多少具有局限性。

Fuzzing与AFL的历史

Fuzzing在90年代被提出,目前已有30年历史,但真正大的发展是在2013年,它是一个动态测试的过程基本思路是想办法生成一大堆输入,扔给程序测试,观察在测试过程中出现的bug和问题。
整个过程的核心是怎样有效地生成输入去触发Bugs,因为对于程序来说,它输入空间是个无限的空间,能够触发漏洞是非常少的。那么,怎样在无限空间中有效找到少量能触发漏洞的输入,这是它的核心问题。
90年左右提出的Fuzzing问题基本是偏向随机输入的,后面又提出方法告诉输入的格式,然后基于格式去生成,但相对来说它挖漏洞的效率仍然很低,让人去写这个输入格式工程量也比较大。
2013年后,提出了一个叫做AFL的方案,利用遗传算法来完成操作。

Fuzzing的原理思想

  • Fuzzing的核心是在无穷多个输入空间里去寻找有限的输入,去触发漏洞,那需要怎么在无穷空间里去做有限的探索呢?它用到了遗传算法。下图中间的核心循环,通过一轮一轮的迭代测试,测试过程中它会把上一轮测试比较好的测试用例留下来,作为种子进入下一轮,下一轮是在上一轮比较好的种子基础上进一步变异测试。它在无穷空间中探索时,不是盲目的去探索,而是在上一轮探索基础上去找比较好的方向,接着再这个方向上往下探索。该方法还是比较有效的。请添加图片描述
    具体分析,每轮保留测试例子。当然,挖漏洞同样需要一个进化指标,很自然就有一个指标是漏洞数量,但是用漏洞数量作为指标来进化的效果很差,因为漏洞是个非常稀疏的,你可能挖了几个小时都没挖到一个漏洞。这意味着没有进化的信号,整个算法效果就很差。

  • 漏洞数量

2013年AFL工作使用的指标是代码覆盖率,测试工程中去监控程序的代码覆盖率情况,如果一个新的测试例提升了代码覆盖率,就认为它是好的种子就保留下来。通过这种方式就能不断提升代码覆盖率。

为了支持做覆盖率跟踪以及在测试过程中发现代码漏洞是否被触发,通常会对程序进行插桩,做代码覆盖率收集和Security Sanitizers(安全检测工具),插桩完成之后在测试过程中,程序会自动收集Coverage信息以及检测是否触发安全问题。
请添加图片描述

AFL

真正的AFL在过程的每一步都有一些策略,比如怎么选种子(Select Seed)、怎么变异(Mutate Seed)、变异后怎么测试(Test)、测试过程中怎么跟踪覆盖率(Coverage Tracking)、覆盖率怎么过滤保留新的种子(Filter Seeds)等等。该算法提出来之后非常有效,改变了大家在这块的研究。AFL的重要特点如下:

  • Evolving:filter out only GOOD samples contributing to code coverage
    遗传算法是个进化的特征。
  • Scalable:mutation-based, few knowledge required
    方案是可量化的,不需要知道目标软件太多的知识,给它一个软件就能测。
  • Fast:fork-server, persistent, parallel
    测试过程非常快,一秒钟平均能测上千个测试用例。
  • Sensitive: support different sanitizers to catch security violations
    捕获漏洞能力比较强,可以支持不同的Sanitizers,也可以扩展,比较有名的是谷歌写的AddressSanitizer,常用安全防护和漏洞挖掘。这个非常重要,有时候在测试过程中触发漏洞但程序并不一定会让崩溃,一个好的Sanitizers能够在程序未崩溃的情况下发现漏洞。

AFL的工作流程

AFL是基于覆盖引导的模糊测试工具,通过记录样本的代码覆盖率,从而调整样本以提高覆盖率,增加发现漏洞的概率,工作流程如下:

  • 从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage)
  • 选择一些输入文件,作为初始测试集加入输入队列(queue)
  • 将队列的文件按一定的策略进行‘突变’
  • 如果经过变异文件更新了覆盖范围,则将其保留添加到队列中
  • 上述文件会一直循环进行,期间触发了crash的文件会被记录下来
    请添加图片描述

Fuzzing提升的思路

鉴于Fuzzing整个的流程环节都可以改进,所以有许多关于Fuzzing的论文.

安全四大顶会
CCS(ACM Conference on Computer and Communications Security):链接: https://www.sigsac.org/ccs.html.
NDSS(Network and Distributed System Security Symposium)
网址:https://www.ndss-symposium.org/
Oakland S&P(IEEE Symposium on Security & Privacy)
网址:https://www.ieee-security.org/TC/SP-Index.html
USENIX Security(USENIX Security Symposium)
网址:https://www.usenix.org/

  • 1. Seed Generation

初始种子的选取非常影响Fuzzing的效率,目前学术界方法如下:

第一种是借用机器学习的方法

  • 基本思路是从程序的合法输入,网上爬取样本中学出一个模型,再用这个模型生成新的测试例,这样构造的初始种子相对来说更好。典型论文方法包括Skyfire、Learn&Fuzz、GAN、Neuzz等。
    请添加图片描述

第二种是通过符号执行(Symbolic Execution)来辅助
这种辅助手段一般称为混合Fuzzing,其基本思路的核心还是Fuzzing来做,但Fuzzing有些代码过不去,比如一个复杂的数组检查,Fuzzing很难通过。对于这些过不去的分支,Drillers就提出用符号执行来辅助,遇到分支过不去的情况用符号执行来求解,并生成新的种子再丢给Fuzzing去通过分支,这是当时他们做CGC比赛的方案。符号执行和Fuzzing混合确实能提升过不去的分支。最近几年有进一步改进符号执行和Fuzzing的经典方法,比如QSYM、DigFuzz、HFL等。
请添加图片描述
第三种基于静态分析和动态分析的
还有一些是基于静态分析、动态分析,以及去学习输入的规范,通过程序分析的技术手段去分析程序接受什么样的输入,再去指导测试例的生成。今年张老师他们有一篇针对Android服务的工作,也是这个思路,即FANS(USENIX Sec20)。
请添加图片描述

  • 2. Testing Environments

还有一部分是针对不同测试目标的工作,包括针对二进制程序的,针对内核程序的,针对JAVA、IoT、SDN的,还有虚拟机、手机驱动、文件系统、数据库、智能音响等等。

  • 3.Seed Selection

在遗传算法每轮的迭代中,它首先需要从现有的种子池(Seed Pool)中选择种子,该步骤也是有一些策略的。因为一个种子池中可能积累了很多种子,通过历史上不断测试留下来的,但每一轮可能只选择一个种子,而先选择哪一个的效率也是不一样的,虽然大家都是种子,但可能有些种子效率更好。
请添加图片描述

  • ####4. Seed Mutation

第一种是偏AI的方法:
请添加图片描述

第二种是偏程序分析的方法:
通过污点分析来判断应该对哪些字节进行变异
请添加图片描述

  • ####5.Efficient Testing
    测试过程中,第一个很重要的问题是性能,测得非常快,漏洞挖掘工具也会很强。这里有一些并行化、硬件辅助的工作
    请添加图片描述

  • ####6. Coverage Metrics
    请添加图片描述

  • 7. Security Tracking

请添加图片描述

<think>嗯,用户让我介绍一下BP模糊测试,我需要先弄清楚这个概念。首先,BP可能指的是不同的东西,比如反向传播(Backpropagation)或者边界值测试(Boundary value analysis)?不过模糊测试通常是一种安全测试方法,用来发现软件漏洞,通过输入异常或随机数据来触发意外行为。 那BP模糊测试可能是指基于反向传播的模糊测试?不过反向传播通常神经网络相关,可能不太对。或者BP在这里指代其他缩写,比如“Black-box Penetration”?或者用户可能有拼写错误,比如“BP”应该是“BPP”或者其他? 再想想,模糊测试中的常见类型有基于变异的(mutation-based)基于生成的(generation-based)。或许BP是指某种特定的方法,比如基于行为的模糊测试(Behavior-based Penetration)?或者“Backpropagation-guided Fuzzing”,即利用神经网络的反向传播来指导测试用例生成? 或者用户可能指的是Bounded Model Checking(BMC)结合模糊测试?不确定的话,可能需要查证资料。不过如果BP模糊测试并不是一个广泛认可的术语,可能需要解释模糊测试的基本概念,再尝试推测BP的可能含义。 另外,BP在软件工程中可能有其他含义,比如Business Process,但结合模糊测试,可能性较低。或许用户指的是某个特定工具或框架的缩写,比如Boofuzz是一个模糊测试工具,但BP无关。 也有可能用户打错了,比如“BP”应为“BPF”(Berkeley Packet Filter)相关的模糊测试?或者Black-box Protocol模糊测试?不过这些都不常见。 考虑到用户可能的中文输入,BP可能对应“边界值”测试,但边界值分析是传统测试方法,模糊测试不同,但可能有结合。不过边界值测试通常属于功能测试,而模糊测试是安全测试,两者结合的可能性需要进一步确认。 假设用户指的是结合边界值分析的模糊测试,可能称为Boundary-based Fuzzing,但通常称为基于变异的模糊测试会关注输入结构的边界。比如AFL(American Fuzzy Lop)这样的工具会在输入中寻找边界条件来生成测试用例。 或者BP代表“Branch Prediction”,即分支预测,模糊测试中利用分支覆盖率来指导测试,比如覆盖引导的模糊测试(Coverage-guided Fuzzing),如AFL、LibFuzzer等,通过监控代码覆盖率来优化输入生成。但分支预测是CPU的特性,与模糊测试的关系不大。 可能用户想了解的是覆盖引导的模糊测试,但误写为BP?需要进一步确认,但根据现有信息,可能需要解释模糊测试的基本概念,再提到覆盖引导的模糊测试作为高级形式。 或者BP指“BackPropagation”在生成测试用例中的应用,例如使用神经网络来生成更有效的输入,这属于AI驱动的模糊测试,属于研究领域,如DeepFuzz等。 总结下来,可能的解释有: 1. BP是笔误,应为覆盖引导(Coverage-guided)或边界值(Boundary)相关的模糊测试。 2. BP指代某个特定技术或工具的缩写,但无广泛认知。 3. 用户可能混淆了术语,需要解释常规模糊测试,并提及可能的BP相关扩展。 因此,回答中应先介绍模糊测试的基本概念,然后探讨BP可能的几种解释,帮助用户明确问题,并提供相关扩展信息,确保覆盖用户可能的需求。</think>好的,我将分步骤为您解释“BP模糊测试”的可能含义及相关知识: ### 一、模糊测试(Fuzzing)基础 模糊测试是一种**自动化软件测试技术**,通过向目标程序输入大量非预期、随机或畸形的数据,触发潜在漏洞(如崩溃、内存泄漏、逻辑错误)。其核心流程为: 1. **输入生成**:生成变异或结构化的异常数据。 2. **执行监控**:运行目标程序并监控异常行为。 3. **漏洞分析**:记录导致崩溃或错误的输入,辅助调试。 常见类型: - **基于变异的模糊测试**(Mutation-based):对已知输入进行随机扰动。 - **基于生成的模糊测试**(Generation-based):按协议/格式规则构造输入。 ### 二、“BP”的可能含义推测 由于“BP模糊测试”并非标准术语,以下是几种合理推测: #### 1. **覆盖引导模糊测试(Coverage-guided Fuzzing)** - **关联性**:若“BP”为笔误或缩写(如“Branch/Path Coverage”),可能指**以代码覆盖率(尤其是分支/路径覆盖)为指导的模糊测试**。 - **代表工具**:AFL(American Fuzzy Lop)、LibFuzzer。 - **原理**:通过插桩(Instrumentation)监控代码执行路径,优先保留触发新分支的输入,逐步提高测试深度。 #### 2. **边界值模糊测试(Boundary-based Fuzzing)** - **关联性**:若“BP”指“Boundary值测试”,即针对输入边界(如最大值、最小值、临界点)设计模糊测试用例。 - **应用场景**:检测整数溢出、缓冲区溢出等边界相关漏洞。 #### 3. **反向传播驱动的模糊测试(Backpropagation-guided Fuzzing)** - **研究领域**:使用神经网络(如GAN)生成更有效的测试输入,通过反向传播优化输入生成策略。 - **示例**:DeepFuzz、AIFuzz等研究项目尝试结合深度学习与模糊测试。 #### 4. **业务流程模糊测试(Business Process Fuzzing)** - **场景**:针对企业级应用的多步骤业务流程(如登录-交易-注销),构造异常流程组合进行测试。 - **工具**:Peach Fuzzer的部分功能支持状态机模型测试。 ### 三、典型模糊测试工具与BP相关扩展 | 工具名称 | 类型 | 潜在“BP”关联 | |---------------|---------------------|--------------------------| | AFL | 覆盖引导 | 分支/路径覆盖(Branch Coverage)| | LibFuzzer | 覆盖引导 | 与AFL类似 | | Boofuzz | 协议模糊测试 | 支持状态流程(Business Process)测试 | | Peach Fuzzer | 多格式支持 | 支持复杂业务流程建模 | ### 四、实践建议 若您有具体应用场景,可进一步明确需求: 1. **目标对象**:网络协议、API、文件解析器? 2. **测试重点**:内存安全漏洞、逻辑错误、合规性? 3. **技术栈**:C/C++、Python、Web应用? ### 五、总结 模糊测试是安全测试的核心手段之一,若“BP”指代特定技术(如分支覆盖或业务流程),可针对性选择工具方法。建议从覆盖引导模糊测试(如AFL)入手,逐步扩展到复杂场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值