Evaluating Fuzz Testing

2023-10-27

1 介绍

信息量太大回头再写。。

# 一天后更新

不想写了差不多就下面这些内容吧。。

2 背景

2.1 fuzzing流程

fuzzing algorithm.png

fuzzing的核心算法

initSeedCorpus:初始化新的输入

isDone:决定fuzzing是否停止

choose:从队列中选择至少一个种子输入进行变异

mutate:从至少一个种子输入和观察到的现象中产生新的候选种子

eval:评价程序的种子产生观察现象

isInteresting:根据观察到的现象决定种子是否保留

fuzzer的最终目标是生成输入使程序crash。其他类型的观察现象也是需要的,比如用例运行的时间,可以用来指示算法复杂度漏洞的存在。

2.2 近年来fuzzing的进展

本文研究对象是2012至2018这7年顶会上32篇相关论文。其中25篇是2016年以来的成果。

summary.png

这里总结了32篇论文评价时的相关信息。

这里通过文章的主题将这些文章分类:

initSeedCorpus:

  • Skyfire和Orthrus改进初始化种子选择
  • QuickFuzz通过输入结构的语法生成种子输入
  • DIFUZE进行前期的静态分析来识别输入的结构(?)

mutate:

  • SYMFUZZ使用符号执行决定变异的种子输入的位数
  • 有些fuzzer使用预定义的变异策略(如位翻转或随机代替)
  • MutaGen通过代码切片使用测试程序的代码段来转换或操作输入
  • SDF使用种子自身的性质指导变异
  • Chizpurfle的变异器使用java语言构建器的知识辅助安卓系统服务的过程中fuzz

eval:

  • Driller和MAYHEM发现某些guard条件通过暴力猜很难满足,因此使用符号执行在eval阶段绕过他们
  • S2F也在eval阶段使用符号执行
  • 其他工作目标加快eval阶段的速度通过修改操作系统或低层级的原语来观测执行影响
  • T-Fuzz移除对于输入的检查(这些检查阻止程序达到新代码)
  • MEDS进行更细粒度的运行时分析来检测error

isInteresting:

有意思的行为如:长运行时间,有差异的行为等

  • Steelix和Angora进行插桩获取更细粒度的信息
  • Dowser和VUzzer使用静态分析在不同程序点赋值不同的rewards来达到CFG中更深的点

choose:

  • 部分工作基于输入是否到达某些区域来选择下一个候选输入
  • 另一部分提出算法选择候选种子

3 综述和实验设置

评价模糊测试算法的步骤

  1. 选择一个baseline算法
  2. 选择一个有表达能力的目标程序(benchmark)
  3. 选择比较的度量,最理想的是找到的bug数
  4. 算法的参数选择,比如种子文件如何选择
  5. 在A和B上多次运行,进行性能上的差异显著性检验

实验设置

fuzzers. AFL 2.43b作为baseline B,AFLFast作为advanced算法。同时使用AFL的-n选项(关闭了覆盖率跟踪),称为AFLNaive

benchmark. nm, objdump, cxxfilt, gif2png, FFmpeg。这些程序都在最近的成果评价时用来评价工具性能。

Performance measure. unique crashes,uniqueness由AFL能覆盖的路径数决定。

platform and configuration. 每次测试跑24小时,每种测试至少跑30次。同时也尝试了多样的种子输入文件:空文件,随机选择正确类型,人工写得文件。

4 统计上的鲁棒性比较

大部分已有研究(18/32)没有提及测试的次数。这些论文可能认为随机性是均匀的,即如果测试跑了足够长时间,不同的随机会收敛,所有fuzzer会发现相同数量的crash。对于gif2png进行30次24小时的实验,AFLFast找到51个crash(中位数),AFL找到39个crash(中位数),使用Mann Whitney U-test进行显著性检验发现p-value>0.05。

讨论:最好的检验方法

两个可行的方法:

  1. permutation test
  2. bootstrap-based tests

这两个方法与Mann Whitney相比是否合适不得而知,所以本文采取Arcuri和Briand的方法。从实验结果可知方法A比B好,但是好多少不知道,所以通过比较中位数的绝对差异来隐含地回答这个问题。

5 种子选择

大多数工作(27/32)改进fuzzing loop。30/32使用非空的种子集合。

一个普遍的观点就是种子输入应该well-formed(valid)而且small。

可能初始语料库的细节并不重要,也就是说,不论种子如何初始,都能从算法的改进上体现出来。

本文使用不同种子输入测试FFmpeg,包括已有video files和randomly-generated videos。

总结来说,fuzzers在同个程序上针对不同输入的性能表现各不同。本文建议应该更谨慎地考虑,应该使用各类输入评价fuzzer的算法。论文应该写明种子输入如何收集,且最好给出实验用到的种子输入。而且empty seed应该考虑到,因为这是最简单的输入,可以被任意系统使用。

6 超时

比较常用的是24小时(10/32),和5或6小时(7/32)。6/32超过一天。

QQ截图20181026134651.png

而且不同超时设置会影响实验的结果,如上图。timeout=6h时,AFL没找到crash但是AFLFast找到4个,差异是显著的;然而若timeout=24h,AFL找到14个crash而AFLFast只找到8个,这个差异也是显著的。

较短的timeout更符合实际场景。

*讨论:*也可以计算AUC作为报告找bug能力的度量。但是如果一个fuzzer A一开始就发现5个crash,另一个fuzzer B在最后才发现了10个crash,直觉来说B的找bug能力大于A,但是AUC较小,所以AUC度量不适用于基于时间绘图。

7 表现/性能度量

7.1 Ground Truth: Bugs Found

能找到bug是检验fuzzers性能的第一标准!

7.2 AFL覆盖率简况

7.3 Stack hashes

7.4 代码覆盖

一句话,代码覆盖率作为第二度量是讲得通的,但是最主要的评价指标还是找到的bug数(distinct bugs)。

8 目标程序

这里涉及benchmark选择的问题。

主要分为两类:

  1. 真实程序和人工程序(或bug)
  2. 手动选择的程序,人工注入bug

8.1 真实程序

使用真实程序作为benchmark的问题:

  1. 只使用了很少的目标程序,没有明确说明代表性。很难泛化到其他程序,7个真实项目太少了
  2. 在这些文章中很少有论文用到相同的目标程序(版本也相同)

Google Fuzzer Suite比较好地解决了这个问题:

  1. 使用了25个程序,包括已有bug
  2. 设计用作一类回归测试

8.2 人工程序

有时不关心特定的程序集合,而是程序中反模式的有代表性的集合。

有两个著名的suite:CGC和LAVA-M

8.3 面向一个Fuzzing Benchmark Suite

  1. suite包含的程序应该能够说明bug在什么是否发现的?是合成引入的还是就版本已有bug?
  2. suite应该足够大,能够很好表达目标程序群体的特征
  3. 需要构建测试方法防止overfitting(为了找更多bug而强行硬编码规则之类的?)

9 结论和未来工作

已有工作:

  • 没有多次执行,没有进行性能提升的显著性检验
  • 很有工作没有通过统计distinct bugs评价fuzzer的性能,而是和AFL一样使用unique crashes
  • 很多工作只有很短的timeout,缺少合理的理由
  • 许多工作没有认真考虑种子输入的影响
  • 这些工作选择了不同的目标程序,很难比较不同工具或算法间的性能

本文建议,模糊测试效果评价应该包含以下元素:

  • 多次试验,进行统计测试
  • 大量包含已知bug的目标程序
  • 从已知bug的方面度量性能,而不是基于AFL的启发式度量
  • 全面考虑各类种子输入,包括空输入
  • timeout≥24h

未来工作的三条线:

  1. benchmark
  2. 在实际fuzzign结果的基础上考虑crash去重方法
  3. 探索改进新的基于observation的fuzzing算法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Evaluating Fuzz Testing 的相关文章

  • 软件测试开发/全日制/测试管理丨Docker容器技术

    Docker 是一种轻量级的容器技术 通过将应用程序及其所有依赖项封装到一个可移植的容器中 实现了应用程序的便携性 可部署性和可伸缩性 下面是关于 Docker 容器技术的主要概念和优势 主要概念 容器 Container 容器是一个轻量级
  • Python 如何安装Selenium(推荐)

    一 Selenium的定义 Selenium 是一个 Web的自动化测试工具 最初是为网站 自动化测试而开发的 Selenium 可以直接调用浏览器 它支持所有主流的浏览器 包括PhantomJS 这些无界面的浏览器 可以接收指令 让浏览器
  • 【性能测试入门】:压力测试概念!

    压力测试可以验证软件应用程序的稳定性和可靠性 压力测试的目标是评估软件在极端负载条件下的鲁棒性和错误处理能力 并确保软件在紧急情况下不会崩溃 它甚至可以进行超出软件正常工作条件的测试 并评估软件在极端条件下的工作方式 在软件工程中 压力测试
  • 软件测试|Python openpyxl库使用指南

    简介 我们之前介绍过 python在自动化办公方面可以大放异彩 因为Python有许多的第三方库 其中有很多库就支持我们对office软件进行操作 熟练的使用Python对office进行操作 可以实现自动化办公 极大提升我们的工作效率 本
  • Selenium小技巧!

    Chrome DevTools 简介 Chrome DevTools 是一组直接内置在基于 Chromium 的浏览器 如 Chrome Opera 和 Microsoft Edge 中的工具 用于帮助开发人员调试和研究网站 借助 Chro
  • RF自动化环境安装+自动化实例解析

    RF定义 通用型的 自动测试框架 绝大部分的软件的的自动化系统都可以采用它 特点 测试数据文件 Test Data 对应一个个的测试用例 测试数据文件里面使用的功能小模块叫关键字 由测试库 Test Library Robot Framew
  • Python自动化操作:简单、有趣、高效!解放你的工作流程!

    今天跟大家分享一套自动化操作流程解决方案 基于 Python语言 涉及 pyautogui pyperclip pythoncom win32com 依赖包 安装命令为 pip install pyautogui pip install p
  • 测试用例评审流程优化

    测试用例 评审是QA日常工作流程中的关键一环 是QA同学完善测试用例 交流测试经验的好机会 负责组内测试用例建设以来 作者对于评审流程做了一些优化工作 本文作者将整个优化过程中的心得体会做了一个总结 希望能给大家带来帮助 01 原始流程 1
  • 测开和测试平台是否有存在的必要?

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 如何写好一个错误报告

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 一篇文章带你了解Python常用自动化测试框架——Pytest

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Jmeter 性能-阶梯式性能指标监听

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 新手也能看懂的【前端自动化测试入门】!

    前言 最近在网上搜索前端自动化测试相关的文档 但是发现网上的文章都是偏使用 没有把一些基础概念说清楚 导致后续一口气遇到一些 karma Jasmine jest Mocha Chai BDD 等词汇的时候很容易一头雾水 这次一方面整理一下
  • 月薪2W的软件测试工程师,到底是做什么的?

    在生活中 我们常常会遇到以下几种窘迫时刻 准备骑共享单车出行 却发现扫码开锁半天 车子都没有反应 手机导航打车 却发现地图定位偏差很大 司机总是跑错地方 买个水 却遭遇自动售货机吐币 或者不找零钱 好不容易休息打个游戏 却一直出现卡顿 闪退
  • Python常用的自动化小脚本!

    一 list转json string转json 可以使用Python内置的 json 模块将列表 List 和字符串 String 转换成JSON格式 List转JSON假设我们有一个列表 List my list apple banana
  • 2024拒绝行业内卷!八年软件测试20K*16薪行业心得 想入行必看

    目前工作做软件测试工作8年 属于高级测试员那个级别吧 现在看到各行各业的人都在转行学习软件测试 想给大家一些学习建议和忠告 很多粉丝都跟我说今年行情很差 找不到工资 真的找不到工作了吗 我们常在网上看到的 程序员饱和 程序员过剩 其实一般是
  • 一文让你了解UI自动化测试

    测试都起什么作用 是项目的保险 但不是项目的救命草 测试无实际产出 但作用远大于实际产出 测试是从项目维度保证质量 而不是测试阶段 UI自动化 下面简称自动化 基于UI进行自动功能测试 以Web端作为例子 一般的UI功能自动化都是基于HTM
  • 外包干了2个月,技术倒退2年。。。

    先说一下自己的情况 本科生 20年通过校招进入深圳某软件公司 干了接近4年的 功能测试 今年国庆 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了3年的女朋
  • Web自动化测试 —— cookie复用

    一 cookie简介 cookie是一些数据 存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时 在链接关闭后 服务端不会记录用户信息 二 为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入 若用
  • 外包干了3个月,技术退步明显。。。。。

    先说一下自己的情况 本科生 20年通过校招进入广州某软件公司 干了接近3年的 功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了3年的功能测试 已经让我变得不思进取 谈了2年的女朋

随机推荐

  • 手写数字识别的现状

    1 研究背景 手手写数字识这项技术是光学字符识别 Optical Character Recognition 简称OCR 的一个重要分支 主要分为脱机手写数字识别和联机手写数字识别 其中 联机手写数字识别相对较简 单些 它利用实时监控数字输
  • qt信号槽同步问题

    目录 信号槽 注意事项 具体例子 线程安全问题的例子 信号槽 在Qt编程中 信号 Signal 和槽 Slot 是一种用于在对象之间进行通信的机制 信号用于发出事件 而槽用于响应这些事件 一个对象可以发出信号 另一个对象可以通过连接到该信号
  • [2018.10.25]高通QFIL刷机:高通sdm845_la2.0用QFIL软件meta_build和flat_build刷机

    1 代码准备 i amss standard oem 高通源码 ii test device amss standard oem对应的二进制文件 高通已经编译 iii caf 高通源码对应的谷歌源码 2 编译源码 将amss standar
  • 如何解决Ubuntu终端显示exprot: command not foundNo command 'pyenv' found, did you mean: Command 'p7env' from

    前天安装pyenv失败后 每次打开终端都会显示这样的错误提示 开始以为命令历史的问题 去 bashrc的历史记录中删了都没用 最后发现应该是安装的问题 解决如下 首先安装git sudo apt install git 然后克隆pyenv仓
  • 奥特曼系列ol进不去服务器,奥特曼系列OL闪退怎么办?解决方案

    奥特曼系列OL闪退怎么办 解决方案 2016 02 14 作者 说玩小编 来源 说玩网 评论 9条 我要评论 奥特曼系列OL闪退怎么办 在玩奥特曼系列OL的时候 是不是有时候会遇到黑屏或者闪退等种种问题 所以小编在这里为大家提供一些解决这些
  • c++指针的使用

    指针的基本概念 指针是一个变量 其值为另一个变量的地址 即内存位置的直接地址 指针的作用 可以通过指针间接访问内存 内存编号是从0开始记录的 一般用十六进制数字表示 可以利用指针变量保存地址 指针变量定义语法 数据类型 变量名 int ma
  • 华为OD机试 - 字符串分割(二)(Java)

    题目描述 给定一个非空字符串S 其被N个 分隔成N 1的子串 给定正整数K 要求除第一个子串外 其余的子串每K个字符组成新的子串 并用 分隔 对于新组成的每一个子串 如果它含有的小写字母比大写字母多 则将这个子串的所有大写字母转换为小写字母
  • LeetCode:用队列实现栈(纯C语言)

    题目链接 225 用队列实现栈 力扣 Leetcode 代码 CV复制黏贴 老套路二话不说 先上代码 typedef int QDataType typedef struct QueueNode struct QueueNode next
  • 找回 macOS 10.12 Sierra 安全性与隐私的设置中

    2019独角兽企业重金招聘Python工程师标准 gt gt gt is damaged and can t be opened You should move it to the Trash 当你出现上述报错时 可以参照下面做法 不少用户
  • Keil或MDK编译报错error: L6050U:

    文章目录 摘要 安装步骤 问题描述 使用软件 下载安装包 解决方案 注意事项 总结 思考 更新日志 摘要 硬件环境 无特殊要求 软件环境 Win10 安装步骤 问题描述 MDK5 报错信息 error L6050U The code siz
  • Linux修改只读文件权限

    我们在修改一些配置文件时经常会遇到文件是只读的 修改之后无法保存修改的问题 我们可以使用 chmod 命令来修改文件 夹 属性 sudo chmod 777 file name 所有用户对这个文件 夹 都有读写权限 sudo chmod 6
  • 2020DCIC智慧海洋建设算法赛学习03-特征工程

    序 特征工程往往是算法比赛中最至关重要的一环 一个好的特征工程能够让你的分数有大幅的提升 而如何做好特征工程 从哪些方面入手构建特征就需要经验积累和学习TOP选手的优秀方案 通过学习TOP选手开源代码的特征工程部分 我们可以发现 对于智慧海
  • 【JAVA】递归与迭代:选择正确的方法来解决问题

    文章目录 递归概念 代码示例 计算阶乘 斐波那契数列 遍历文件系统目录 总结 递归概念 递归是一种方法或算法 在该方法中 函数通过调用自身来解决问题 在递归中 问题被划分为更小的同类子问题 并不断地递归调用函数来解决这些子问题 直到达到终止
  • 探究HTTP常见请求头:从基础到进阶

    探究HTTP常见请求头 从基础到进阶 文章目录 探究HTTP常见请求头 从基础到进阶 1 介绍 什么是HTTP请求头 请求头的作用 2 常见请求头详解 User Agent Accept Language Referer Content T
  • 学习SpringMvc第三战-利用SpringMvc实现CRUD

    目录 一 前期环境搭建 1 替换pom xml的内容 2 导入配置文件 小编上传资源 3 修改xml文件 4 点击创建自动生成代码 5 写一个类用于处理页面跳转 二 正式启动SpringMVC的CRUD 1 建立接口 调用自动生成的接口 2
  • AB测试中如何给样本分组?

    目录 什么是AB测试 什么叫样本相似 为什么要样本相似 怎么实现样本相似 随机化 Randomization 再随机化 Rerandomization 协方差适应随机化 Covariance Adaptive Randomization 更
  • 虚拟串口工具_com0com

    因为这年头 都 2012 年了 应该没什么人有在用 Serial port 串行端口 串口 说 Serial port 大家可能想不起来 但说 COM port 大家应该就知道是什么一回事了吧 就是那个从前在计算机后方一定有的 DB9 插头
  • C++11与最小垃圾回收

    C 11新标准为了做到最小的垃圾回收支持 首先对 安全 的指针进行了定义 安全派生的指针是指向由new分配的对象或其子对象的指针 安全派生指针的操作包括 1 在解引用基础上的引用 比如 p 2 定义明确的指针操作 比如p 1 3 定义明确的
  • oracle的stored outline的创建与维护

    author skate time 2011 09 17 执行计划的稳定 如何确定哪些sql的执行计划不稳定 如何固定执行计划 执行计划直接影响app的性能 有的时候执行计划固定是很有用的 有很多因素影响执行计划的不稳定 像optimize
  • Evaluating Fuzz Testing

    1 介绍 信息量太大回头再写 一天后更新 不想写了差不多就下面这些内容吧 2 背景 2 1 fuzzing流程 fuzzing的核心算法 initSeedCorpus 初始化新的输入 isDone 决定fuzzing是否停止 choose