
BootStompはブートローダーのバグファインダーです。メモリ破損と状態ストレージの脆弱性という2種類のバグを検出します。詳細については、BootStompの論文(https://seclab.cs.ucsb.edu/academic/publishing/#bootstomp-security-bootloaders-mobile-devices-2017 )を参照してください。
BootStompの解析を実行するには、以下の手順をお読みください。BootStompはARMアーキテクチャ(32ビットおよび64ビットの両方)向けにコンパイルされたブートローダーで動作し、結果はangrやZ3のバージョンによって多少異なる場合があることに注意してください。これは、angrが基本ブロックを解析するのにかかる時間と、Z3の式の具体化結果に依存するためです。
$ pip install angr
BootStompを最も簡単に使用する方法は、Dockerコンテナ内で実行することです。
dockerフォルダには適切なDockerfileが含まれています。
使用するためのコマンドは以下の通りです。
cd docker
# Dockerイメージをビルド
docker build -t bootstomp .
# Dockerイメージを実行(永続的な変更や共有ファイルが必要な場合は適切なオプションを使用)
docker run -it bootstomp
# これでDockerコンテナ内に入ります
cd BootStomp
# サンプルの1つでBootStompの汚染解析を実行
# これには約30分かかります
python taint_analysis/bootloadertaint.py config/config.huawei
# 出力の最終行は次のようになります:
# INFO | 2017-10-14 01:54:10,617 | _CoreTaint | Results in /tmp/BootloaderTaint_fastboot.img_.out
# 結果を「プリティプリント」するには、次を使用:
python taint_analysis/result_pretty_print.py /tmp/BootloaderTaint_fastboot.img_.out
出力は次のようになります:
...
17)
===================== Start Info path =====================
Dereference address at: 0x5319cL
Reason: at location 0x5319cL a tainted variable is dereferenced and used as address.
...
Tainted Path
----------------
0x52f3cL -> 0x52f78L -> 0x52f8cL -> 0x52fb8L -> 0x52fc8L -> 0x52fecL -> 0x53000L -> 0x53014L -> 0x5301cL -> 0x53030L -> 0x53044L -> 0x53050L -> 0x5305cL -> 0x53068L
===================== End Info path =====================
# Total sinks related alerts: 5
# Total loop related alerts: 8
# Total dereference related alerts: 4
find_taint.pyを実行します。taint_source_sink.txtファイルに表示されます。ブートローダーバイナリ用のJSON設定ファイルを作成します(config/の例を参照)。設定項目は次の通りです:
実行:
python bootloadertaint.py 設定ファイルのパス
結果は/tmp/BootloaderTaint_[ブートローダー].outに保存されます。ここで[ブートローダー]は解析されたブートローダーの名前です。ループを含むパスは複数回表示される可能性があることに注意してください。
実行:
python unlock_checker.py 設定ファイルのパス
結果は/tmp/UnlockChecker_[ブートローダー].outに保存されます。ここで[ブートローダー]は解析されたブートローダーの名前です。ループを含むパスは複数回表示される可能性があることに注意してください。
BootStompの結果を確認するには、スクリプトresult_pretty_print.pyを次のように使用します:
python result_pretty_print.py 結果ファイル