最近在研究AI安全,已经好久没时间更新PWN的文章了,但最近也算有了一点成果,提了2个CVE漏洞,主要挖掘方法就是利用Fuzz方法。文字首先介绍下Fuzz的基本原理、然后说下业界主流的Fuzz工具,最后说下挖掘漏洞
Fuzz的组成部分和简介
传统的Fuzz的组成分为3大块:初始值、变异器、监控器,即通过变异器对初始值进行变异,然后输入到要测试的程序中,使用监控器监控测试程序的异常,以达到测试目的。
还有种smartFuzz,基本原理差不多,只不过进行了优化,它是基于文件格式规范来生成,最著名的是Peach,以前是开源的工具,后来商业化了,华为使用的2大Fuzz工具是Peach和codenomicon。
常用的Fuzz测试工具
这里只介绍下免费或者开源的,github上有的。
- american fuzzy lop(AFL)(我挖掘漏洞主要是使用AFL)
- libfuzzer
- honggfuzz
常用的内存分析工具
- valgrind
- ASAN(Address-Sanitizier),GCC 4.8以上版本使用ASAN时不需要安装第三方库,通过在编译时指定编译CFLAGS即可打开开关。
Fuzz实践
以jasper为例子:
1.下载源代码 git clone https://github.com/mdadams/jasper.git
- 解压,
tar -vzxf jasper-2.0.14.tar.gz
cd jasper-2.0.14
mkdir BUILD
cd BUILD
3.设定编译器,注意在编译前需要把编译器设定为AFL的的编译器
export CC=afl-clang
export CXX=afl-clang++
- 编译安装
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DCMAKE_SKIP_INSTALL_RPATH=YES -DCMAKE_INSTALL_DOCDIR=/usr/share/doc/jasper-2.0.14
make install
- 创建AFL-FUZZ的输入文件
mkdir inFuzz output
- 从AFL的官网获取Fuzz的样本文件,然后开始Fuzz
afl-fuzz -i inFuzz -o outFuzz jasper --input @@ --output test.bmp --output-format bmp
- 跑出crash后,使用valgrind结合源码分析是否是漏洞
valgrind -v --tool=memcheck --leak-check=full jasper --input id:000035,sig:06,src:002011,op:havoc,rep:2
--output test.bmp --output-format bmp
- 提交CVE漏洞
提交流程可以看下文章:
(1). CVE申请的那些事
(2). CVE申请的那些事-后记
CVE后记
通过Fuzz的方法,1个月内发现了多个CVE,这说明CVE的发现并不是很困难,困难的是分析漏洞,然后利用漏洞,下一步的目标是通过学习缓冲区溢出来利用CVE漏洞,这也是我一直在学习PWN的原因。