
(CVE-2026-43499) Exploit del kernel per OnePlus 15T con bootloader non sbloccato.
Exploit del kernel mirato a dispositivi OnePlus 15T con bootloader bloccato. Utilizza CVE-2026-43499 per ottenere accesso root senza sbloccare il bootloader o modificare boot.img.
Solo per scopi autorizzati di ricerca sulla sicurezza e istruzione.
Modificato dal repository originale GhostLock-for-OnePlus, adattato per il layout della memoria fisica e i tempi della CPU di OnePlus 15T (PLZ110 / SM8850 / Snapdragon 8 Elite).
| Elemento | Dettaglio |
|---|---|
| CVE | CVE-2026-43499 |
| Tipo | Futex PI (Priority Inheritance) Use-After-Free |
| Ambito | Linux kernel 2.6.39 ~ 7.1 |
| Corretto in | Mainline 7.1 (commit 3bfdc63936dd) |
| Stato Android | GKI 6.12.x ancora vulnerabile |
La syscall pselect6 copia fd_set nello stack del kernel. Se combinata con il meccanismo del waiter futex PI, un frame dello stack deallocato può essere riallocato come struct rt_mutex_waiter. Durante l'attraversamento della catena PI, il ribilanciamento dell'albero rb scrive dati controllati a indirizzi arbitrari del kernel.
futex PI UAF (CVE-2026-43499)
├─ Costruisci oggetto rt_mutex_waiter
├─ Controlla lo stack del kernel tramite il layout fd_set di pselect/select
├─ Attiva l'operazione rt_mutex PI per scrittura arbitraria
├─ Scrittura 1: selinux_state.enforcing = 0
└─ Scrittura 2: cred → init_cred (uid=0, capacità complete)
| Dispositivo | Nome in codice | SoC | Kernel | Firmware | Stato |
|---|---|---|---|---|---|
| OnePlus 15T | PLZ110 | SM8850 (Snapdragon 8 Elite) | 6.12.38-android16-5-g844001fb8721-ab14552068-4k | ColorOS 16.0.9.400 | ✅ Verificato |
Per Ace 6T e OnePlus 15, consulta il repository originale.
GhostLock gestisce l'elevazione dei privilegi. L'installazione di KernelSU richiede ksud (in bundle con kernelsu.ko specifico per KMI):
| Fonte | Note |
|---|---|
| ReSukiSU APK (consigliato) | Installa ReSukiSU; l'APK contiene libksud.so |
| Rilascio CI | Scarica da ReSukiSU CI (ksud-aarch64-linux-android.zip) |
Senza ksud, l'exploit ottiene comunque una shell root con uid=0, ma KernelSU non verrà installato e
sunon persisterà.
ANDROID_NDK_HOME o ANDROID_NDK_ROOT# Predefinito (API 35)
make
# Specifica livello API
make API=34
# Specifica percorso NDK
NDK=/path/to/android-ndk make
ghostlock — eseguibile ELF ARM64 collegato staticamente.
# 1. Abilita modalità TCP ADB
adb tcpip 5555
# 2. Invia chiave ADB (richiesta per la modalità bootstrap)
adb push ~/.android/adbkey /data/local/tmp/a/adbkey
# 3. Invia l'exploit
adb push ghostlock /data/local/tmp/a/e
adb shell chmod 755 /data/local/tmp/a/e
Dopo il primo successo,
resetpropimposta automaticamentepersist.adb.tcp.port=5555, permettendo esecuzioni completamente automatiche ai riavvii successivi.
/data/local/tmp/a/e
/data/local/tmp/a/e --bootstrap
setprop abilitando ADB TCP 5555127.0.0.1:5555/data/local/tmp/a/e --write1
Gli offset sono memorizzati in una tabella di ricerca in src/devices/offsets.h, indicizzata da uname -r. Il programma esegue l'abbinamento automatico all'avvio; i kernel sconosciuti vengono rifiutati.
static const struct kernel_offsets known_offsets[] = {
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14275539-4k", ...),
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14552068-4k", ...),
OFFSETS_ENTRY("6.12.23-android16-5-...-ab14541642-4k", ...),
{ .uname_r = NULL } /* sentinella */
};
| Tipo | Conteggio | Estrazione |
|---|---|---|
| Simboli globali kallsyms | 28 | tools/extract_target.py |
| Campi struttura BTF | 57 | tools/extract_btf.py |
| Valori derivati | 9 | Calcolati automaticamente |
| Costanti fisse | 12 | Codificate |
| Struttura | Campi | Scopo |
|---|---|---|
task_struct | 17 | Descrittore di processo, cred, seccomp |
rt_mutex_waiter | 6 | Obiettivo di forgiatura UAF |
cred | 4 | Credenziali, capacità |
seccomp | 3 | Stato del filtro seccomp |
pipe_inode_info | 11 | Operazioni sul buffer pipe |
file_operations | 13 | Tabella fops falsa |
mm_struct | 1 | Proprietario del descrittore di memoria |
Quando i puntatori del kernel sono limitati (kptr_restrict), perde l'indirizzo di base tramite boot_id sovrascritto con un indirizzo del kernel:
Leggi /proc/sys/kernel/random/boot_id
└─ UUID contiene l'indirizzo di nfulnl_logger
└─ KASLR slide = indirizzo_leak - image_offset
└─ kaslr_base
Quando il dispositivo ashmem è accessibile, utilizza le primitive di lettura/scrittura di configfs per leggere i puntatori a funzione dalla tabella fops di ashmem e calcolare l'offset KASLR.
Forgia oggetti del kernel su pagine order-3 (32KB):
file_operations falsi — hijack del puntatore fops del miscdevice ashmemrt_mutex_waiter falso — simula nodo waiter nella catena PItask_struct falso — riferimento task durante l'attraversamento PIrt_mutex (lock) falso — informazioni corrette su waiter/ownerImplementato tramite SKB (socket buffer) + KernelSnitch:
mm_structsendmsg per riempire l'heap del kernelDopo aver ottenuto la base KASLR, utilizza i buffer pipe per l'accesso a livello fisico:
1. Individua il buffer pipe nella physmap
2. Forgia la tabella delle operazioni del pipe_buffer puntando a pipe_buf_ops noti
3. Hijack di pipe_buffer.page per puntare all'indirizzo fisico target
4. Lettura/scrittura fisica arbitraria tramite normali operazioni pipe
Supportato: pipe_read64, pipe_write64, pipe_phys_read_data, pipe_phys_write_data
Target: selinux_state.enforcing (offset 0x00)
Metodo: scrittura PI child-node → forja __rb_parent_color del waiter
puntando a selinux_enforcing - 8
il ribilanciamento dell'albero rb scrive 0x00