
SM-F9360 (Galaxy Z Fold4, q4q) 잠긴 부트로더 KernelSU root — CVE-2026-43499 임시 root → LD_PRELOAD DEFEX 우회 → 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 잠금 상태의 삼성 기기에서 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)는 바로 locked 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 도메인의 새 ELF execve를 차단 (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됨.
이것이 본 프로젝트의 가장 핵심적인 재현 가능 레시피. 먼저 원리를 설명하고, 그다음 명령을 제시.