
Encontrando CVE-2022-3786 (openssl) con Mayhem
Este repositorio tiene una publicación de blog complementaria titulada "Finding CVE-2022-3786 (openssl) with Mayhem" en https://www.seandeaton.com.
Todo esto está resuelto para ti con el Dockerfile incluido (también en DockerHub). Puedes ejecutarlo así:
# 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
El punto de entrada del contenedor es simplemente ejecutar afl para que puedas comenzar a fuzzear inmediatamente. Para anular este comportamiento, agrega /bin/bash al final de la línea de docker run.
El último commit que incluye la vulnerabilidad es el commit SHA 3b421ebc64c7b52f1b9feb3812bdc7781c784332 del 1 de noviembre de 2022. Se corrigió en el commit SHA 680e65b94c916af259bfdc2e25f1ab6e0c7a97d6. Podemos obtener la versión vulnerable fácilmente con 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
Para la compilación, usamos el compilador gcc de AFL (porque seguía obteniendo referencias indefinidas con clang). Debido al pequeño desplazamiento del desbordamiento de búfer, también queremos usar la sanitización de direcciones (ASAN), habilitada con la variable de entorno AFL_USE_ASAN de AFL. Dado el uso de grandes cantidades de memoria por parte de ASAN, también necesitamos restringir el espacio de direcciones, lo cual podemos hacer compilando el programa para una arquitectura de 32 bits. Más detalles aquí.
La configuración de OpenSSL para 32 bits utiliza las banderas -m32 y linux-generic32. El script compile.sh hace esto por ti.
# 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
Esto podría tomar un tiempo dependiendo de los recursos de tu sistema. Después de la compilación, necesitamos compilar nuestro harness. Se proporciona un Makefile.
# Compile the harness.
$ make harness
# Run the harness.
$ ./harness input/seed0.txt
ossl_a2ulabel returned: 1
Y ahí lo tienes, puedes comenzar a fuzzear ossl_a2ulabel en openssl. Con AFL, el comando se ve algo como lo siguiente (o simplemente usa el script run.sh incluido).
afl-fuzz -i /input -o /output /harness/harness @@