
CVE-2021-28664(Mali kbase GPUドライバのuse-after-free)のPoCスケルトン。ARM64 Android上でカーネルの任意物理メモリ読み書きプリミティブを実証する。
Mali kbase GPU ドライバの UAF(CVE-2021-28664)→ カーネル任意物理メモリ 読み書きプリミティブ の PoC スケルトン。汎用 ARM64 Android プラットフォーム向けであり、特定のベンダーや機種に依存しない。
研究範囲は 「カーネル任意物理メモリ読み書きプリミティブ」までに限定:GPU ドライバの use-after-free を、安定・制御可能・安全に失敗できるカーネルメモリ読み書き能力へと 変換する方法。
本リポジトリはいかなる攻撃も提供しない。 完成した exploit を含まず、そのまま実行可能なコードを含まず、 いかなるデバイスのオフセット/シリアル番号/ファームウェアも含まない。いかなる内容も攻撃行為への利用を禁ずる(下記参照)。
| 段階 | 前提条件 |
|---|---|
| 脆弱性本体 | Mali kbase ドライバのバージョンが CVE-2021-28664 の影響範囲(上流修正前の r シリーズ)に該当する。カーネルバージョンとは無関係で、ドライバのみに依存 |
| GPU リソース | /dev/mali が対象プロセスから到達可能。MEM_ALLOC が SAME_VA の大バッファをサポート。MEM_ALIAS の挙動が脆弱性の記述に合致 |
| パイプ再利用 | Linux ≥ 4.5(pipe_buf_operations 導入)、実測では 4.9 ~ 4.14 でいずれも成立。F_SETPIPE_SZ によりパイプを単一ページまで縮小可能 |
| KASLR リーク | カーネルで CONFIG_RANDOMIZE_BASE が有効(arm64 ≥ 4.6)。anon_pipe_buf_ops が公開シンボルテーブルに存在 |
| 物理アドレスモデル | arm64 + vmemmap レイアウト。sizeof(struct page)、ページテーブル形式は 必ず実測 すること。仮定してはならない |
pipe_buffer 構造/copy_page_to_iter の検証が大きく異なる新しいカーネル(5.x 以降
は対応するソースで再確認が必要。チェーン構造は参考になるが詳細は汎用ではない);/dev/mali へのアクセス権限がない環境(seLinux/ベンダーポリシーによる制限)。TODO(DEVICE) として空欄にされており、適配は使用者自身の
リバースエンジニアリング作業であり、リポジトリは代行しない。CVE-2021-28664:Mali kbase ドライバの MEM_ALIAS パスは GPU_WR 権限の
チェックを欠いており、攻撃者は すでに解放された GPU メモリページ を自身の GPU アドレス空間に
alias することができ、「GPU 側から解放済み物理ページへの持続的な可視/書込可能」状態を形成する——GPU/カーネル境界を
またぐ use-after-free である。
利用価値は GPU メモリそのものではなく、以下にある:
WRITE_VALUE job を利用し、alias で可視のページに対してピンポイント改変を行う。victim GPU バッファ + MMU ページテーブル dump → 物理アドレスマップの構築
→ trigger バッファ解放で圧力を生成 → pipe をスプレー(F_SETPIPE_SZ で縮小)
→ pipe_buffer 配列が解放領域に着地(クロスキャッシュ UAF 再利用)
→ alias ビューで ops ポインタをスキャン → anon_pipe_buf_ops をリーク → KASLR slide
→ GPU で pipe_buffer の page / offset / len を改変
→ 正規の pipe read/write パスを利用
⇒ 任意物理ページ読み(偽装 page ポインタ)
⇒ 任意物理ページ書き(pipe merge 書き込みパス)
⇒ 既知内容ページを自己検証 oracle として使用し、読み書きが空洞/未マップ領域に落ちないことを保証
ここまで。
page_to_virt 実装差異、
no-map 予約領域は線形マッピングにそもそも存在しない(読むと panic)。docs/
01-exploit-chain.md UAF から読み書きプリミティブまで:各段階の原理と実装要点
02-physical-address-model.md 物理アドレスモデル、セーフティゲート、m 曖昧性、既知の落とし穴
exploit/
cve-2021-28664-poc.c 読み書きプリミティブの完全なフロー骨格(デバイス値なし)
scripts/
README.md 実験自動化ツールの設計説明(ループ/検証/復元)
exploit/cve-2021-28664-poc.c は 読み書きプリミティブの PoC 骨格テンプレート である:
TODO(DEVICE) で注記され、そのまま使用可能な数値は 一切ない;これはチェーン全体がどのように構成されるかを理解するためのものであり、いかなるデバイスに対しても有効なツールとして直接コンパイルできるものではない。
fs/pipe.c / include/linux/pipe_fs_i.h(公開ソース)Documentation/arch/arm64/memory.rst(公開ドキュメント)exploit/):GPL-3.0、LICENSE を参照docs/、scripts/):CC BY-NC-SA 4.0、LICENSE-DOCS を参照
(商用禁止;派生コンテンツは同一条件で共有し、本声明を保持すること)