
CVE-2026-43499 を使用して Android 上の SELinux を無効化する
Write-1-only 抽出版
JoinChang/ghostlock-oneplus
(CVE-2026-43499 対象)。
ロックされたブートローダーを持つ、対応済み脆弱性のある OnePlus カーネル上で SELinux の enforcing を無効にし、それ以外は何もしません。cred の上書き、root シェル、KernelSU、bootstrap、KASLR リークは行いません。
CVE-2026-43499 は、futex PI requeue パスにおける Linux カーネルの rtmutex use-after-free です。プロキシロックのロールバック時に、remove_waiter() がウェイターのタスクではなく current に対して動作し、ウェイターの pi_blocked_on ポインタが宙ぶらりんになります。Linux 6.12.86 以降の 6.12 リリースで上流修正済みです。
単一の子ノード PI 書き込み:
fake_right = base + 0x100 -> byte0 = 0 (enforcing), byte1 = 1
完全版エクスプロイトのヒープスプレー + pselect PI ルートを再利用しますが、KASLR をバイパスします(kaslr_slide = 0)。最大 20 回再試行し(試行間にスラブドレインを実行)、/sys/fs/selinux/enforce が 0 を読み取ると終了します。
共有プリミティブ(util.c のヒープスプレー、fops.c の pselect ルート、kernelsnitch、オフセットテーブル)は保持されます。
src/devices/offsets.h を参照。uname -r で識別:
6.12.38-android16-5-...-ab14275539-4k6.12.38-android16-5-...-ab14552068-4k6.12.23-android16-5-...-ab14541642-4k(オフセットのみ、未確認)make # /opt/android-ndk(または $ANDROID_NDK_HOME)を使用
Android API 35 用の aarch64 PIE である selinux_disabler を生成します。
adb push selinux_disabler /data/local/tmp/a/e && chmod 755 /data/local/tmp/a/e
adb shell /data/local/tmp/a/e
確認:
adb shell cat /sys/fs/selinux/enforce # -> 0
必要なのは boot.img のみです。上流プロジェクトの tools ディレクトリ にある抽出ユーティリティを使用し、src/devices/<device>/offsets.h 以下にエントリを追加し、src/devices/offsets.h から #include してください。
承認されたセキュリティ研究および教育目的に限ります。
| 削除されたもの | 理由 |
|---|
slide.c | KASLR SLIDE リーク — 不要(slide = 0) |
pipe.c | パイプベースの物理 R/W — CFI/root ステージでのみ使用 |
root.c | cred パッチ / install_android_root — Write 2 のみ |
miniadb.c | bootstrap ミニ ADB クライアント — 未使用 |
try_cfi_stage, install_child_root, repair/refresh/leak/restore ヘルパー(fops.c) | CFI / KASLRリーク / pipe-physrw ステージ — カスタム書き込みパスでは到達しない |
perf_find_task, spawn_child, write_root_script, run_exploit, run_bootstrap(main.c) | Write 2(cred → init_cred)、root シェル、KSU、bootstrap |