
Honor WIN RT (AAK-AN00) CVE-2026-43499 root temporaneo - note di ricerca
(scritto interamente da deepseek, io non capisco nulla)
Bootloader del dispositivo bloccato permanentemente (
ro.oem_unlock.supportedvuoto), niente fastboot, niente su persistente, niente Magisk. L'unica strada ancora percorribile è una vulnerabilità del kernel. Questo repository documenta l'intero processo da "si può colpire?" a "quanto è stabile dopo il colpo?".
Natura: root temporaneo, si perde al riavvio.
Questo repository documenta un processo di ricerca sulla sicurezza condotto su un dispositivo di mia proprietà, con l'obiettivo di comprendere le cause e i limiti di stabilità di una race condition PI del kernel.
L'unico percorso portato a termine è:
CVE-2026-43499 (race condition futex PI write-what-where) + carrier rt_sigreturn
→ iniezione LD_PRELOAD in un processo del dominio shell
→ in due fasi: prima portare SELinux in Permissive, poi modificare task->real_cred / cred in init_cred
→ uid=0(root) context=u:r:kernel:s0, e installazione del daemon su
Ma ciò che vale davvero la pena scrivere non è "come ottenere root" — è ciò che accade dopo averlo ottenuto.
Ciò che si ottiene non è un root stabile, ma "uno stato che può esplodere in qualsiasi momento".
La primitiva di scrittura dell'exploit inserisce un
rt_mutex_waiterfalsificato nella catena futex PI reale, e il vettore di questo waiter è uno stack del kernel / pagina spray che verrà riutilizzata dalle successive system call. Pertanto, dal momento in cui root atterra, qualsiasi cambiamento di scheduling o priorità a livello di sistema può calpestarlo, causando direttamente un kernel panic e un riavvio. Non è un bug, è il costo intrinseco di questa tecnica di sfruttamento — vedidocs/03.
Perché è indispensabile vincolare la versione del kernel: il difetto è stato corretto in 6.6.140, e questa macchina ha 6.6.118 < 6.6.140, quindi è ancora presente;
inoltre tutti gli indirizzi dei simboli del kernel dell'exploit e la "geometria del carrier" sono ancorati a questo singolo build; cambiando kernel la tabella degli offset diventa immediatamente invalida, e in genere non è possibile tornare indietro.
┌─ Materiali ───────────────────────────────────────────┐
│ boot.img + xbl_config.elf (estratti dal firmware del dispositivo) │
│ ↓ risoluzione dei simboli │
│ target.h (indirizzi dei simboli del kernel, verificati byte per byte con kallsyms) │
│ ↓ build │
│ preload.so ──► /data/local/tmp/*.so sul dispositivo │
└────────────────────────────────────────────────────────┘
↓ iniezione LD_PRELOAD
┌──────────── in due fasi (richiede due processi distinti) ────────────┐
│ Fase A GW_SELINUX=1 → selinux_state.enforcing = 0 │
│ Fase B GW_CHAIN=1 RTSIG_TASK_INIT=1 GW_SU=1 │
│ → task->real_cred ← &init_cred │
│ → task->cred ← &init_cred (eseguito dal processo "scrittore preimpostato") │
│ → setresuid(0,0,0) normalizzazione │
│ → installazione del su incorporato + daemon │
└─────────────────────────────────────────────────────────────┘
↓
uid=0(root) context=u:r:kernel:s0
Tre punti che devono essere eseguiti correttamente (in caso contrario si blocca o si va direttamente in panic):
real_cred, poi cred. L'ordine inverso causa un'immediata escalation completa dei privilegi e la perdita di controllo dei thread.cred ≠ real_cred. In quel momento qualsiasi sched_setaffinity restituisce EPERM → l'intero ciclo si blocca.
La soluzione corretta è effettuare il fork del processo "scrittore preimpostato" prima del primo colpo (credenziali pulite): il processo padre esegue il primo colpo, lo scrittore esegue il secondo, e nessuno dei due effettua syscall nello stato transitorio.alias(image) = PAGE_OFFSET | (image − KIMAGE_TEXT_BASE + Δ), stabile tra i riavvii;
il vero valore della cosiddetta "fase di slide" è l'autoverifica della primitiva di scrittura, non il bypass di KASLR.Framework upstream:
Linuxoid-cn/CVE-2026-43499-Poc-Analysis. Attenzione, questo non è GhostLock — GhostLock segue la via di pselect, che non corrisponde alla geometria del punto di atterraggio del waiter di questo build, vedidocs/06.
Se anche tu stai attaccando un modello con BL bloccato, pensa prima chiaramente a cosa vuoi fare con root, perché su questi modelli root è molto probabilmente una finestra utilizzabile solo per una decina di minuti. Elenca le operazioni che "richiedono root e devono sopravvivere al riavvio", eseguile tutte in una volta, poi
rebootper tornare a uno stato pulito. Non cercare di "eliminare gli effetti collaterali" — è il costo intrinseco della tecnica stessa.
| Voce | Valore | Note |
|---|
| Modello | Honor WIN RT, modello AAK-AN00 | Nome commerciale "Honor WIN RT" |
| SoC | Snapdragon 8 Elite SM8750-AB | Firmware non intercambiabile con Honor WIN (AAP-AN00, SM8850-AC) |
| Sistema | Android 16 / MagicOS 10 | — |
| Kernel | 6.6.118-android15-8-gf17133276a57-abogki518694926-4k | ★ Condizione vincolante, corrispondenza carattere per carattere |
| Configurazione kernel | 4K pages, VA_BITS=39, CONFIG_FUTEX_PI=y | Prerequisito della geometria del carrier |
| Pacchetto firmware | .170 | .160 / .175 non testati |
| Bootloader | Bloccato permanentemente | Niente fastboot / niente su persistente |
| Documento | Contenuto |
|---|
| 01 · Analisi di fattibilità | Perché resta solo rt_sigreturn come carrier |
| 02 · Catena di privilege escalation e fattori di successo | Primitiva di scrittura, catena in sei passi, scrittore preimpostato, criteri di successo |
| 03 · Vera causa dell'instabilità: residui della catena PI | ★ Nucleo. La disconnessione di rete non è disconnessione, è panic; include disassembly dei punti di crash |
| 04 · Canale senza computer: Shizuku | Usare rish di Shizuku al posto di adb per avviare l'exploit |
| 05 · late-load di KernelSU | Modalità di attivazione del LKM e perché è il detonatore più pericoloso |
| 06 · Elenco dei vicoli ciechi | Percorsi provati ma non funzionanti, per evitare che altri li ritentino |
| 07 · Insidie e ambiente | Ottenere lo stack di panic senza root, insidie dell'ambiente degli script |
| tools/ | Script riutilizzabili (versione generica anonimizzata) |
| Data | Progresso |
|---|
| 09-08 | Confermato il blocco permanente del BL e la rimozione del canale di sblocco OEM ⇒ abbandonata la via ufficiale, passaggio alla via della vulnerabilità |
| 09-09 | Superata la libreria firmware dell'assistenza del produttore, ottenuto boot.img, estratti kernel e simboli |
| 09-10 | La ricerca del carrier si è concentrata su rt_sigreturn; privilege escalation riuscita (20:14), uid=0 |
| 09-11 | Aperto il canale senza computer (Shizuku); KernelSU attivabile; identificata la vera causa della "disconnessione di rete" = residui della catena PI |