
Ricerca di exploit del kernel che ottiene root temporaneo su Amazon Fire 7 (Fire OS 7.3.3.1) tramite la use-after-free JIT di Mali kbase CVE-2022-38181, con una catena di overwrite di modprobe_path.
Progetto assistito dall'IA. Questa ricerca, lo sviluppo dell'exploit e la documentazione sono stati prodotti con l'assistenza dell'IA utilizzando i modelli GLM-5.3 e DeepSeek V4.1 Flash.
Ricerca di exploit root per l'Amazon Fire 7 9ª gen (mustang, MT8163, Mali-T720) sull'ultimo firmware — Fire OS 7.3.3.1, PS7331.4463N, kernel 4.9.117 (compilato il 2025-05-03, SPL 2024-08-01).
Obiettivo: LineageOS. Il percorso del bootloader è morto su questa unità (bootrom patchata — solo preloader tramite cortocircuito CMD), quindi l'unica via rimasta è un exploit software del kernel.
nix-shell -p android-tools --run './run.sh' # add -p zig too if no zig
In caso di successo:```
/data/metrics/su id # run a command as root
/data/metrics/su # interactive root shell
Il reclaim riesce all'incirca 1 avvio su 3 e una perdita manda in panic/riavvia il tablet;
run.sh si limita ad attendere il riavvio e riprovare. SELinux viene forzato in Permissive come
parte dell'exploit, quindi root è solo a runtime — un riavvio ripristina lo stock e
si riesegue run.sh.
st3 e su precompilati (armv7 static) sono inclusi nel repository, quindi non serve alcun toolchain
per eseguire. ./run.sh --build li ricompila da poc/*.c se si dispone di zig.
GhostLock (sotto) è parcheggiato: la variante rtmutex BUG_ON di MTK + nessuna divulgazione di indirizzi kernel dalla shell = vicolo cieco architetturale su questa build (sessioni 2-4). La UAF del JIT di kbase è stata ridiagnosticata (il "panic incondizionato" del destroy-worker era il deref di JIT_FREE, log perso per la morte di adbd a metà panic) e lo stage 2 è ora dimostrato dall'oracolo — vedi la sezione SESSIONE 5.
UAF sullo stack futex-PI di remove_waiter() in rtmutex (divulgazione NebuSec 2026-07, fix 3bfdc63936dd
integrato 2026-04). Intervallo vulnerabile 2.6.39–7.1 → il nostro 4.9.117 (maggio 2025) è affetto.
Verificato sulla nostra build esatta:
CONFIG_FUTEX=y, rtmutex compilato, bug presente alla lettera:
rtmutex.c:1108-1111 usa current->pi_lock/current->pi_blocked_on (dovrebbe essere
waiter->task); sito di chiamata difettoso rtmutex.c:1723 (percorso d'errore di rt_mutex_start_proxy_lock)WAIT_REQUEUE_PI/CMP_REQUEUE_PI), nessun device node,
nulla controllato da SELinux — gli ostacoli fatali del percorso kbase qui non esistonosched_setattr → __sched_setscheduler → rt_mutex_adjust_pi(p) a
sched/core.c:4706 — dereferenzia pi_blocked_on obsoleto ✓futex.c:1975 passa this->rt_waiter,
dichiarato in futex_wait_requeue_pi a futex.c:2880) → il waiter marca il proprio frame liberato
tramite i fd_set di select (nr 142) su arm32DEBUG_RT_MUTEXES disattivato
→ rt_mutex_waiter compatto da 48 byte (tree_entry@0, pi_tree_entry@0xc, task@0x18,
lock@0x1c, prio@0x20, deadline@0x28)modprobe_path @ 0xc111488c (stringa auto-localizzata in
vmlinux; KALLSYMS_ALL disattivato quindi i simboli dati richiedono questo trucco) → exec di binfmt sconosciuto → script
root (setenforce 0, disabilita OTA, su)refs/: NebuSec/CyberMeowfia (originale), GhostLock-5.10 (port per Fire OS 8,
trigger ARM 32-bit completo in src/exp32/), ghostlock-...-4.19-k40 (port Android Qualcomm 4.19)exp32/main.crt_waiter rispetto all'area fd_set di do_sys_select — disassemblare
il nostro vmlinux (do_sys_select stack_fds vs frame di futex_wait_requeue_pi), esporre
STAMP_NFDS/STAMP_WAITER_OFF come parametriFailed critical init step 3/dev/mali0 world-RW + SELinux gpu_device, kbase r26p0-01rel0selroot a 2 pacchetti: azzera selinux_state.enforcing, riscrive
la fake entry in commit_creds(&init_cred). uid=0, SELinux Permissive.mustang, Fire OS 7.3.3.1 PS7331.4463N/00315758630404.9.117-g08fe75b-dirty, compilato Sat May 3 01:25:15 UTC 2025 (Linaro GCC 6.3-2017.05)/dev/kb, /dev/dkb (partizioni di kernel-backup Amazon) root:drmrpc 0660 — bloccatimali_kbase r26p0-01rel0 (Midgard, Mali-T720), all'interno dell'intervallo affetto NVD r4p0–r31p0mali_kbase_mem.c:2721 kbase_jit_destroy_worker libera la regione, non azzera mai kctx->jit_alloc[id]mali_kbase_softjobs.c:1270 kbase_jit_free_finish dereferenzia il jit_alloc[ids[j]] obsoletomali_kbase_mem.c:3138 kbase_jit_backing_lost → percorso di destroy (si attiva durante il reclaim)