👏

fuzzilliでV8をファジングする

2024/04/13に公開

fuzzilli

皆さんは fuzzilli というツールをご存知でしょうか?
これは JavaScript エンジンのファジングに特化したファザーです。
今回はこちらのツールを使用して Chrome や NodeJS で使用されている V8 をファジングしていこうと思います。

参考にした記事

と言っても今回は下記の記事を参考にしました。
https://www.gandalf.site/2023/03/fuzz101-10fuzz-v8-origin.html

準備

環境

環境は Ubuntu 22.04.2 LTS

ツールの準備

fuzzilli をインストール、 V8 をビルドするにあたり必要なツールを準備する。

sudo apt --yes install clang libpython2.7 libpython2.7-dev libcurl4 git

Swift をインストール

cd $HOME
wget https://download.swift.org/swift-5.7.3-release/ubuntu2204/swift-5.7.3-RELEASE/swift-5.7.3-RELEASE-ubuntu22.04.tar.gz
tar xzvf swift-5.7.3-RELEASE-ubuntu22.04.tar.gz
sudo mv swift-5.7.3-RELEASE-ubuntu22.04 /usr/share/swift

fuzzilli をインストール

cd $HOME
wget https://github.com/googleprojectzero/fuzzilli/archive/refs/tags/v0.9.3.zip
unzip v0.9.3.zip
cd fuzzilli-0.9.3/
swift build -c release -Xlinker='-lrt'

V8 エンジンをビルド

ファジング対象の V8 エンジンをビルドします。
少々コマンドが独特ですがやっていることは、ダウンロードしてコンパイルしているだけです。

dept_tools をダウンロードしてセットアップする

V8 は dept_tools というツールを用いて管理しています。
これは Google がパッケージを管理するために用いているツールだとか何とか。
筆者は bash ではなく zsh を使用しているので .zshrc に設定を書きます。

cd $HOME
mkdir depot_tools && cd depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
echo "export PATH=`pwd`/depot_tools:$PATH" >> ~/.zshrc
source  ~/.zshrc

V8 のソースコードを取得する

dept_tools をセットアップしたのでこれで無事 V8 のソースコードを取得できるようになりました。
早速 V8 をダウンロードしましょう。

cd $HOME
mkdir Fuzzing_v8 && cd Fuzzing_v8
fetch v8
cd v8
git checkout origin
gclient sync

V8 をビルド

V8 をビルドしましょう。

./build/install-build-deps.sh
gn gen out/Release "--args=is_debug=false"
ninja -C out/Release

ビルドに関してですが筆者の環境だとかなり時間がかかりました。
適当に時間を潰しましょう。

ビルドが完了したら次のコマンドで V8 (をコマンドで扱うd8) が使えるか確認します。

./out/Release/d8 ./test/fuzzer/parser/hello-world

hello world と出力されたら正常にビルドできています。

ファジング

fuzzilli を使用して V8 をファジングします。

cd $HOME/Fuzzing_v8/v8
../../fuzzilli-0.9.3/Targets/V8/fuzzbuild.sh

これまた時間がかかりますがファジング用のターゲットである V8 が ./out/fuzzbuild/d8 にビルドされます。

次に fuzzilli ディレクトリに移動します。

cd $HOME/fuzzilli-0.9.3

次にコアダンプを出力しないようにします。

sudo sysctl -w 'kernel.core_pattern=|/bin/false'

ファジングを実行します。

swift run -Xlinker='-lrt' -c release FuzzilliCli --profile=v8 '/home/user/Fuzzing_v8/v8/out/fuzzbuild/d8'

筆者は一日回していますが全然クラッシュしません。
適当に fuzzilli の入力を変えてクラッシュを見つけましょう。
良いファジングライフを

GitHubで編集を提案

Discussion