
CVE-2026-43074 を利用して Android 上の SELinux を無効化する (Linux 6.6/6.12)
CVE-2026-43074 eventpoll UAF エクスプロイトから、SELinux 無効化ステージを単体抽出したものです。eventpoll のループ深度チェック(ep_get_upwards_depth_proc)を競合させ、selinux_state.enforcing にゼロを書き込むことで、シングルバイトのカーネル書き込みによりデバイスを Permissive に切り替えます。これは MAC 無効化プリミティブのみであり、権限昇格は含みません。
[!WARNING] カーネルエクスプロイトの概念実証です。カーネルのクラッシュ、データ破損、デバイスの不整合を引き起こす可能性があります。所有しているデバイス、またはテストを許可されたデバイスでのみ実行してください。事前にバックアップを取ってください。
NebuSec の完全な PoC(source tree)からトリミングしたものです。UAF は eventpoll のループ深度チェック(ep_get_upwards_depth_proc)にあり、RCU 保護下で epi->ep を走査している間に、並行スレッドから ep_free() が struct eventpoll を解放できることに起因します。上流では、解放を RCU グレース期間まで遅延させることで修正されました(commit 07712db8; NVD, OSV)。
これは "Bad Epoll"(CVE-2026-46242)とは異なります。Bad Epoll は同じ eventpoll コード内の ep_remove() における別の use-after-free です。ここでの競合は、07712db8 で修正されたループ深度チェックのライフタイムバグに特化したものです。
kernel.org CNA(OSV/NVD 経由)によると、影響を受ける安定版ストリームとその修正バージョン:
6.4.0 – <6.6.136(6.6.136 で修正)6.7.0 – <6.12.83(6.12.83 で修正)6.13.0 – <6.18.24(6.18.24 で修正)6.19.0 – <6.19.14(6.19.14 で修正)対象として固定したカーネル 6.6.118-android15-8 は、影響を受ける 6.6 系の範囲内です(修正は 6.6.136)。上流のバージョンを上げずに修正をバックポートしたベンダーカーネルは影響を受けません。uname -r だけに頼らず、実際にパッチが適用されているか確認してください。
特定のビルドに固定されています。enforcing バイトへはハードコードされた KVA エイリアス経由で到達し、競合はそのカーネルの slab レイアウトに依存します:
6.6.118-android15-8-g53e6e091166e-ab15266607-4kgoogle/blazer/blazer:17/CP2A.260705.006/15641320:user/release-keysTARGET_SELINUX_ENFORCING_ALIAS = 0xffffff800236a2e0別のビルドをターゲットにするには、src/target.h 内でエイリアス(selinux_state のイメージオフセット + マッピングベース + ロードアドレス)を再計算する必要があります。
aarch64 clang ツールチェーンを含む Android NDK が必要です。デフォルトは NDK_ROOT=/opt/android-ndk、API=35 です:
make # → build/disabler
必要に応じて上書き:
make API=35 NDK_ROOT=/path/to/android-ndk
build/disabler をデバイスにプッシュし、shell ユーザー(uid 2000)として実行してください。開始時点で SELinux が Enforcing である必要があります。そうでない場合、バイナリは処理をスキップします。成功すると:
SELINUX_AFTER Permissive
RESULT PASS selinux_zero attempt=N
getenforce で確認: Permissive になるはずです。
元のエクスプロイトは、このプリミティブに加えて、パイプバッファの flags リダイレクト(読み取り専用のページキャッシュページへの DirtyPipe 方式の書き込み)を使って /system/bin/dumpstate を書き換え、root デーモンを起動します。それらのステージ(pipe.c、patch.c、su.c、payloads.S、および元の main.c によるオーケストレーション)はここでは省かれ、late_refs.c はゼロバイトリダイレクトの経路のみに縮小されています。SELinux を無効化するだけでは root は取得できません。MAC による強制がなくなり、ペイロード本体が非制限(unconfined)で実行できるようになるだけです。