
Encontrando CVE-2022-3786 (openssl) com Mayhem
Este repositório tem um post de blog complementar intitulado 'Finding CVE-2022-3786 (openssl) with Mayhem' em https://www.seandeaton.com.
All of this is taken care of for you with the included Dockerfile (also on DockerHub). You can run it like so:
# 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
O ponto de entrada do container é apenas executar afl para que você possa começar a fuzzing imediatamente. Para sobrescrever esse comportamento, acrescente /bin/bash ao final da linha docker run.
O último commit que inclui a vulnerabilidade é o commit SHA de 1 de novembro de 2022. Foi corrigido no commit SHA . Podemos obter a versão vulnerável facilmente com :
3b421ebc64c7b52f1b9feb3812bdc7781c784332680e65b94c916af259bfdc2e25f1ab6e0c7a97d6gitgit clone git://git.openssl.org/openssl.git
cd openssl
git checkout 3b421ebc64c7b52f1b9feb3812bdc7781c784332
Para a compilação, usamos o compilador gcc do AFL (porque eu continuava recebendo referências indefinidas com clang). Devido ao pequeno deslocamento de buffer overflow, também queremos usar a sanitização de endereço (ASAN), habilitada com a variável de ambiente do AFL AFL_USE_ASAN. Dado o uso de grandes quantidades de memória pelo ASAN, também precisamos restringir o espaço de endereço, o que podemos fazer compilando o programa para uma arquitetura de 32 bits. Mais detalhes aqui.
A configuração do OpenSSL para 32 bits aceita as flags -m32 e linux-generic32. O script compile.sh faz isso para você.
# 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
Isso pode levar algum tempo dependendo dos recursos do seu sistema. Após a compilação, precisamos compilar nosso harness. Um Makefile é fornecido.
# Compile the harness.
$ make harness
# Run the harness.
$ ./harness input/seed0.txt
ossl_a2ulabel returned: 1
E pronto, você pode começar a fuzzing o ossl_a2ulabel no openssl. Com AFL, o comando se parece com algo assim (ou apenas use o script run.sh incluído).
afl-fuzz -i /input -o /output /harness/harness @@