Fuzz的原理与实现

这篇具有很好参考价值的文章主要介绍了Fuzz的原理与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Fuzz的原理与实现

模糊测试(fuzz testing)是一种自动化的软件测试技术,通常用于识别程序中的潜在漏洞。其概念最早由威斯康辛大学的巴顿·米勒于1989年提出。AFL是一种fuzz方法,目前广泛使用在模糊测试中。本篇博客介绍了使用模糊测试的目的,以及AFL实现模糊测试的原理,并依据案例具体实现AFL。

我们为什么需要fuzz

经常使用microsoft word的人知道,虽然microsoft word已经是一款十分成熟的软件,但是依旧存在大量能够使 Microsoft Word 崩溃的坏文件。极端条件下,少数字节错位,会使整个应用程序毁于一旦。在旧式的、无内存保护的操作系统中,整个计算机通常就这样宕掉了。 这种情况下Microsoft Word 不能意识到它接收到了坏的数据,并发出一条错误信息,并且仅仅因为少数字节损坏Microsoft Word 就破坏自己的栈、堆,甚至于影响了整个操作系统。发生在microsoft word上的报错事实上也发生在许多其他软件中,因为错误的输入导致系统坏掉是令软件开发者头痛的事情,开发者需要知道哪些输入会带来系统毁灭性的打击。

在模糊测试中,用随机坏数据(也称做 fuzz)攻击一个程序,然后等着观察哪里遭到了破坏。模糊测试的技巧在于,它是不符合逻辑的:自动模糊测试不去猜测哪个数据会导致破坏(就像人工测试员那样),而是将尽可能多的杂乱数据投入程序中。由这个测试验证过的失败模式通常对程序员来说是个彻底的震撼,因为任何按逻辑思考的人都不会想到这种失败。

模糊测试是一项简单的技术,但它却能揭示出程序中的重要 bug。它能够验证出现实世界中的错误模式并在您的软件发货前对潜在的应当被堵塞的攻击渠道进行提示。

fuzz方法分类

现阶段fuzz方法可以分成3类:

  1. 黑盒模糊测试:黑盒测试又称为功能测试,主要检测软件的每一个功能是否能够正常使用。在测试过程中,将程序看成不能打开的黑盒不考虑程序内部结构和特性的基础上通过程序接口进行测试,检查程序功能是否按照设计需求以及说明书的规定能够正常打开使用。
  2. 白盒模糊测试:白盒测试也称为结构测试,主要应用于单元测试阶段,检测软件编码过程中的错误。程序员的编程经验、对编程软件的掌握程度、工作状态等因素都会影响到编程质量,导致代码错误。
  3. 灰盒模糊测试:是介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。灰盒测试不像白盒那样详细、完整,但又比黑盒测试更关注程序的内部逻辑,常常是通过一些表征性的现象、事件、标志来判断内部的运行状态。

黑盒模糊测试和白盒模糊测试的优点与缺点列举如下:

测试方法 黑盒测试 白盒测试
优点
  • 简单,不需要了解程序内部代码;
  • 用户角度出发,容易知道用户会用到哪些功能哪些问题;
  • 软件自动话测试时比较方便
  • 增大代码覆盖率
  • 提高代码质量,发现代码中隐藏问题
缺点
  • 不可能覆盖所有代码,覆盖率低
  • 自动化测试复用性低
  • 程序运行会有不同路径,不可能测试所有路径
  • 测试基于代码,只能测试开发人员做的对不对,而无法知道涉及的功能需求是否正确
  • 系统个庞大,测试开销大

AFL进行fuzz的过程

AFL(American Fuzzy Lop)是由安全研究员Micha? Zalewski开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。

AFL的具体实现包括下面几步:

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

Fuzz的原理与实现

AFLCC实现fuzz测试

环境设置

# set up env
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
docker exec -it [container_id] /bin/bash # enter the container
mkdir my_test
cd my_test
mkdir fuzz_in # for input file
mkdir fuzz_out # for output file

my_test作为工作路径,其中应该包括:afl_test.c, fuzz_in文件夹和fuzz_out文件夹。

afl_test.c

#include <stdio.h>
int main(int argc, char *argv[])
{
    char buf[10]={0};
    gets(buf);//存在栈溢出漏洞
    printf(buf);//存在格式化字符串漏洞
    return 0;
}

/my_test/fuzz_in/testcase

asdfaslkx

编译和测试

afl-gcc -g -o afl_test afl_test.c # compile, which will procuce file: afl_test
afl-fuzz -i fuzz_in -o fuzz_out ./afl_test # try afl fuzz test

正确运行后,fuzz_out文件夹中应该有产生新的文件,并有如图结果:
Fuzz的原理与实现
Fuzz的原理与实现

⚠️afl-fuzz程序不会自己停止,需要人为暂停。暂停的时间如何选择:文章来源地址https://www.toymoban.com/news/detail-495110.html

  1. 查看cycles done字段:其颜色会随着数值增加从洋红色到黄色、蓝色和绿色,一般到了绿色就可以停止了,此时即便继续测试也没有什么收获。
  2. 查看last saved crash字段:如果距离上一次查到崩溃点已经过去很长时间了,则无需继续进行测试。

结果解读

  • process timing: 当前afl进行了多长时间,距离上一次crash多长时间
  • overall results: 总体的结果,出现了多少次crash和hang
  • cycle progress: 输入队列的距离
  • map coverage: 目标二进制文件中的插桩代码所观察到覆盖范围的细节
  • stage progress:Fuzzer现在正在执行的文件变异策略、执行次数和执行速度
  • findings in depth:有关我们找到的执行路径,异常和挂起数量的信息
  • fuzzing strategy yields:关于突变策略产生的最新行为和结果的详细信息
  • item geometry:有关Fuzzer找到的执行路径的信息
    fuzz_out文件夹会生成crasheshangsqueue三个文件夹,会存储程序坏掉的情况,过慢的情况,以及测试队列的有关信息。

参考

  1. 什么是模糊测试?
  2. 模糊测试百度百科
  3. 安般科技带您读懂“什么是模糊测试”
  4. AFL 漏洞挖掘技术漫谈(一):用 AFL 开始你的第一次 Fuzzing
  5. 模糊测试技术简单整理(一)
  6. The Fuzzing Book
  7. 什么是黑盒测试,白盒测试,灰盒测试?
  8. 基于模糊测试的分布式数据库安全研究(二)——第一次Fuzzing
  9. AFLplusplus/AFLplusplus GitHub repo
  10. Access Data Warehouse from SQuirrel SQL
  11. AFL++学习日志(一)开始Fuzz与crashes分析

到了这里,关于Fuzz的原理与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端自动化测试(二)Vue Test Utils + Jest

    项目会从快速迭代走向以维护为主的状态,因此引入自动化测试能有效减少人工维成本 。 自动化的收益 = 迭代次数 * 全手动执行成本 - 首次自动化成本 - 维护次数 * 维护成本 对于自动化测试,相对于发现未知问题,更倾向于避免可能的问题。 (1) 单元测试 单元测试(unit t

    2024年02月08日
    浏览(28)
  • oss-fuzz-gen:一款基于LLM的模糊测试对象生成与评估框架

    oss-fuzz-gen是一款基于LLM的模糊测试对象生成与评估框架,该工具可以帮助广大研究人员使用多种大语言模型(LLM)生成真实场景中的C/C++项目以执行模糊测试。 该工具基于Google的OSS-Fuzz平台实现其功能,并对生成的目标执行基准测试。 工具运行流程如下: 工具会根据生产环境

    2024年03月12日
    浏览(52)
  • [E2E Test] Python Behave Selenium 一文学会自动化测试

    本文将使用Python Behave与Selenium,和同学们一起认识自动化测试,并附上完整的实践教程。 项目源码已上传:CSDN 郭麻花 Azure Repo python-behave-selenium 1. 什么是E2E Test E2E即End-to-end,意思是从头到尾的系统功能测试。它通过编写自动化测试脚本,完全从用户的角度出发,验证系统功

    2024年02月09日
    浏览(32)
  • 【软件测试】- 将 Selenium 和 JMeter 测试脚本集成到 Jenkins 中实现自动化测试和持续集成(CI)及Jenkinsfile 实现 Jenkins Pipeline 原理介绍

    将 Selenium 和 JMeter 测试脚本集成到 Jenkins 中是实现自动化测试和持续集成(CI)的关键步骤。以下是详细的集成过程: 1、准备工作 安装 Jenkins : 确保您已经在服务器上安装了 Jenkins。 可以从 Jenkins 官网 下载并安装。 安装必要的插件 : 在 Jenkins 中安装所需的插件,如 Git 插

    2024年02月04日
    浏览(52)
  • 自动化测试 - Web自动化测试原理

    目前市面上有很多Web UI自动化测试框架,比如WatiN, Selinimu,WebDriver,还有VS2010中的Coded UI等等. 这些框架都可以操作Web中的控件,模拟用户输入,点击等操作,实现Web自动化测试。其实这些工具的原理都一样,都是通过调用IE COM接口和HTML DOM 对IE浏览器以及WEB测试对象的操作。

    2024年01月16日
    浏览(35)
  • 一种基于闭包函数实现自动化框架断言组件的设计实践

    目前测试组同学基本具备自动化脚本编写能力,为了提高效率,如何灵活运用这些维护的脚本去替代部分手工的重复工作?为了达到测试过程中更多的去使用自动化方式,如何能够保证通过脚本覆盖更多的校验点,提高自动化测试的精度和力度?那么一定是不断的丰富断言,

    2024年02月08日
    浏览(49)
  • 前台自动化测试:基于敏捷测试驱动开发(TDD)的自动化测试原理

    一、自动化测试概述 自动化测试主要应用到查询结果的自动化比较,把借助自动化把相同的数据库数据的相同查询条件查询到的结果同理想的数据进行自动化比较或者同已经保障的数据进行不同版本的自动化比较,减轻人为的重复验证测试。多用户并发操作需要自动化模拟来

    2023年04月20日
    浏览(71)
  • python自动化测试-自动化基本技术原理

    在之前的文章里面提到过:做自动化的首要本领就是要会  透过现象看本质  ,落实到实际的IT工作中就是  透过界面看数据 。 掌握上面的这样的本领可不是容易的事情,必须要有扎实的计算机理论基础,才能看到深层次的本质东西。 数据库应用系统  可能是最典型的网络

    2024年02月10日
    浏览(29)
  • 自动化测试:Selenium原理及安装教程

    目录 一、客户端和驱动(环境)安装 1、安装客户端库 2、安装浏览器和驱动 二、简单示例(Python自动化开发) 省略浏览器驱动路径 三、常见问题 关闭 chromedriver 日志 浏览器首页显示防病毒重置设置 扩展知识 Selenium 是一套 Web网站 的程序自动化操作 解决方案。 通过它,我

    2024年02月09日
    浏览(41)
  • Fuzz的原理与实现

    模糊测试(fuzz testing)是一种自动化的软件测试技术,通常用于识别程序中的潜在漏洞。其概念最早由威斯康辛大学的巴顿·米勒于1989年提出。AFL是一种fuzz方法,目前广泛使用在模糊测试中。本篇博客介绍了使用模糊测试的目的,以及AFL实现模糊测试的原理,并依据案例具体

    2024年02月10日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包