
Auffinden von CVE-2022-3786 (openssl) mit Mayhem
Dieses Repository enthält einen begleitenden Blogbeitrag mit dem Titel "Finding CVE-2022-3786 (openssl) with Mayhem" unter https://www.seandeaton.com.
All dies wird für Sie mit dem enthaltenen Dockerfile (auch auf DockerHub) erledigt. Sie können es wie folgt ausführen:
# Build the container
docker build --tag openssl-cve-2022-3768 .
# Or if you just want to pull down the existing one:
TODO
# Ensure that you're in this project's root directory (ie you can see ./output/)
# Mount the ./input/ directory to the containers /input. This is for fuzz input.
# This is Linux specific, Windows I think has %CD% in lieu of $(pwd)?
docker run --interactive --tty --volume $(pwd)/input:/input
Der Einstiegspunkt des Containers besteht darin, einfach afl auszuführen, damit Sie sofort mit dem Fuzzing beginnen können. Um dieses Verhalten zu überschreiben, hängen Sie /bin/bash an das Ende der docker run-Zeile an.
Der letzte Commit, der die Schwachstelle enthält, ist der Commit SHA 3b421ebc64c7b52f1b9feb3812bdc7781c784332 vom 1. November 2022. Sie wurde im Commit SHA 680e65b94c916af259bfdc2e25f1ab6e0c7a97d6 behoben. Wir können die verwundbare Version einfach mit git erhalten:
# Clone the repository.
git clone git://git.openssl.org/openssl.git
# Change into the working directory.
cd openssl
# Detach HEAD from origin to examine the code as it was when it was vulnerable.
git checkout 3b421ebc64c7b52f1b9feb3812bdc7781c784332
Für die Kompilierung verwenden wir den gcc-Compiler von AFL (da ich mit clang ständig undefinierte Referenzen erhielt). Aufgrund des geringen Pufferüberlauf-Offsets möchten wir auch die Address Sanitization (ASAN) verwenden, die mit der Umgebungsvariablen AFL_USE_ASAN von AFL aktiviert wird. Aufgrund des hohen Speicherbedarfs von ASAN müssen wir auch den Adressraum einschränken, was wir durch die Kompilierung des Programms für eine 32-Bit-Architektur erreichen können. Weitere Details hier.
Die Konfiguration von OpenSSL für 32-Bit verwendet die Flags -m32 und linux-generic32. Das Skript compile.sh erledigt dies für Sie.
# Configuration
AFL_USE_ASAN=1 CC=afl-gcc-fast CXX=afl-g++-fast ./Configure -m32 linux-generic32
# Make
AFL_USE_ASAN=1 CC=afl-gcc-fast CXX=afl-g++-fast CFLAGS="-m32" CXXFLAGS="-m32" make
Dies kann je nach den Ressourcen Ihres Systems eine Weile dauern. Nach der Kompilierung müssen wir unseren Harness kompilieren. Eine Makefile ist vorhanden.
# Compile the harness.
$ make harness
# Run the harness.
$ ./harness input/seed0.txt
ossl_a2ulabel returned: 1
Und schon können Sie mit dem Fuzzing von ossl_a2ulabel in openssl beginnen. Mit AFL sieht der Befehl etwa wie folgt aus (oder verwenden Sie einfach das enthaltene Skript run.sh).
afl-fuzz -i /input -o /output /harness/harness @@