使用AFL++对GIMP2.10.30进行漏洞挖掘

使用AFL++对GIMP2.10.30进行漏洞挖掘

前言

因为最近找实习找到自闭了,还被公司的人说没有实战漏洞挖掘经验,心态崩了,明明我简历里就有漏洞编号,只是写到最后面去了,哭辽,什么时候能找到实习啊!(已经拿到长亭offer了) 这里是看到fuzz101项目里有对GIMP的fuzz,我找了最新版本的GIMP进行fuzz,看看能不能fuzz出漏洞。

AFL++安装

依赖安装

这里使用的是ubuntu20.04,llvm、lld和clang都用12的版本,11的版本一直编译不出来lto模式

1
2
3
4
sudo apt-get update
sudo apt-get install -y build-essential python3-dev automake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools
sudo apt-get install -y lld-12 llvm-12 llvm-12-dev clang-12 || sudo apt-get install -y lld llvm llvm-dev clang 
sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-dev

下载编译AFL++

1
2
3
4
5
cd $HOME
git clone https://github.com/AFLplusplus/AFLplusplus && cd AFLplusplus
export LLVM_CONFIG="llvm-config-12"
make distrib
sudo make install

(终于可以编译出afl-clang-lto了)

GIMP安装

依赖安装

1
sudo apt-get install build-essential libatk1.0-dev libfontconfig1-dev libcairo2-dev libgudev-1.0-0 libdbus-1-dev libdbus-glib-1-dev libexif-dev libxfixes-dev libgtk2.0-dev python2.7-dev libpango1.0-dev libglib2.0-dev zlib1g-dev intltool libbabl-dev libjson-glib-dev libjpeg-dev

安装babl

1
2
wget https://download.gimp.org/pub/babl/0.1/babl-0.1.92.tar.xz
tar xvf babl-0.1.92.tar.xz && cd babl-0.1.92

把meson.build里面58-59行删了,然后开始编译

1
2
3
meson _build
ninja -C _build
sudo ninja -C _build install

安装GEGL图形库

1
2
3
4
5
wget https://download.gimp.org/pub/gegl/0.4/gegl-0.4.36.tar.xz
tar xvf gegl-0.4.36.tar.xz && cd gegl-0.4.36
meson _build
ninja -C _build
sudo ninja -C _build install

安装GIMP

这次我们fuzz的gimp 2.10.30版本

1
2
wget https://download.gimp.org/pub/gimp/v2.10/gimp-2.10.30.tar.bz2
tar xvf gimp-2.10.30.tar.bz2 && cd gimp-2.10.30

在编译之前,我们需要用到AFL的持久模式,需要在app/xcf文件下的xcf.c加入持久模式的宏

image-20220408142709318

然后configure,这里用到了AFL++的afl-clang-lto进行插桩,afl-clang-lto比afl-clang-fast速度要快,并且不会造成哈希碰撞

1
2
3
CC=afl-clang-lto CXX=afl-clang-lto++ PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HOME/Fuzzing_gimp/gegl-0.4.36/ 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.10.30/install"
make -j$(nproc)
make install

image-20220408143001160

缺少的库一个一个安装就好

1
sudo apt install -y libgexiv2-dev libtiff-dev librust-bzip2-dev liblzma-dev libmypaint-dev mypaint-brushes librsvg2-dev libpoppler-glib-dev

使用AFL++进行fuzz

种子获取

这里我们需要用xcf文件,可以去google搜索xcf file download下载几个示例文件

Fuzzer运行

1
ASAN_OPTIONS=detect_leaks=0,abort_on_error=1,symbolize=0 afl-fuzz -i './afl_in' -o './afl_out' -D -t 100 -- ./gimp-2.10.30/install/bin/gimp-console-2.10 --verbose -d -f @@

最好-D打开位翻转等变异功能

image-20220408152355780

等它跑多几天看看

结果

这边分析发现一个crash,向作者提交了issue

https://gitlab.gnome.org/GNOME/gimp/-/issues/8120