fuzzilliでV8をファジングする
fuzzilli
皆さんは fuzzilli というツールをご存知でしょうか?
これは JavaScript エンジンのファジングに特化したファザーです。
今回はこちらのツールを使用して Chrome や NodeJS で使用されている V8 をファジングしていこうと思います。
参考にした記事
と言っても今回は下記の記事を参考にしました。
準備
環境
環境は 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 の入力を変えてクラッシュを見つけましょう。
良いファジングライフを
Discussion