
Découverte de CVE-2022-3786 (openssl) avec Mayhem
Ce dépôt est accompagné d'un billet de blog intitulé « Finding CVE-2022-3786 (openssl) with Mayhem » sur https://www.seandeaton.com.
Tout ceci est pris en charge pour vous avec le Dockerfile inclus (également sur DockerHub). Vous pouvez l'exécuter comme suit :
# 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
Le point d'entrée du conteneur exécute simplement afl pour que vous puissiez commencer le fuzzing immédiatement. Pour modifier ce comportement, ajoutez /bin/bash à la fin de la ligne docker run.
Le dernier commit contenant la vulnérabilité est le commit SHA 3b421ebc64c7b52f1b9feb3812bdc7781c784332 du 1er novembre 2022. Il a été corrigé dans le commit SHA 680e65b94c916af259bfdc2e25f1ab6e0c7a97d6. Nous pouvons obtenir la version vulnérable facilement avec git :
# 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
Pour la compilation, nous utilisons le compilateur gcc d'AFL (car j'obtenais des références non définies avec clang). En raison du petit offset du débordement de tampon, nous voulons également utiliser l'adresse de sanitization (ASAN), activée avec la variable d'environnement d'AFL AFL_USE_ASAN. Étant donné l'utilisation importante de mémoire par ASAN, nous devons également restreindre l'espace d'adressage, ce que nous pouvons faire en compilant le programme pour une architecture 32 bits. Plus de détails ici.
La configuration d'OpenSSL pour 32 bits utilise les flags -m32 et linux-generic32. Le script compile.sh le fait pour vous.
# 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
Cela peut prendre un certain temps en fonction des ressources de votre système. Après la compilation, nous devons compiler notre harnais. Un Makefile est fourni.
# Compile the harness.
$ make harness
# Run the harness.
$ ./harness input/seed0.txt
ossl_a2ulabel returned: 1
Et voilà, vous pouvez commencer à fuzzer ossl_a2ulabel dans openssl. Avec AFL, la commande ressemble à ce qui suit (ou utilisez simplement le script run.sh inclus).
afl-fuzz -i /input -o /output /harness/harness @@