
Android 8-9 向けのゼロクリック Bluetooth RCE エクスプロイト (CVE-2020-0022)。ヒープスプレー、アドレス漏洩、および JOP チェーン実行により、BlueFrag 脆弱性を介したリモートコード実行を実現します。
Insinuator の素晴らしいブログ記事とコードに感謝します。
insinuator の投稿に記載されたすべての手順とそれ以上のことが完了しました。これらは多くの手順であり、README.md ファイルにすべてを記載するのは大変なので、上記の Insinuator の投稿 を参照してください。
エクスプロイトは以下の点まで完全に完了しています:
このエクスプロイトは以下の点で Insinuator の実装と異なります:
libicuuc.so ではなく libandroid_runtime.so のアドレスを漏洩するexecv を呼び出し、もう1つは fork を呼び出してから execv を呼び出すlibandroid_runtime.so ファイルを処理し、関数とガジェットのオフセットを抽出する カスタム Ghidra スクリプト が付属している(他のターゲットへのエクスプロイト移植を容易にするため)これはエクスプロイトが PC をカスタムアドレスに変更する様子を示すビデオデモです:

チェーンの最初のイテレーションは jop_experiment で確認できます。このチェーンは fork を呼び出さずに直接 execv を呼び出します。コミット ca28fdf にあります。このチェーンを使用すると次のようになります:

チェーンの2番目のイテレーションは fork を呼び出してから execv を呼び出します。このチェーンの詳細は こちら にあります。このチェーンを使用すると次のようになります:

幸いなことに、Pixel 3 XL には Bluetooth プロセスが fork や execv を呼び出すのを防ぐ保護機能があります。知識共有や見せびらかしという点では、ここでの私の作業は完了です。もしさらに高度なものを書いて共有するなら、ブラックハットにとってあまりにも有用になる可能性があります。
このエクスプロイトは完成したと考えています。将来の改善点としては:
dlsym を呼び出してから mprotect を呼び出す JOP チェーンの作成これらすべてのことは、このプロジェクトを楽しい知識共有プロジェクトから、武器化可能なブラックハットエクスプロイトに変えてしまうため、今のところここで私の旅は終わりです。質問があれば、お気軽にご連絡ください。
エクスプロイトを実行するには、単に以下を実行します:
make build run ARGS="00:00:00:00:00:00"
ここで 00:00:00:00:00:00 はターゲット/被害者デバイスの MAC アドレスです。make clean 以外のビルドターゲットは、エクスプロイトを変更、改善、再実装しようとする場合にのみ役立つため、詳細に言及する必要はありません。
gdbserver バイナリは NDK フォルダにあります# On target
/data/local/tmp/gdbserver 0.0.0.0:1234 --attach $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# On host
adb forward tcp:1234 tcp:1234
gdb-multiarch -q -x ./gdbinit
# On host
adb push ./gdbinit /data/local/tmp/gdbinit
# On target
su
/data/data/com.termux/files/usr/bin/gdb -q -x /data/local/tmp/gdbinit -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# OR
/data/data/com.termux/files/usr/bin/gdb -q -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
動作しなくなった場合に備えて、攻撃側マシンで Bluetooth サービスを再起動できます:
sudo systemctl restart bluetooth.service
このセクションでは、このエクスプロイトの開発中に観察された現象のいくつかを説明します:

get_message_loop を通じて使用される base::MessageLoop オブジェクトの vtable を変更する意図しないオーバーフローによりターゲットがクラッシュする可能性を減らすために、ヒープクリーナーパケットをスプレーしています:
partial_packets の unordered_map 内の各アイテムに1つのリンクリストアイテムが含まれる32バイトの malloc チャンクをターゲットにすることで、パケットのアドレスを漏洩しています。これは map_experiment を使用して解明されました

