
Samsung Galaxy S21 を対象とした CVE-2026-43499 のエクスプロイトチェーン研究
このデバイス向けの、動作するアクティブな KernelSU プロジェクト: kurtulusakyuz/dfroot-s21 — まずはそちらから始めてください。このリポジトリは IonStack のリサーチのみを保持しています。
ファームウェア G991BXXSJHZC2 上の Samsung Galaxy S21 (o1s) 向けの
デバイス固有 IonStack ペイロード。ステータス: リサーチ CLOSED —
決定論的な DoS のみ; カーネル書き込みパスはこのビルドでは不可能であることが
証明済み。完全な証拠は RESEARCH.md に記載。
| 項目 | 値 |
|---|---|
| モデル | SM-G991B |
| デバイス | o1s |
| ファームウェア | G991BXXSJHZC2 |
| Android | 15 / API 35 (AP3A.240905.015.A2, fingerprint samsung/o1sxeea/o1s) |
| ページサイズ | 4096 |
| カーネル | 5.4.242-30958140-abG991BXXSJHZC2 |
| SoC | Exynos 2100 |
| 緩和策 | CFI+PAC+PAN/UAO, KDP_CRED, SELinux enforcing, userfaultfd なし |
NebuSec/CyberMeowfia で公開された IonStack CVE-2026-43499 実装
(upstream b850d3bddc74c3328d5fbcc0568d21962b55d949) および
BuSung-dev/CVE-2026-43499-S25U に基づき、F-19-F/IonStackQuest3 に感謝します。
上流の Apache License 2.0 は LICENSE に保持されています (NOTICE 参照)。
このデバイス向けの GhostLock 書き込みプログラムは完了かつクローズ済みであり、 一時停止ではありません。証明された内容を順に示します:
remove_waiter() は
waiter->task->pi_blocked_on ではなく current->pi_blocked_on をクリアするため、
FUTEX_CMP_REQUEUE_PI のロールバックがスタック上の rt_waiter への
ダングリングポインタを残します。上流の修正 3bfdc63 は 5.4.242 には存在しません。sched_setattr を加えると、デバイスと同一の Oops
(rt_mutex_adjust_prio_chain+0x108 → _raw_spin_trylock+0x1c,
fault VA 0) が、KDP なしの QEMU ゲストと実機の両方で再現します
(lastkmsg 118/119)。ダングリングスロットは完全にマップされており
(スタックトップ E-0x328、ライフサイクルは QEMU+GDB で特性評価済み)。lock (+0x38) は決して
攻撃者に制御されないことを示している (15/15 ダンプ)。独立した移植
(ASUS i005, AQUOS sigreturn ルート) も同じ壁に突き当たった。確率ではなく、
ジオメトリの問題である。関連する 2026 年のカーネル LPE の道も、このビルドではファームウェア設定に
よって閉ざされている (USER_NS, RDS, CRYPTO_USER_API_AEAD はすべて未設定;
MFC_USE_DMABUF_CONTAINER=n で MFC ダブルフリーは到達不能;
AF_ALG/eBPF はシェルに対してゲートされている)。書き込み後の成果物
(この正確なファームウェア向けにビルドされた KernelSU .ko + ksud) は
別途ステージングされている; このツリー内の src/kernelsnitch/ ヘッダは
ステージングされたまま未ビルドである (書き込みなしではコンシューマが存在しない)。
Makefile build (NDK r27+, ANDROID_NDK_HOME)
src/ exploit source (o1s profile only)
src/targets/o1s-G991BXXSJHZC2/ target.h + p0_fingerprint.h
src/kernelsnitch/ mm_struct leak (futex hash collision, staged)
tools/ p0 fingerprint helper
RESEARCH.md research notes (geometry, verdicts)
export ANDROID_NDK_HOME=/path/to/android-ndk
make clean all
# SLIDE_WRITER_SEL=1|2|3 selects mcast/sigreturn(default)/xattr writers.
# Unset selects the experimental pselect writer (see RESEARCH.md).
出力 (build/o1s-G991BXXSJHZC2/):
cve-2026-43499 (LD_PRELOAD ペイロード), cve-2026-43499-app.so (アプリペイロード),
cve-2026-43499-root (root ヘルパー)。
adb push build/o1s-G991BXXSJHZC2/cve-2026-43499 /data/local/tmp/cve-2026-43499
adb push build/o1s-G991BXXSJHZC2/cve-2026-43499-root /data/local/tmp/cve-2026-43499-root
adb shell chmod 755 /data/local/tmp/cve-2026-43499 /data/local/tmp/cve-2026-43499-root
adb shell "LD_PRELOAD=/data/local/tmp/cve-2026-43499 sh"
# on success:
adb shell "/data/local/tmp/cve-2026-43499-root -c 'id; getenforce'"
期待値の管理: このビルドでは「成功」とはトリガー walk とそのオラクル出力を 意味する — NULL-lock walk は root を返す代わりにデバイスを再起動させる (上記「最終状態」参照)。仮に将来の書き込みプリミティブによって root が 達成されたとしても、それは再起動までしか持続しない; 何もフラッシュされない。
/data/local/tmp は
再起動時に消去される — 起動のたびにバイナリを再プッシュすること。