このリポジトリには、「Finding CVE-2022-3786 (openssl) with Mayhem」というタイトルのブログ記事(https://www.seandeaton.com)が付属しています。
これらはすべて、同梱の Dockerfile(DockerHub にもあります)を使用して処理されます。次のように実行できます。
# コンテナをビルドする
docker build --tag openssl-cve-2022-3768 .
# または、既存のものをプルするだけの場合:
TODO
# このプロジェクトのルートディレクトリにいることを確認してください(つまり、./output/ が見えること)
# ./input/ ディレクトリをコンテナの /input にマウントします。これはファズ入力用です。
# これは Linux 固有です。Windows では $(pwd) の代わりに %CD% を使用すると思います。
docker run --interactive --tty --volume $(pwd)/input:/input
コンテナのエントリポイントは、afl を実行するだけなので、すぐにファジングを開始できます。この動作を上書きするには、docker run 行の末尾に /bin/bash を追加します。
脆弱性が含まれている最後のコミットは、2022年11月1日のコミット SHA 3b421ebc64c7b52f1b9feb3812bdc7781c784332 です。これはコミット SHA 680e65b94c916af259bfdc2e25f1ab6e0c7a97d6 で修正されました。脆弱性のあるバージョンは git を使用して簡単に入手できます。
# リポジトリをクローンする。
git clone git://git.openssl.org/openssl.git
# ワーキングディレクトリに移動する。
cd openssl
# 脆弱だった時点のコードを調べるために、HEAD を origin から切り離す。
git checkout 3b421ebc64c7b52f1b9feb3812bdc7781c784332
コンパイルには、AFL の gcc コンパイラを使用します(clang では未定義参照が発生し続けたため)。小さなバッファオーバーフローオフセットのため、アドレスサニタイゼーション(ASAN)も使用したいところです。これは AFL の環境変数 AFL_USE_ASAN で有効にできます。ASAN は大量のメモリを使用するため、プログラムを32ビットアーキテクチャ向けにコンパイルすることでアドレス空間を制限する必要もあります。詳細はこちら。
OpenSSL の32ビット構成は、フラグ -m32 と linux-generic32 を受け入れます。compile.sh スクリプトがこれを自動で行います。
# 設定
AFL_USE_ASAN=1 CC=afl-gcc-fast CXX=afl-g++-fast ./Configure -m32 linux-generic32
# ビルド
AFL_USE_ASAN=1 CC=afl-gcc-fast CXX=afl-g++-fast CFLAGS="-m32" CXXFLAGS="-m32" make
システムのリソースによっては時間がかかる場合があります。コンパイル後、ハーネスをコンパイルする必要があります。Makefile が用意されています。
# ハーネスをコンパイルする。
$ make harness
# ハーネスを実行する。
$ ./harness input/seed0.txt
ossl_a2ulabel returned: 1
これで、openssl 内の ossl_a2ulabel のファジングを開始できます。AFL を使用する場合、コマンドは次のようになります(または、同梱の run.sh スクリプトを使用してください)。
afl-fuzz -i /input -o /output /harness/harness @@