
Note di riproduzione per CVE-2025-21479 (Qualcomm Adreno GPU) per vivo iQOO 11 Pro (PD2254) - ricerca autorizzata
Ricerca di sicurezza autorizzata su dispositivi di propria proprietà. CVE-2025-21479 è una vulnerabilità del Qualcomm Adreno GPU divulgata pubblicamente, corretta (2025-08) e inclusa nel catalogo CISA KEV. Questo documento descrive l'intero processo di replica del root temporaneo su iQOO 11 Pro e la consegna finale.
and $04, $12, 0x3 (nella versione corretta 0x7), che consente a un flusso di comandi in spazio utente di aggirare i controlli di autorizzazione ed eseguire operazioni GPU privilegiate (hijacking della tabella di pagine SMMU), ottenendo infine lettura/scrittura arbitraria della memoria fisicaIl firmware di Android 16 (16.3.10.1) è corretto; questa replica è valida esclusivamente per Android 15 (15.2.12.2).
a740_sqe.fw dal pacchetto OTA completo: 75.380 byte; la ricerca del pattern di istruzione vulnerabile 0300 422a (and $04,$12,0x3) ha prodotto 3 corrispondenze → non corretto_text=0xffffffc008000000, _stext=0xffffffc008010000, swapper_pg_dir, selinux_state, init_task_stext fisico fissato a 0xa8010000 (PHYS_OFFSET=0xA8000000, layout standard SM8550), verificato lato VMLINUX a 0xffffffc008010000selinux_state.enforcing=0. Verificato che il kernel A15 del PD2254 ha CONFIG_SECURITY_SELINUX_DEVELOP=y (in kallsyms sono presenti sel_write_enforce/enforcing_setup); enforcing_enabled() legge il campo a runtime → la scrittura ha effetto e getenforce mostra Permissive0xfebeb000 + candidati adiacenti da 2-4 GB + candidati sparsi nella fascia alta 5-11 GB → tasso di successo notevolmente aumentatovr.ko di vivo (modulo incorporato in vendorboot) tramite hook kprobe/tracepoint + thread daemon uccide qualsiasi processo con uid=0, e il modulo è auto-nascosto, con verifica vermagic. Per questo l'uid non viene azzerato: si riscrivono fisicamente i bit di capability nella struct cred (uid mantenuto a 2000 + tutte le caps + PR_SET_KEEPCAPS/) → il set completo di capacità viene preservato attraverso gli exec, equivalente a root, senza attivare il watchdog
Log di successo (prima esecuzione, dispositivo inizialmente in Enforcing, percorso di scrittura fisica di enforcing):
phyaddr: 0xfebeb000 (attempt 1/27) # spray 候选命中
GPU R/W ready # 任意物理读写建立
found _stext at 0xa8010000 # KASLR 泄漏(扫描路径;显式 CHEESE_STEXT_PA 时无此行)
FW symbols resolved
stext = 0xa8010000 # 物理 _stext = VA - 0xffffffc000000000 + 0xA8000000
SELinux enforcing overwrite verified (readback=1 enforce=0)
self creds: full caps granted (uid=2000 kept, watchdog dodge)
root shell (uid=2000, full caps kept)...
Se eseguito una seconda volta nella stessa sessione (SELinux già permissivo), la riga diventa
SELinux already permissive.
# 设备刷入 Android 15 (15.2.12.2) 后:
adb push cheese /data/local/tmp/
adb shell chmod 755 /data/local/tmp/cheese
adb shell CHEESE_STEXT_PA=0xa8010000 /data/local/tmp/cheese
# 完成后当前 adb shell 会话即为 root shell(uid=2000 + 全 caps),SELinux 宽容模式
Variabili d'ambiente:
Nuovi tentativi automatici: bash cheese_auto.sh (esecuzione in loop, rilevamento di riavvii offline, log su disco).
vr.ko di vivo uccide i processi con uid=0 e il modulo è auto-nascosto; non è stata implementata la persistenza / l'integrazione con KernelSU (i moduli KernelSU non possono essere caricati con insmod perché il kernel non esporta i simboli, vedi appendice)cheese: artefatto compilato (ELF Android aarch64, NDK r28, distribuito come binario, sorgenti non pubbliche)cheese_auto.sh: script per i nuovi tentativi automaticiREADME.md: questo documentovr.ko all'interno di vendorboot.img, in lib/modules/5.15-gki/vr.ko (389 KB)Questo repository è destinato esclusivamente a scopi di ricerca sulla sicurezza e formazione; tutti i test sono stati eseguiti su dispositivi di proprietà dell'autore. Utilizzare solo nell'ambito di un'autorizzazione legittima; l'utilizzatore si assume ogni rischio.
| Campo | Valore |
|---|
| Dispositivo | vivo iQOO 11 Pro (PD2254 / V2254A) |
| Sistema | Android 15, PD2254B_A_15.2.12.2.W10 |
| Kernel | 5.15.178-g3dc7c01077b8-dirty |
| SoC | Snapdragon 8 Gen 2 (SM8550 / kalama) |
| GPU | Adreno 740, firmware a740_sqe.fw v675 (versione vulnerabile) |
SECBIT_KEEP_CAPSCHEESE_ZERO_IDS=1 per il vecchio percorso (uid azzerato, vivo lo ucciderebbe, solo per debug)| Elemento verificato | Risultato |
|---|
getenforce | Permissive |
/sys/fs/selinux/enforce | 0 |
| Capacità del processo | CapEff=ffffffffffffffff (set completo di capacità) |
| Shell di root | accesso a sh, disponibili insmod / lettura e scrittura di file arbitrari |
| Variabile | Funzione |
|---|
CHEESE_STEXT_PA | Specifica l'indirizzo fisico di _stext (default 0xa8010000, fallback automatico alla scansione in caso di verifica fallita) |
CHEESE_ATTEMPT | Specifica l'indice del candidato di indirizzo fisico |
CHEESE_ROUNDS | Nuovi tentativi automatici su più round |
CHEESE_NO_RETRY | Disabilita i nuovi tentativi automatici |
CHEESE_ZERO_IDS | Se impostato a 1 azzera anche uid/gid (vecchio comportamento, attiva il watchdog di vivo, solo per debug) |
ROOT_CMD | Esegue direttamente il comando specificato dopo l'elevazione dei privilegi (in combinazione con il percorso cold-patch di cap_capset) |