
このリポジトリは、Arm Mali r36p0 ドライバ系列に対する CVE-2022-46395 のポータブルトリガ条件を再現するための QEMU/no-Mali ラボです。
このラボはローカルでの脆弱性研究と回帰テストを目的としています。元のエクスプロイトに含まれていた Pixel 固有の権限昇格ペイロードは含まれていません。LAB_QEMU モードでは、ソフトイベント/ユーザバッファの競合ウィンドウに到達したことを示した後、PoC は停止します。
poc/: QEMU に適合させた CVE-2022-46395 PoC。Android のログ出力とプロパティ呼び出しを置き換え、LAB_QEMU 下では Pixel カーネルテキストパッチを無効化。src/google-gpu-raviole-android13/: android.googlesource.com/kernel/google-modules/gpu からの Google Pixel GPU モジュールソース、ブランチ android-gs-raviole-5.10-android13。含まれる mali_kbase/Kbuild によりドライバは r36p0-01eac0 と識別されます。scripts/: ビルド、initramfs パッケージ、QEMU 起動、ワンショット再現のヘルパースクリプト。docs/: ローカル分析ノートと再現レポート。logs/: ローカルでの成功実行からの選択された証拠ログ。生成されたバイナリ、initramfs アーカイブ、オブジェクトファイル、およびほとんどのランタイムログは Git で無視されます。以下のスクリプトを使用してローカルで再ビルドしてください。
スクリプトは以下の環境で使用されました:
bash、make、gcc、file、cpio、gzip、modinfo/bin/busybox にある busyboxqemu-system-x86_64デフォルトでは、スクリプトはカーネルツリーとブートイメージを以下の場所に期待します:
../build/linux-5.10-kasan
../build/linux-5.10-kasan/arch/x86/boot/bzImage
これらのパスは KDIR と KERNEL_IMAGE でオーバーライドできます。
リポジトリをクローンして移動します:
git clone https://github.com/Gao-Zuin/cve-2022-46395-qemu.git
cd cve-2022-46395-qemu
ビルド/パッケージ/起動の全フローを実行します:
MAX_ATTEMPTS=2000 ./scripts/reproduce.sh
KASAN カーネルがデフォルトの兄弟ディレクトリ ../build にない場合:
KDIR=/path/to/linux-5.10-kasan \
KERNEL_IMAGE=/path/to/linux-5.10-kasan/arch/x86/boot/bzImage \
MAX_ATTEMPTS=2000 \
./scripts/reproduce.sh
ローカルでの成功実行では以下のタイミングを使用しました:
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/reproduce.sh
より詳細な試行ログを取得するには:
MAX_ATTEMPTS=2000 VERBOSE_ATTEMPTS=1 UNMAP_OFFSET_NS=-800000 \
./scripts/reproduce.sh
ワンショットスクリプトは以下の手順と同等です:
./scripts/build_r36p0_no_mali.sh
./scripts/build_poc.sh
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/package_initramfs.sh
./scripts/run_qemu.sh
便利な環境変数:
KDIR: mali_kbase.ko のコンパイルに使用するカーネルビルドツリーKERNEL_IMAGE: QEMU に渡す bzImageQEMU_LOG: 出力ログのパスQEMU_MEM: QEMU メモリサイズ、デフォルト 1536MQEMU_SMP: QEMU CPU 数、デフォルト 3MAX_ATTEMPTS: PoC の再試行制限、デフォルト 2000UNMAP_OFFSET_NS: 競合タイミングオフセット、デフォルト -800000VERBOSE_ATTEMPTS=1: 試行ごとの詳細を出力KASAN_UAF_MODE=1: scripts/reproduce_kasan_uaf.sh で使用される KASAN UAF プローブオプションでモジュールをロード成功した実行では以下のような行が出力されます:
mali mali.0: Kernel DDK version r36p0-01eac0
r36p0-01eac0 (UK version 11.34)
/dev/mali0
finished reset: 703956220 fault: 682115150 68 err 0 read 3
qemu lab mode: CVE-2022-46395 soft-event/user-buffer race reproduced
qemu lab mode: reproduction completed after 17 attempts
[init] PoC status: 0
参考証拠ログ:
logs/qemu-cve-2022-46395-r36p0-unmap-minus800us.log
成功の鍵となる条件は err=0、read=3、fault < reset です。これは、no-Mali QEMU で r36p0-01eac0 に対する競合ウィンドウに到達したことを示します。
MAX_ATTEMPTS を増やすか UNMAP_OFFSET_NS を調整して再実行してください。