
SM-F9360 (Galaxy Z Fold4、q4q) ロック済みブートローダー KernelSU root — CVE-2026-43499 一時root → LD_PRELOAD DEFEX バイパス → no-LTO clang-12 kernelsu.ko。2026-08-12 デバイス検証済み。
CVE-2026-43499 一時 root → LD_PRELOAD チャネルで DEFEX をバイパス → LTO なし clang-12 版 kernelsu.ko → su + KernelSU Manager 全機能
ステータス:✅ 2026-08-12 実機検証達成(ファームウェア
F9360ZCSAIZF1、カーネル5.10.236-android12-9-2755199-abF9360ZCSAIZF1)本プロジェクトは Bootloader ロック された Samsung デバイスで KernelSU root を達成する完全な再現可能手順を記録する:BL アンロック不要、boot.img 書き込み不要、Odin 不要。
TL;DR (English): This repo documents a fully device-verified jailbreak path for a locked-bootloader Samsung Galaxy Z Fold4 (SM-F9360, SM8450, kernel 5.10.236, firmware F9360ZCSAIZF1): a CVE-2026-43499 (rtmutex UAF, fixed in July-2026 firmware) exploit chain grants temporary kernel-domain root; a custom LD_PRELOAD constructor .so bypasses Samsung's DEFEX execve interceptor to init_module() a KernelSU LKM built with the exact device toolchain (AOSP clang 12.0.5 r416183b) and with LTO disabled — the two factors that make the module loadable and its init executable on this CFI/LTO hardened kernel. Result: su works (uid=0, context=u:r:ksu:s0) and KernelSU Manager v3.2.5 recognizes the kernel. Root is in-memory only: every reboot requires re-running the exploit (~3 min, scripted). All pitfalls and dead ends (fake exports, CRC patching, ksud late-load, LTO function-sections layout) are documented below.
| 項目 | 状態 |
|---|---|
一時 root(カーネルドメイン kernel:s0) | ✅ 安定達成(連続 9 回成功) |
KernelSU モジュールロード(init_module) | ✅ kernelsu ... Live (O) |
| KSU init 完全実行 | ✅ 15 個の埋め込み mark すべてグリーン |
su コマンド | ✅ uid=0(root) gid=0(root) context=u:r:ksu:s0 |
| KernelSU Manager v3.2.5 | ✅ カーネルバージョン認識(supercall 検出通過)、SELinux 強制モードで動作 |
| Bootloader アンロック | ❌ 不要 |
| 書き込み/パーティション変更 | ❌ 不要 |
本質的な制限:BL ロック → root は純粋なメモリ状態。 再起動のたびに exploit の再実行 + モジュールの再ロードが必要(全工程約 3 分、スクリプト化済み)。ksud ユーザー空間 daemon はデプロイ不可(DEFEX が execve を遮断、§10-4 参照)だが、su / supercall / Manager はいずれもカーネル sucompat が直接処理し、ksud に依存しない。
警告:rmmod kernelsu はデバイスを即座に panic 再起動させる(RKP が保護メモリ上の syscall-table 復元パスを保護)——絶対にアンロードしないこと。
fastboot oem unlock は存在しない。永続化 root(magisk/kernel patch)はすべて boot.img の書き込みが必要だが、locked BL はあらゆる自署名イメージを拒否する。CONFIG_CFI_CLANG=y + Full LTO。mod->init の唯一の供給源は CFI jump-table スロット __cfi_jt_init_module。間接呼び出しは .cfi_jt テーブルエントリを経由しなければならず、そうでなければ CFI チェックで即 panic。__ksymtab エクスポートテーブルから削除され、通常の insmod では解決不能(Unknown symbol)。IGNORE_MODVERSIONS/IGNORE_VERMAGIC フラグはすべて try_to_force_load() の死路に至る。sarabpal-dev/IonStack-S22U(b0q / S22U、exp32 ルート)。LD_PRELOAD constructor .so が root ドメインで任意コードを実行する唯一の免除チャネル。ksud late-load)はまさに BL ロックデバイス向けに設計されている:boot を書き込まず、実行時に直接 init_module。┌─ Layer 1: CVE-2026-43499 一時 root
│ ionstack-q4q exploit(KASLR リーク → mm reclaim → exp32 32-bit スタック stamp
│ → CFI r/w → pipe physrw → UMH root daemon)
│ → /data/local/tmp/cve-2026-43499-root -c '<cmd>' = kernel:s0 ドメインの root コマンドチャネル
│
├─ Layer 2: LD_PRELOAD .so ロードチャネル(DEFEX バイパス)
│ DEFEX は kernel ドメインの execve による新規 ELF を遮断(Killed);LD_PRELOAD の constructor
│ 実行は免除 → ksu-load.so が /system/bin/true プロセス内で:
│ ko を読み込み → /proc/kallsyms で 201 個の UND シンボルを手動再配置(SHN_ABS + st_value=絶対アドレス)
│ → vermagic patch(旧版で必要)→ init_module() → 成功
│
└─ Layer 3: KernelSU カーネルモジュール(LTO なし clang-12 版)
init 完全実行で 15 mark すべてグリーン → sucompat (allow_shell=1) + supercall 利用可能
| 項目 | 値 |
|---|---|
| 型番 | SM-F9360(Galaxy Z Fold4、q4q) |
| SoC | SM8450(Snapdragon 8+ Gen 1) |
| ファームウェア | F9360ZCSAIZF1(≤ 2026-06 ビルド、CVE 含有) |
| カーネル | 5.10.236-android12-9-2755199-abF9360ZCSAIZF1 |
| デバイスコンパイラ | AOSP clang 12.0.5 (r416183b, c935d99d7cf)(/proc/version で確認) |
| 正確な vermagic | 5.10.236-android12-9-2755199-abF9360ZCSAIZF1 SMP preempt mod_unload modversions aarch64 |
異なるファームウェア = 異なる kallsyms / レイアウト / vermagic であり、target.h の再適応と再ビルドが必要。§11 参照。
clang-14/15 + focal リポジトリの clang-12 / lld-12(/usr/bin/clang-12、/usr/bin/ld.lld-12)CC=clang HOSTCC=clang LD=ld.lld-12FryUpDoe/android_kernel_samsung_q4q(opensource.samsung.com は Cloudflare のアンチクロールあり)exploit は sarabpal-dev/IonStack-S22U(SM8450 5.10 実機 GREEN 基盤、exp32 ルート)をベースとする。q4q 適応 = リポジトリ内 patches/ionstack-q4q-adapt.patch(249 行、target.h パラメータ、kernelsnitch、root.c などをカバー)。
export ANDROID_NDK_HOME=$HOME/Projects/f9360-root/tools/android-ndk-r29
cd work/ionstack-q4q # IonStack-S22U clone + 本 patch
make PROJECT=q4q-F9360ZCSAIZF1 # 注意変数名は PROJECT= であり TARGET= ではない
q4q の重要パラメータ(調整済み、変更禁止):
| パラメータ | 値 | 理由 |
|---|---|---|
P0_KERNEL_PHYS_LOAD | 0xa8000000 | b0q/S22U 実機値(SM8450 全系の約束事。0x80080000 は誤アライメントの偽陽性) |
APP_KERNEL_PAGE_KSNITCH_IDENTITY_END | 0xffffff8b00000000(44GB) | デバイスメモリは phys 33.8–39.5GB に分散しており、2GB ウィンドウ(e2s からの流用)では永遠に見つからない |
KERNELSNITCH_FUTEX_HASH_SIZE | 2048 | カーネルの roundup_pow2(256*8)=2048。デフォルトの 4096 では mm leak が全失敗する |
KERNELSNITCH_MTE_ENABLED | 0 | 製品カーネルは kasan=off、MTE 未アクティブ |
EXP32_STAMP_OFF | 0x58 | 逆アセンブルから導出(b0q/q4q の futex_wait_requeue_pi と compat do_ipv6_setsockopt のフレームが一致) |
fork 32→16 組 / APPENDED_FUTEXES 4096→1024 | — | システム負荷を低減し LMKD SIGKILL を防止 |
KSU_LOAD_ONLY=1(root.c) | — | fake_exports をスキップ(ksu-load.so の手動再配置で代替) |
3 つのバイナリを生成(build/q4q-F9360ZCSAIZF1/):preload .so、app .so、root helper PIE。デバイス側の実測は低負荷で実行必須(loadavg < 2.5、起動後 1–2 分待つ)。高負荷時は exploit の fork ストーム(約 544 スレッド + 1024 futex park スレッド)が LMKD により無言で SIGKILL される。
これが本プロジェクトの最も核心的な再現可能レシピである。まず原理を述べ、次にコマンドを示す。