
Google Pixel 8 から Google Pixel 7 への CVE-2023-6241 の適応(securitylab/SecurityExploits/Android/Mali/CVE_2023_6241 より)
このリポジトリでは、securitylab が GitHub リポジトリ で公開した、Google Pixel 8 用のエクスプロイトを Google Pixel 7 に適合させる方法を説明します。
エクスプロイトの修正を開始する前に、元のエクスプロイトが必要なパッチを適用すれば Google Pixel 7 デバイスでも動作するという仮定を、CVE-2023-6241 に関連する 記事 に基づいて立てました。これは、2つのデバイスが(ハードウェア的に)異なっているように見えるため必要でした(比較)。
以下は、分析と情報・ファイルの抽出に使用したツールです。
以下は、最初から目標を達成するまでの手順です。
デバイスの開発者オプションを有効にします。
適切なセキュリティパッチ(この場合は、UP1A.231105.003, Nov 2023 から UQ1A.240205.002, Feb 2024 までの両方を含む)でデバイスをフラッシュします。可能であれば、Google Chrome と Android フラッシュツール を使用し、Factory Images for Nexus and Pixel Devices ページの該当エントリの "Flash" をクリックします。
注1: Android フラッシュツールを使用してデバイスをフラッシュすると、ブートローダーのバージョンに関連する問題を解決できる場合があります。これらの問題は、Factory Images for Nexus and Pixel Devices ページの "Link" をクリックしてダウンロードした圧縮ファイルに付属するスクリプトを使用したフラッシュ操作中に発生する可能性があります。
注2: デバイスをフラッシュする前に、Android フラッシュツールで "Force Flash all partition" をチェックして、スクリプトと同じ結果を得てください。
「Link」をクリックして目的の Android イメージをダウンロードし、メインの圧縮ファイル「panther-<release>-factory-<SHA-256の最初の8文字>.zip」内にある圧縮ファイル「image-panther.zip」から boot.img ファイルを抽出します。
./imjtool.ELF64 boot.img extract を実行します。新しいフォルダ「extracted」が作成され、中に2つのファイルが含まれます。 
vmlinux-to-elf ./extracted/kernel.decompressed <filename>.elf を実行します(以降、<filename>.elf は Pixel7-kernel.elf とします)。指定された名前の新しいファイルが作成されます。 
Ghidra で "Pixel7-kernel.elf" を開きます。自動解析は時間がかかるため実行する必要はなく、情報は依然として抽出可能です。
「シンボルテーブル」ウィンドウを開き、対象のフィールド(この場合は avc_den|sel_read_enforce$|init_cred|^commit_creds$)を検索します。結果は次のようになります。 
場所のアドレスに移動し、検索したすべてのフィールドの「イメージベースオフセット」を取得します。 
見つかった内容に従って、エクスプロイト内のすべてのオフセットを設定します。

Online Assembler and Disassembler を使用して、それぞれ add x8, x8, #0xXXX と add x0, x0, #0xYYY の操作の HEX 値を見つけることにより、ADD_COMMIT_2311 と ADD_INIT_2311 の値を計算します。 XXX と YYY の値を見つけるには、COMMIT_CREDS_2311 と ADD_INIT_2311 からそれぞれ下位12ビットをコピーすれば十分です(例: ADD_COMMIT_2311 が 0x17f0c8 の場合、add x8, x8, #0x0c8 の HEX コードは 0x91032108 になります)。
注: 値はビッグエンディアンで表現されるため、結果のバイトを反転する必要があります。
GLES_mali.so を /vendor/lib64/egl/libGLES_mali.so からコピーし(つまり adb pull /vendor/lib64/egl/libGLES_mali.so)、すべてを /home/gobbo/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android34-clang -g -DSHELL -DCL_TARGET_OPENCL_VERSION=300 -I. -L. mali_jit_csf.c mem_read_write.c mempool_utils.c -lGLES_mali -o mali_jit_csf でコンパイルします。
注: タイミングを一致させるために、エクスプロイトで使用された OpenCL ライブラリのバージョンは、脆弱性を修正したセキュリティパッチの前に利用可能な最新のもの(つまり バージョン 2023.04.17)でした。
エクスプロイトをアップロードして実行します
adb push ./mali_jit_csf /data/local/tmp
export LD_LIBRARY_PATH=/vendor/lib64/egl
./data/local/tmp/mali_jit_csf
詳細については、冒頭で述べた GitHub の記事と GitHub リポジトリを参照してください。