概要
WebKitの特定のバージョンに存在する脆弱性の挙動を調べるために、該当するバージョンのWebKitGTK+のリリースtarballを拾ってきてAddressSanitizerを有効にしたビルドをUbuntu上で行ったときのメモです。
WebKitGTK+ 2.19.91以降のリリースではENABLE_ADDRESS_SANITIZER
フラグによって簡単にAsanビルドができるため、それより前のバージョンが本記事の対象です。
環境
- OS: Ubuntu 16.04(VMware 仮想マシン)
- メモリ: 4GB(ホスト: 8GB)
- ビルド対象: WebKitGTK+ 2.17.92
大まかな手順
- ビルドに必要な環境の準備
- AddressSanitizerを有効にする設定
- ビルド
手順
下準備
- アップデートでエラーが発生する場合は対処
- 必要に応じてビルド高速化の設定を行う
プログラム準備
WebKitGTK+のリリースtarballを取得・展開
wget https://webkitgtk.org/releases/webkitgtk-2.17.92.tar.xz
tar -xf webkitgtk-2.17.92.tar.xz
依存するプログラムをインストール
cd webkitgtk-2.17.92
./Tools/gtk/install-dependencies
cmakeして足りないプログラムをチェック
cmake -DPORT=GTK -DCMAKE_BUILD_TYPE=Debug -GNinja
追加で使用するプログラムをインストール
sudo apt install clang llvm-dev ruby-dev -y
パッケージでは必要なバージョンがインストールできないプログラムを取得・ビルド
今回はLibgcrypt
およびそのビルドに必要なLibgpg-error
をインストールした
wget https://gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-1.28.tar.bz2
tar -xf libgpg-error-1.28.tar.bz2
cd libgpg-error-1.28/ && ./configure && sudo make && sudo make install && cd
wget https://gnupg.org/ftp/gcrypt/libgcrypt/libgcrypt-1.8.2.tar.bz2
tar -xf libgcrypt-1.8.2.tar.bz2
cd libgcrypt-1.8.2/ && ./configure && sudo make && sudo make install && cd
AddressSanitizer有効化
- cmakeファイルを編集してAddressSanitizerをリンクさせる
-
webkitgtk-2.17.92/Source/WebKit/PlatformGTK.cmake
内のLDFLAGS
指定部分に-fsanitize=address ASAN_OPTIONS=detect_leaks=0
を追記する - LeakSanitizerが有効だとビルド中にリークが検出されて停止してしまうためオフにしている
-
ビルド
- コンパイラオプションでAddressSanitizerを有効化する。また、実験に使うMINIBROWSERのビルドをオンにする
cmake -DPORT=GTK -DCMAKE_BUILD_TYPE=Debug -DENABLE_MINIBROWSER=ON -DUSE_SYSTEM_MALLOC=ON -DCMAKE_CXX_FLAGS="-g -fsanitize=address -fno-omit-frame-pointer" -GNinja
sudo ninja
sudo ninja install
- SYSTEM_MALLOCについてはよくわかってない
MINIBROWSER実行時の設定
- LeakSanitizerを抑制する
export ASAN_OPTIONS=detect_leaks=0
- スタックトレースをシンボル化する
-
llvm-symbolizer
のパスを通せばよい
-
export ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-3.8/bin/llvm-symbolizer
- MINIBROWSER実行
/usr/local/libexec/webkit2gtk-4.0/MiniBrowser
- 調査したい脆弱性を踏んでエラーが無事検出されたらOK