This repository provides the source code for GUIFuzz++: a prototype grey-box fuzzer for GUI-based applications on Linux.
This work is presented in our paper GUIFuzz++: Unleashing Grey-box Fuzzing on Desktop Graphical User Interfacing Applications, appearing in the 2025 IEEE/ACM International Conference on Automated Software Engineering (ASE'25).
Citing this repository: |
@inproceedings{otto:guifuzzplusplus, title = {GUIFuzz++: Unleashing Grey-box Fuzzing on Desktop Graphical User Interfacing Applications}, author = {Dillon Otto and Tanner Rowlett and Stefan Nagy}, booktitle = {{IEEE/ACM} {International} {Conference} on {Automated} {Software} {Engineering} ({ASE})}, year = {2025},}
|
Maintainers: | Tanner Rowlett ([email protected]) and Stefan Nagy ([email protected]) |
License: | MIT License |
Disclaimer: | This software is provided as-is with no warranty. |
This setup was tested on Ubuntu 24.04.3 LTS. You may run into compiling issues if you have less than 16GB of RAM.
Create a new project folder, e.g.:
mkdir guifuzzing
cd guifuzzing
GUIFuzz++ has typically been used with Qt 6.8.1
, some apps will work with apt installs of Qt as well.
Download dependencies:
sudo apt update
sudo apt install libxcb-cursor0 libxcb-cursor-dev
Download and install QT via the online installer. This will require you to login to Qt:
wget https://download.qt.io/official_releases/online_installers/qt-online-installer-linux-x64-online.run
chmod +x qt-online-installer-linux-x64-online.run
./qt-online-installer-linux-x64-online.run
Under Installation options
pick the directory you want to install e.g. /home/guifuzz/guifuzzing/Qt
.
Uncheck anything selected by default and only select Custom Installation
.
Under Customize
click the Show
dropdown, and check Archive
.
Extensions
Qt WebEngine 6.8.1
Qt
Select Desktop
, Qt Debug Information Files (optional)
, and the following additional libraries:
Qt 6.8.1
Additional Libraries
Qt 5 Compatibility Module
Qt Charts
Qt Multimedia
Qt Quick 3D
Qt Quick Timeline
Qt Shader Tools
Qt Speech
Qt State Machines
Qt WebChannel
Qt WebSockets
Qt WebView
Your installation should require ~7.3GB (11.8GB with Debug Info):
sudo apt install git make cmake extra-cmake-modules build-essential python3-chardet scrot python3-tk python3-dev python3-pip python3-sphinxcontrib*
NOTE: Use a venv if you have other python projects/installs:
sudo pip3 install pyautogui --break-system-packages
Add user to display users:
xhost +SI:localuser:$(whoami)
Clone this repo:
git clone https://github.com/FuturesLab/GUIFuzzPlusPlus.git
Build GUIFuzz++
cd GUIFuzzPlusPlus
make -j$(nproc)
After this, GUIFuzz++ should be ready to go. You'll want to compile some apps to fuzz using the GUIFuzz++ compilers (afl-clang-fast
, etc.).
Setup an app following its repo instructions. For KDE apps you can also use kdesrc-build:
kdesrc-build can be used to build some of the applications GUIFuzz++ was benchmarked on, below are steps to get a KDE app setup.
Initial Setup
git clone https://invent.kde.org/sdk/kdesrc-build
cd kdesrc-build
./kdesrc-build --initial-setup
Modules You will need to create a module for each KDE app you want to build using kdesrc-build.
Add modules to the kdesrc config file:
nano ~/.config/kdesrc-buildrc
module kolourpaint
repository https://invent.kde.org/graphics/kolourpaint.git
branch master
set-env CC /home/guifuzz/guifuzzing/GUIFuzzPlusPlus/afl-clang-fast
set-env CXX /home/guifuzz/guifuzzing/GUIFuzzPlusPlus/afl-clang-fast++
end module
Build
./kdesrc-build kolourpaint
This will install to ~/kde/
by default.
NOTE:
kdesrc-build can be difficult with dependencies, it might be easier to install directly from the application git repo.
You can find more info at https://community.kde.org/Guidelines_and_HOWTOs/Build_from_source
.
Before building targets you (may) need to add the custom Qt install to your PATH
and CMAKE_PREFIX_PATH
:
echo 'export PATH="/home/guifuzz/guifuzzing/Qt/6.8.1/gcc_64/bin:$PATH"' >> ~/.bashrc
echo 'export CMAKE_PREFIX_PATH="/home/guifuzz/guifuzzing/Qt/6.8.1/gcc_64:$CMAKE_PREFIX_PATH"' >> ~/.bashrc
source ~/.bashrc
Then follow target repo instructions to build, swap CC
and CXX
compilers with GUIFuzz++'s compilers:
Umbrello is easiest to setup with Qt5, you'll need these dependencies:
sudo apt install qtbase5-dev qttools5-dev qttools5-dev-tools libkf5coreaddons-dev libkf5i18n-dev libkf5kio-dev libkf5archive-dev libkf5completion-dev libkf5config-dev libkf5crash-dev libkf5doctools-dev libkf5iconthemes-dev libkf5texteditor-dev libkf5widgetsaddons-dev libkf5windowsystem-dev libkf5xmlgui-dev
Clone and build:
git clone https://github.com/KDE/umbrello.git
cd umbrello
mkdir build && cd build
# Set CC & CXX
export CC=/home/guifuzz/guifuzzing/GUIFuzzPlusPlus/afl-clang-fast
export CXX=/home/guifuzz/guifuzzing/GUIFuzzPlusPlus/afl-clang-fast++
cmake -DCMAKE_BUILD_TYPE=Debug ../
make -j$(nproc)
The binary should be at:
umbrello/build/bin/umbrello5
After you've compiled an app with a GUIFuzz++ compiler you can start a trial with a command like this:
/path/to/GUIFuzzPlusPlus/afl-fuzz \
-K /path/to/GUIFuzzPlusPlus/gui_utils/atspi_clicks.py \
-t 100000 -i in -o out -m none -- /path/to/app
You need to populate the in directory with seed files. The easiest way to do this is use generate_random_bytes.py in GUIFuzzPlusPlus/gui_utils
.
Example usage: python3 generate_random_bytes.py 300 seed
This will generate 300
random bytes (i.e., 100
random 3
-byte interactions; see our paper for details).
Adjust -t
if needed (indivudal executions can be slow, so 100
seconds is reasonable).
For AFL++, you will likely need to run:
echo core | sudo tee /proc/sys/kernel/core_pattern
We recommend saving the following in a .sh
for easier spinup:
/home/guifuzz/guifuzzing/GUIFuzzPlusPlus/afl-fuzz \
-K /home/guifuzz/guifuzzing/GUIFuzzPlusPlus/gui_utils/atspi_clicks.py \
-t 100000 -i in -o out -m none -- /home/guifuzz/guifuzzing/targets/umbrello/build/bin/umbrello5
If an app doesn't compile, try different CC
/CXX
options (such as afl-clang-fast
, afl-gcc
, afl-clang
, etc.).
Certain apps may require adding the custom Qt install to LD_LIBRARY_PATH
.
If the app opens but doesn't interact, check your XDG
session type, you need to be using x11
/Xorg
:
echo $XDG_SESSION_TYPE
x11 # GUIFuzz++ won't work with wayland
An Ubuntu 24.04.3 .qcow2
image with GUIFuzz++ ready to run can be found on Zenodo.
This image also comes with Umbrello fuzz ready so you can see GUIFuzz++ in action!
Decompiler | Reported Bugs |
---|---|
Dia | GNOME/dia#568 |
Glaxnimate | KDE/glaxnimate#703, KDE/glaxnimate#707 |
Kcalc | KDE/kcalc#504679 |
KolourPaint | KDE/kolourpaint#498550, KDE/kolourpaint#502689, KDE/kolourpaint#504786, KDE/kolourpaint#504787 |
LabPlot2 | KDE/labplot2#502043, KDE/labplot2#504794, KDE/labplot2#504839 |
LibreCAD | LibreCAD/LibreCAD#2093, LibreCAD/LibreCAD#2161 |
Mate-Calc | mate-desktop/mate-calc#226 |
Plotjuggler | facontidavide/PlotJuggler#1052 |
QCAD | QCAD/QCAD#11668 |
Umbrello | KDE/umbrello#502347, KDE/umbrello#504939, KDE/umbrello#504940, KDE/umbrello#504941, KDE/umbrello#504942 |
Xcalc | xorg/xcalc#3, xorg/xcalc#4 |
If you find new bugs using GUIFuzz++, please let us know!