libtiff
0x00 环境准备
本实验均使用项目自带的虚拟机。
0x01 实验
1.1 环境准备
目录创建
cd $HOME
mkdir fuzzing_tiff && cd fuzzing_tiff/
下载tiff-4.0.4
wget https://download.osgeo.org/libtiff/tiff-4.0.4.tar.gz
tar -xzvf tiff-4.0.4.tar.gz
配置编译选项,并编译
CFLAGS="--coverage" LDFLAGS="--coverage" ./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
使用lcov获取信息
lcov --zerocounters --directory ./
# 在这个命令中,--zerocounters选项表示将代码覆盖率计数器重置为零,--directory ./表示指定当前目录为代码覆盖率信息的收集目录。
lcov --capture --initial --directory ./ --output-file app.info
# 在这个命令中,--capture选项表示收集代码覆盖率信息,--initial选项表示执行初始采样,这通常用于在测试开始前收集初始的代码覆盖率信息,--directory ./表示指定当前目录为代码覆盖率信息的收集目录,--output-file app.info表示将收集到的代码覆盖率信息保存到名为 app.info 的文件中。
$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff
lcov --no-checksum --directory ./ --capture --output-file app2.info
genhtml --highlight --legend -output-directory ./html-coverage/ ./app2.info
# 生成html输出
随后重新编译,使用ASAN模糊测试。
rm -r $HOME/fuzzing_tiff/install
cd $HOME/fuzzing_tiff/tiff-4.0.4/
make clean
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
AFL_USE_ASAN=1 make -j4
AFL_USE_ASAN=1 make install
afl-fuzz -m none -i $HOME/fuzzing_tiff/tiff-4.0.4/test/images/ -o $HOME/fuzzing_tiff/out/ -s 123 -- $HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w @@
1.2 FUZZING
1.3 分析
博客有更详细的
libxml2
0x00 环境准备
本实验均使用项目自带的虚拟机。
0x01 实验
1.1 环境准备
目录创建
cd $HOME
mkdir Fuzzing_libxml2 && cd Fuzzing_libxml2
下载并解压 libxml2-2.9.4.tar.gz
wget http://xmlsoft.org/download/libxml2-2.9.4.tar.gz
tar xvf libxml2-2.9.4.tar.gz && cd libxml2-2.9.4/
构建并安装 libxml2
sudo apt-get install python-dev
CC=afl-clang-lto CXX=afl-clang-lto++ CFLAGS="-fsanitize=address" CXXFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address" ./configure --prefix="$HOME/Fuzzing_libxml2/libxml2-2.9.4/install" --disable-shared --without-debug --without-ftp --without-http --without-legacy --without-python LIBS='-ldl'
make -j$(nproc)
make install
xml样本下载:
mkdir afl_in && cd afl_in
wget https://raw.githubusercontent.com/antonio-morales/Fuzzing101/main/Exercise%205/SampleInput.xml
cd ..
自定义字典:
mkdir dictionaries && cd dictionaries
wget https://raw.githubusercontent.com/AFLplusplus/AFLplusplus/stable/dictionaries/xml.dict
cd ..
1.2 FUZZING
afl-fuzz -m none -i ./afl_in -o afl_out -s 123 -x ./dictionaries/xml.dict -D -M master -- ./xmllint --memory --noenc --nocdata --dtdattr --loaddtd --valid --xinclude @@
afl-fuzz -m none -i ./afl_in -o afl_out -s 234 -S slave1 -- ./xmllint --memory --noenc --nocdata --dtdattr --loaddtd --valid --xinclude @@
1.3 分析
没有fuzz出crashCVE-2017-9048,有个无限循环。
样本是这样的,怀疑是对<的解析造成的。
SAX2.c的605行会进入一个循环。
cur = (const xmlChar *) 0x5555556b25c0 "<!DOCTYPE a SYSTEM \"<!DCOTYQE a", '<' <repeats 169 times>...
这个循环中会不断parse <这一个元素。但是并不会造成进行栈分配。只是移动cur指针。
多跟踪了几次,发现本质上是xml文档的多次处理,每次会重新处理一遍文档内容,然后每一次处理ctxt->depth会增加一次(1024次会跳出,或者到达了40次并且不处理huge xml)。
看这个堆栈推测就是创建了很多个解析外部实体的解析器,然后每一次解析又把该文档重新解析了一遍,从而导致了递归的调用,最后到达了1024的阈值就return了(或者到达了40并且不处理huge xml)。
一轮的循环如下。
创建新的解析器,解析到文档发现了最开始的<,执行xmlParseElement函数,使用新的解析器(其实最开始的是xmlParseContent不过没什么关系,)。
查到一个类似的漏洞,但是那个是无限递归,这个递归40次或1024次就跳出了。
https://www.cve.org/CVERecord?id=CVE-2017-16932
GIMP
0x00 环境准备
本实验均使用项目自带的虚拟机。
0x01 实验
1.1 环境准备
目录创建
cd $HOME
mkdir Fuzzing_gimp && cd Fuzzing_gimp
下载并解压 gegl-0.2.0
wget https://download.gimp.org/pub/gegl/0.2/gegl-0.2.0.tar.bz2
tar xvf gegl-0.2.0.tar.bz2 && cd gegl-0.2.0
更改源代码
sed -i 's/CODEC_CAP_TRUNCATED/AV_CODEC_CAP_TRUNCATED/g' ./operations/external/ff-load.c
sed -i 's/CODEC_FLAG_TRUNCATED/AV_CODEC_FLAG_TRUNCATED/g' ./operations/external/ff-load.c
构建gegl:
./configure --enable-debug --disable-glibtest --without-vala --without-cairo --without-pango --without-pangocairo --without-gdk-pixbuf --without-lensfun --without-libjpeg --without-libpng --without-librsvg --without-openexr --without-sdl --without-libopenraw --without-jasper --without-graphviz --without-lua --without-libavformat --without-libv4l --without-libspiro --without-exiv2 --without-umfpack
make -j$(nproc)
sudo make install
这里会构建有一些问题
直接sudo apt install libgegl-0.4-0
下载解压GIMP 2.8.16:
cd ..
wget https://mirror.klaus-uwe.me/gimp/pub/gimp/v2.8/gimp-2.8.16.tar.bz2
tar xvf gimp-2.8.16.tar.bz2 && cd gimp-2.8.16/
构建GIMP:
CC=afl-clang-lto CXX=afl-clang-lto++ PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HOME/Fuzzing_gimp/gegl-0.2.0/ CFLAGS="-fsanitize=address" CXXFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address" ./configure --disable-gtktest --disable-glibtest --disable-alsatest --disable-nls --without-libtiff --without-libjpeg --without-bzip2 --without-gs --without-libpng --without-libmng --without-libexif --without-aa --without-libxpm --without-webkit --without-librsvg --without-print --without-poppler --without-cairo-pdf --without-gvfs --without-libcurl --without-wmf --without-libjasper --without-alsa --without-gudev --disable-python --enable-gimp-console --without-mac-twain --without-script-fu --without-gudev --without-dbus --disable-mp --without-linux-input --without-xvfb-run --with-gif-compression=none --without-xmc --with-shm=none --enable-debug --prefix="$HOME/Fuzzing_gimp/gimp-2.8.16/install"
make -j$(nproc)
make install
1.2 FUZZING
cd ..
rm ./install/lib/gimp/2.0/plug-ins/*
ASAN_OPTIONS=detect_leaks=0,abort_on_error=1,symbolize=0 afl-fuzz -i './afl_in' -o './afl_out' -D -t 100 -- ./install/bin/gimp-console-2.8 --verbose -d -f @@
会出现超时,更改-t的值即可。
1.3 分析
没有fuzz出crashCVE-2016-4994,有个内存耗尽的hang。
这个太明显了,不分析数据来源了。
看了一下有没有类似的洞,vuldb上没找到老版本的,但是新版本有个CVE-2022-30067与其类似。
1.4 总结
本次使用持久模式对目标代码进行一系列的更改。正厂模式下,对于每一个生成的测试文件都会fork出一个新的目标进程进行处理,大量的fork会带来一定的开销。为此在持久模式下,每次fork得到的进程会对一批测试文将进行处理。不过使用持久模式,需要注意在循环中完成环境的重置、资源的释放,以避免初始状态错误或者资源耗尽的问题。
文章评论