
(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 |
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 */
};
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
Target: puntatore cred del processo figlio
Metodo: 1. fork child → perf_find_task() localizza task_struct
2. calcola offset del campo cred
3. scrittura PI child-node → cred = init_cred (uid=0, caps complete)
4. cancella seccomp (TIF_SECCOMP + struct seccomp azzerata)
Dopo la sovrascrittura delle cred viene eseguita la verifica delle capacità in lettura.
src/core/miniadb.c — client leggero del protocollo ADB per la modalità bootstrap:
1. TCP connetti a 127.0.0.1:5555
2. A_CNXN → richiesta di connessione
3. A_AUTH → sfida token RSA
4. dlopen("libcrypto.so") → PEM_read_bio_RSAPrivateKey → RSA_sign
5. A_AUTH (AUTH_SIGNATURE) → risposta firmata
6. A_CNXN → connessione stabilita
7. A_OPEN "shell:/data/local/tmp/a/e" → exploit completo
Supporta algoritmi di firma SHA-1 e SHA-256.
ghostlock-oneplus/
├── Makefile # Configurazione build (cross-compilazione NDK)
├── README.md # Documentazione
├── src/
│ ├── core/ # Codice exploit principale
│ │ ├── main.c # Punto di ingresso: scrittura in due fasi + shell root
│ │ ├── fops.c # Modalità FOPS/CFI: percorso pselect, scrittura PI, leak KASLR
│ │ ├── util.c # Utility: heap spray, KASLR, primitive R/W del kernel
│ │ ├── slide.c # Modalità SLIDE: leak KASLR tramite boot_id + percorso pselect
│ │ ├── pipe.c # Lettura/scrittura memoria fisica tramite buffer pipe (physrw)
│ │ ├── root.c # Sovrascrittura cred, cancellazione seccomp, gestione child root
│ │ ├── miniadb.c # Client ADB integrato (TCP + autenticazione RSA)
│ │ ├── common.h # Macro globali, struct, dichiarazioni, costanti
│ │ ├── target.h # Layout di memoria target / offset struct / parametri KASLR
│ │ ├── offset.h # Ponte di configurazione target in fase di compilazione (#include TARGET_CONFIG_H)
│ │ └── kernelsnitch/ # KernelSnitch — leak indirizzo mm_struct
│ │ ├── kernelsnitch.h # Algoritmo principale: collisione hash futex + forza bruta
│ │ ├── futex_hash.h # Funzione hash futex
│ │ ├── timeutils.h # Misurazione timestamp CPU (RDTSC)
│ │ └── utils.h # Macro di supporto (pr_info / SYSCHK / ASSERT ecc.)
│ └── devices/ # Tabelle offset per dispositivo
│ ├── offsets.h # Aggrega tutti gli offset dei dispositivi (tabella di ricerca + sentinella)
│ ├── ace6t/offsets.h # Offset OnePlus Ace 6T (2 versioni kernel)
│ └── op15/offsets.h # Offset OnePlus 15 (1 versione kernel)
└── tools/ # Toolchain estrazione offset
├── extract_target.py # Estrai offset dei simboli globali kallsyms (28 elementi)
└── extract_btf.py # Estrai offset dei campi struttura BTF (57 elementi)
Questo repository è stato modificato; consulta il repository originale per i dettagli.
Assicurati di eseguire in una shell ADB. Il contesto App richiede --bootstrap.
La versione del tuo kernel non è ancora supportata. Segui Aggiunta di nuovi dispositivi per estrarre gli offset e ricompilare.
CORE)PSELECT_ENTER_DELAY_USECperf_event_open (usa --bootstrap in contesto App)kaslr_base valido)ksud esista e sia eseguibileload_policy)Solo per scopi autorizzati di ricerca sulla sicurezza e istruzione.
libksud.so| Rilascio CI | Scarica da ReSukiSU CI (ksud-aarch64-linux-android.zip) |
| 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 |
| Modulo | File | Responsabilità |
|---|
| Ingresso | main.c | Parsing CLI, dispatch W1/W2, flusso bootstrap |
| Percorso PI | fops.c / slide.c | Layout stack pselect/select, manipolazione catena futex PI |
| KASLR | util.c / fops.c / slide.c | Bypass a due modalità: leak boot_id + leak tabella fops |
| Heap Spray | util.c | Allocazione pagine order-3, SKB spray, layout oggetti forgiati |
| Lett./Scritt. Fisica | pipe.c | Hijack buffer pipe, accesso arbitrario alla memoria fisica |
| Elevazione Privilegi | root.c | Sovrascrittura cred, verifica capacità, cancellazione seccomp |
| ADB | miniadb.c | Client ADB leggero, autenticazione RSA |
| Motore Leak | kernelsnitch/ | Collisione hash futex per localizzazione mm_struct |