
(CVE-2026-43499) Exploit del kernel per dispositivi OnePlus con bootloader non sbloccato.
Exploit del kernel destinato a dispositivi OnePlus con bootloader bloccato. Utilizza CVE-2026-43499 per ottenere accesso root senza sbloccare il bootloader né modificare boot.img.
Solo per ricerca di sicurezza autorizzata e scopi educativi.
| Elemento | Dettaglio |
|---|---|
| CVE | CVE-2026-43499 |
| Tipo | Use-After-Free in Futex PI (Priority Inheritance) |
| Ambito | Kernel Linux 2.6.39 ~ 7.1 |
| Corretto in | Mainline 7.1 (commit 3bfdc63936dd) |
| Stato Android | GKI 6.12.x ancora vulnerabile |
La chiamata di sistema pselect6 copia fd_set nello stack del kernel. Quando combinata con il meccanismo del waiter futex PI, un frame di stack liberato può essere riallocato come struttura rt_mutex_waiter. Durante la traversata della catena PI, il ribilanciamento dell'albero rb scrive dati controllati in indirizzi arbitrari del kernel.
futex PI UAF (CVE-2026-43499)
├─ Forgiare oggetto rt_mutex_waiter
├─ Controllare lo stack del kernel tramite il layout fd_set di pselect/select
├─ Attivare 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 Ace 6T | PLR110 | SM8845 (Snapdragon 8s Elite) | 6.12.38-android16-5-...-ab14275539-4k | ColorOS 16.0.2.403 | ✅ Verificato |
| OnePlus Ace 6T | PLR110 | SM8845 (Snapdragon 8s Elite) | 6.12.38-android16-5-...-ab14552068-4k | ColorOS 16.0.8.301 | ✅ Verificato |
| OnePlus 15 | PLK110 | SM8845 (Snapdragon 8s Elite) | 6.12.23-android16-5-...-ab14541642-4k | — | ✅ Verificato |
Altri dispositivi OnePlus sulla stessa famiglia SoC, Android 16 o kernel 6.12.x possono essere adattati tramite l'estrazione degli offset da boot.img.
GhostLock gestisce l'elevazione dei privilegi. L'installazione di KernelSU richiede ksud (in bundle con kernelsu.ko specifico per KMI):
| Fonte | Note |
|---|---|
| APK ReSukiSU (consigliato) | Installare ReSukiSU; l'APK contiene libksud.so |
| Rilascio CI | Scaricare 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
# Specificare il livello API
make API=34
# Specificare il percorso NDK
NDK=/path/to/android-ndk make
ghostlock — eseguibile ELF ARM64 collegato staticamente.
# 1. Abilitare la modalità ADB TCP
adb tcpip 5555
# 2. Inviare la chiave ADB (richiesta per la modalità bootstrap)
adb push ~/.android/adbkey /data/local/tmp/a/adbkey
# 3. Inviare 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, consentendo esecuzioni completamente automatiche nei riavvii successivi.
/data/local/tmp/a/e
/data/local/tmp/a/e --bootstrap
setprop abilitare ADB TCP 5555127.0.0.1:5555/data/local/tmp/a/e --write1
Offset memorizzati nella tabella di ricerca src/devices/offsets.h, indicizzati da uname -r. Il programma li abbina automaticamente all'avvio; 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 di strutture BTF | 57 | tools/extract_btf.py |
| Valori derivati | 9 | Calcolati automaticamente |
| Costanti fisse | 12 | Hardcoded |
| 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 su 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), si ottiene l'indirizzo base tramite boot_id sovrascritto con un indirizzo del kernel:
Leggi /proc/sys/kernel/random/boot_id
└─ L'UUID contiene l'indirizzo di nfulnl_logger
└─ Spostamento KASLR = indirizzo_leakato - image_offset
└─ kaslr_base
Quando il dispositivo ashmem è accessibile, si utilizzano le primitive di lettura/scrittura di configfs per leggere i puntatori a funzione dalla tabella fops di ashmem e calcolare l'offset KASLR.
Forgiare oggetti del kernel su pagine order-3 (32KB):
file_operations — dirottare il puntatore fops del miscdevice ashmemrt_mutex_waiter — simulare un nodo waiter nella catena PItask_struct — riferimento al task durante la traversata PIrt_mutex (lock) — informazioni corrette su waiter/ownerImplementato tramite SKB (socket buffer) + KernelSnitch:
mm_structsendmsg per riempire l'heap del kernelDopo aver ottenuto la base KASLR, si utilizzano i buffer pipe per l'accesso alla memoria a livello fisico:
1. Individuare il buffer pipe nella physmap
2. Forgiare la tabella delle operazioni pipe_buffer che punta a known_pipe_buf_ops
3. Dirottare pipe_buffer.page verso l'indirizzo fisico target
4. Lettura/scrittura fisica arbitraria tramite normali operazioni pipe
Supportate: pipe_read64, pipe_write64, pipe_phys_read_data, pipe_phys_write_data