对 fuzz 的一点总结
写在前面
其实,本来是想去年年底总结一下的,可人总是容易拖延,这一拖延就不知道到了什么时候。
古人说,穷则思变。正好借着机会,整理一下之前的一个学习思路,日后可以定期更新一下本篇文章(关于 fuzz 主题吧)。
安全行业资讯的一些来源
fuzz 书籍
- Fuzzing for Software Security Testing and Quarity Assurance(second edition)
- Fuzzing: Brute Force Vulnerability Discovery— 中文版为 “模糊测试–强制性安全漏洞挖掘”。
加了个网盘链接(链接 提取码: h67f),如果不妥的话,我就取消掉。
fuzzer 分类
- 注入向量或攻击向量
应用程序
- 服务端
- 客户端
- 文件/媒体类
—— 图形库
—— 内存处理
—— OS 系统调用
—— 网络 API - 文件系统 —— NFS CIFS ISCSI RPC
- APPS/GUI ——- OSI 应用层
- 蓝牙/无线协议 —– 无线数据链路层
- 测试用例复杂程度
输入 软件层面 解码/语法验证/语义验证
a. 静态/随机的基于模板的 fuzzer ==> 请求-响应 协议,文件格式
b. 基于块的 fuzzer ==> 校验和/长度值校验
c. 动态生成/基于进化的 fuzzer ==> 无需理解协议/文件格式 基于反馈的
d. 基于模型/模拟的 fuzzer
(以上是 fuzz 软件安全测试书中的定义)
- 或者按下面这种分也可以:
- 基于生成/基于变异的fuzzer
- 输入感知/程序感知与否的fuzzer
fuzz tutorial/教程/思路/文章
一些博客网站
下面简单地按照一些标准分了一下类,可能不太准确,后面会慢慢更新。
fuzz 原理/方法论 相关
文件格式类 相关 fuzz
浏览器 相关 fuzz
https://www.kitploit.com/2018/11/bfuzz-fuzzing-browsers-chrome-firefox.html | bfuzz fuzz 浏览器 |
https://bugid.skylined.nl/20181017001.html | fuzz 浏览器(domato) |
http://blog.ret2.io/2018/07/25/pwn2own-2018-safari-sandbox/ | fuzz Safari |
https://sigpwn.io/blog/2018/5/13/adding-afl-bloom-filter-to-domato-for-fun | afl + domato fuzz IE 11 |
https://drive.google.com/file/d/0B4ZwSwfSILSIcWhzY1NnY0lrNEk/view | fuzz 浏览器寻找可利用的漏洞 |
https://sensepost.com/blog/2015/wadi-fuzzer/ | wadi 浏览器 fuzzer |
网络协议/加密相关 fuzz
系统/内核 相关fuzz
https://trapmine.com/blog/from-0-to-ring0day-sifirdan-ioctl-fuzzing-ve-kernel-zafiyet-kesfi/ | IOCTL fuzz |
http://t.cn/EMqW1a7 | syzkaller fuzz usb |
https://www.kitploit.com/2017/12/difuze-fuzzer-for-linux-kernel-drivers.html | fuzz linux 内核 驱动 |
https://www.slideshare.net/PeterHlavaty/you-didnt-see-its-coming-dawn-of-hardened-windows-kernel | 科恩 windows 内核fuzz |
https://labs.mwrinfosecurity.com/publications/platform-agnostic-kernel-fuzzing | 内核 fuzz |
https://speakerdeck.com/marcograss/50-shades-of-fuzzing | 科恩的 VM / win32k fuzz |
https://lwn.net/Articles/677764/ | 覆盖率引导的内核 fuzz –syzkaller |
文本处理相关 fuzz
编译器/解释器 fuzz
硬件/IOT 相关 fuzz
安卓/移动端相关 fuzz
虚拟化 相关 fuzz
https://insinuator.net/2018/11/h2hc2018/ | |
http://www.alex-ionescu.com/?m=201901 | hyper-V 中fuzz 两则 |
Web APP 相关 fuzz
ps: 其实本部分的很大一部分内容来源于 玄武实验室的 sec.today 中的内容,想了一下还是整理一下,毕竟整理一下也是一个学习的过程,一则理清自己的思路,二则对 fuzz近些年来的进展有更深的认识。
ppt/pdf/conference
- https://infiltratecon.com/
- https://www.offensivecon.org/
- https://events.ccc.de/congress/
- http://www.powerofcommunity.net/
- https://blackhat.com/
- https://www.defcon.org/
- to be added…
工具 — github
下面的链接简要分了下类,后面会再接着更新。
1
2
fuzz 测试用例/种子(文件格式类)
- 常见的种子库网站:
- https://dev-www.libreoffice.org/corpus/ 包含常见的office 格式,docx,pptx,xlsx等等,tiff ,tga,ppm 等图片格式。
- http://cd.textfiles.com/fantaziasampler/
- https://download.osgeo.org/geotiff/samples/
- 一些 fuzz 博客中提到的种子网站(比如j00ru, checkpoint等等)
… 主要靠平时积累
- 格式转换,由其他格式转换而来,比如图片类/文档格式类;
- 爬虫,大规模地从互联网上爬取,后续做精简;
- 一些项目(类似项目)所自带的 test suite/corpus/testdata;
- 历史的 poc,回归测试用例(openjpeg-fuzzdata);
- 基于语法的,定义规则生成测试用例,典型的比如说 domato。
测试用例去重
- afl 自带的 afl-cmin 和 afl-tmin
- https://github.com/MozillaSecurity/lithium 基于行的测试样例精简工具
- https://github.com/googleprojectzero/halfempty 快速、并行的测试样例精简工具
fuzz 工作的想法
其实 关于 如何 fuzz,上面的很多博客文章中阐述得已经相当的清晰明了,我说下关于我自身的体会:
首先选定一类目标,先看下是否以往有人 fuzz 过,如果有的话,有无必要复现当时他的一个过程;
有的话,可以尝试复现,后面看是否可以改进,按照自己的思路进行fuzz;没有的话,粗略看一下就完事儿了。
- 挑选 fuzz 目标,找到其存在的攻击面;
- 选择 适合该类目标的 fuzzer, 搭建环境,开始 fuzz;
- 根据 fuzz 的结果,评估总结之前的工作,决定下一步的方向。
- 其实,对于一些比较复杂的软件系统(比如浏览器)来说,fuzz 之前的准备工作应该会比较漫长,需要明确一个大概的思路,以及在哪些模块会出问题,可能出问题,这样后面的过程就会好做一点。
写在最后
随着安全行业的日趋成熟,漏洞挖掘逐渐变成一项越来越难的工作。在我看来,不论最终漏洞能否挖到,在安全研究中不断学习、不断提升自我,与志同道合的朋友们一起成长才应该是真正乐趣所在,总之,开心就好!