SELinux-Permissive-Only-version-of-Cheese-aka-CVE-2025-21479
これは、現時点では SELinux permissive のみに対応した Cheese エクスプロイトのバージョンです。別名 CVE-2025-21479 としても知られ、Samsung Snapdragon デバイスを含む多くのデバイスの adreno kgsl に影響を与えました。
以下のリポジトリから一部のコードを再利用しています。PoC を最初に立ち上げてくれた zhuowei 氏と、維持管理が行き届いた活発なリポジトリを公開してくれている sarabpal-dev 氏に感謝します。
https://github.com/zhuowei/cheese
https://github.com/sarabpal-dev/cheese-cake
このプロジェクトは、ある種の挑戦として始めました。これほど複雑なものに取り組んだことがなかったので、まだ完成してはいませんが、良い学習経験になりました。元々やりたかったのは、完全に信頼できないドメインから、termux 環境内で直接チェーン全体を実行できるかどうかを試すことでした。現時点では、adb を使わずに SELinux permissive を達成でき、コードを元の約4分の1に縮小しました。安定しており、通常は開始から完了まで1分もかかりません。また、ブートローダーがロックされた Samsung SM-S901W S22 Snapdragon で動作しています。まだ root プリミティブには踏み込んでおらず、adb なしでそれができるかどうかは分かりませんが、それでも挑戦し続けるつもりです。このプロジェクトが、通常はできないと言われていることに挑戦する人々のきっかけになればと思います。誰かが有効なアイデアを持っているかもしれません。役に立つ貢献があれば、いつでも issue を開いてください。
チュートリアル
このエクスプロイトは非常に簡単で、お使いのデバイスで動作させるためにコードを編集する必要はほぼありません。必要なのは以下の通りです:
- リポジトリを git clone して cd する
- あなたの 正確な ファームウェアから boot.img を取得する
- unpack_bootimg (termux に既に含まれています) を使ってカーネルを抽出する
- extract-kallsyms.c バイナリをコンパイルして、カーネル上で実行する
- kallsyms.txt を、エクスプロイトを実行するパスに直接置く
cc -o gpu_sam gpu_sam.c -ldl でコンパイルする
- 実行中に kallsyms.txt を動的に参照して、必要なすべてのオフセットを探します
- デバイスに応じて変更する必要があるのは、カーネルベーススキャンの以下の値だけです:
const uint64_t candidates[] = { 0xC0000000, 0xE0000000 }; と for (uint64_t addr = 0xa8000000; addr < 0xa8500000; addr += 0x8000) {
- うまくいけば、通常の termux シェルから安定した SELinux permissive を取得できます
注意事項
SMMU フォルトやカーネルパニックのリスクは常にありますが、カーネル 5.10.168 を搭載した私の端末では非常にうまく動作し、クラッシュすることはほとんどありません。数回実行する必要があるかもしれませんし、GPU の状態をリセットするために再起動が必要な場合もあります。できる限り使いやすく作りました。以下の動画は簡単なデモです。すでに permissive 状態でした。お楽しみください
https://github.com/user-attachments/assets/63d0dfa7-1390-41ce-96da-9c34d8a220ec