Volver a actualizaciones
ActualizadaAug 8, 2026

cve-2026-43499 — Actualizado!

PD2229B的43499(ghostlock)可行性研究

Compartir

Resumen del fallo de explotación de GhostLock en PD2229 (SM8475, 5.10.233 GKI)

1. Hechos sobre la vulnerabilidad y el dispositivo

1.1 Información básica de CVE-2026-43499 (GhostLock)

ElementoValor
Tipo de vulnerabilidadUse-After-Free en la pila en la ruta rt_mutex / futex PI
Versión introducidaLinux 2.6.39-rc1 (mayo de 2011, commit 8161239a8bcc)
Versión corregidamainline 7.1 (commit 3bfdc63936dd), ramas estables: 6.1.175 / 6.6.140 / 6.12.86 / 6.18.27 / 7.0.4
Requisito previoCONFIG_FUTEX_PI=y (habilitado por defecto en kernels principales)
CVSS7.8 High
Estabilidad de explotaciónCadena original de NebuSec 97%, root en ~5 segundos
Recompensa kernelCTF$92,337 USD

Rango de kernels afectados:

  • 2.6.39 ≤ Linux < 6.1.175 ✅ Afectado
  • 6.2 ≤ Linux < 6.6.140 ✅ Afectado
  • 6.7 ≤ Linux < 6.12.86 ✅ Afectado
  • 6.13 ≤ Linux < 6.18.27 ✅ Afectado
  • 6.19 ≤ Linux < 7.0.4 ✅ Afectado
  • Android GKI 5.10 no está en ninguna rama corregida → el 5.10.233 de PD2229 teóricamente afectado

1.2 Pruebas reales en el dispositivo PD2229

ElementoValor
SoCQualcomm SM8475 (Snapdragon 8 Gen 1 Plus)
Versión del kernel5.10.233-gki-g6e61de9f5b58 #1 SMP PREEMPT (24 nov 2025)
Versión de Android15 (OriginOS 5)
Fecha de compilación2025/11/25
Parche de Android2025/11/01
CONFIG_FUTEX_PIy ✅
CONFIG_UNMAP_KERNEL_AT_EL0y (KPTI habilitado)
kptr_restrictenforced
CONFIG_IO_URINGy ✅ (confirmado por símbolos de vmlinux, y seccomp no bloquea io_uring_setup)

2. Cadena de explotación ideal vs progreso real en PD2229

2.1 Cadena original de NebuSec (exitosa en x86_64 / Pixel 10)

1. Bypass de KASLR        → prefetch timing / PR_SET_MM_MAP auxv
2. Disparo de UAF         → deadlock de dependencia PI de tres hilos → FUTEX_CMP_REQUEUE_PI devuelve -EDEADLK
3. Reciclaje de pila      → PR_SET_MM_MAP copia auxv al marco de pila del waiter
4. Escritura restringida rb_erase → sobrescribe inet6_protos[IPPROTO_UDP]
5. CEA + ROP              → secuestro del flujo de control
6. Cambio de core_pattern → shell root (97% de éxito)

2.2 Progreso real por etapa en PD2229

EtapaEstadoDescripción
1. Bypass de KASLRImplementadoCanal lateral perf_event_open + muestreo de callchain (mismo método de adaptación que OPPO Find X6 Pro 5.15.149)
2. Disparo de UAFImplementadoDeadlock PI de tres hilos exitoso, FUTEX_CMP_REQUEUE_PI devuelve -EDEADLK
3. Primitiva de reciclaje de pilaFallo arquitectónicoLos marcos de pila de todas las syscalls conocidas no se superponen con el waiter (ver sección 3)
4. Escritura restringida rb_erase❌ BloqueadoRequisito previo no cumplido
5. Sobrescritura de inet6_protos❌ No iniciadoDepende de la etapa 4
6. ROP / secuestro del flujo de control❌ No iniciadoDepende de la etapa 5
7. Shell root❌ No iniciadoDepende de la etapa 6

3. Resultados de enumeración exhaustiva de la primitiva de reciclaje de pila (pruebas reales en PD2229)

3.1 Cálculos clave del diseño del marco de pila

Profundidad total de la ruta futex:
  __arm64_sys_futex    0x90
  + do_futex           0xc0
  + futex_wait_requeue_pi  0x1b0
  = 0x300
Posición del waiter = SYS_SP - 0x300 + 0x20 = SYS_SP - 0x2e0

Ruta pselect:
  marco de pila core_sys_select 0x1c0, stack_fds en sp+0x50
  Rango cubierto: SYS_SP - 0x1c0 + 0x50 = desde SYS_SP - 0x170
  Diferencia con waiter (SYS_SP - 0x2e0) de 0x170 (368 bytes) → sin superposición

3.2 17 métodos de escritura en pila probados

#MétodoSyscallResultado en PD2229Razón principal del fallo
1stamp_prctlPR_SET_MM_MAP❌ EPERMBloqueo duro de Android
2stamp_pselectpselect6 (NFDS=320)❌ Sin superposiciónwaiter está 120B por debajo de fd_set
3stamp_pselectpselect6 (NFDS>336)❌ Asignación en heapRuta kvmalloc
4stamp_socketMCAST_JOIN_SOURCE_GROUP❌ Cobertura insuficienteSolo escribe el campo lock
5stamp_sendmsgsendmsg❌ A 80B del waiterProfundidad del marco 0x90 insuficiente
6stamp_sendmmsgsendmmsg❌ A 112B del waiterMarco insuficiente
7stamp_recvmmsgrecvmmsg❌ Borra task/lockEl marco 0x1d0 corrompe punteros críticos
8stamp_process_vmprocess_vm_writev❌ Sin superposiciónPila del hilo hijo asignada por separado
9stamp_keyctlKEYCTL_INSTANTIATE_IOV❌ EOPNOTSUPPSyscall no soportada + marco 0x40
10stamp_tcpTCP_ZEROCOPY_RECEIVE❌ Marco insuficienteProfundidad estimada insuficiente
11stamp_futexFUTEX_CMP_REQUEUE_PI recursivo❌ Lógicamente inviableCorrompe la ventana de UAF
12binder ioctlBINDER_WRITE_READ❌ EACCESshell sin permiso en /dev/binder
13pollpoll❌ Asignación en heappollfd en el heap
14epoll_waitepoll_wait❌ Marco demasiado superficialMarco 0xE0
15sched_setattrsched_setattr❌ Profundidad insuficienteMarco 0xb0
16timerfd_settimetimerfd_settime❌ Sin copia en pilaSin buffer grande en pila
17io_uring_registerIORING_REGISTER_*Doble fallo①Marco de solo 0xF0, el destino de copy_from_user fijo en sp+0x8 (diferencia de 424 bytes con sp+0x1D0 del waiter); ②aunque io_uring_setup no está bloqueado por seccomp (devuelve EFAULT en lugar de ENOSYS), el diseño de pila no coincide

17/17 fallaron todos.

3.3 Causa raíz del fallo

El diseño de pila generado por el compilador del SM8475 5.10 GKI de PD2229 (PGO + LTO + BOLT) hace que stack_fds de core_sys_select y rt_mutex_waiter de futex_wait_requeue_pi no se superpongan arquitectónicamente. Este es un hecho objetivo determinado por el compilador, no un problema de técnica de explotación.

El repositorio de JoinChang establece claramente: "The pselect stack overlay only works when the freed rt_mutex_waiter lands within the user-controllable region of the stack_fds buffer" — PD2229 no cumple esta condición.


4. Análisis comparativo de repositorios de referencia públicos

NebuSec/CyberMeowfia — Framework de explotación original

  • Repositorio: https://github.com/NebuSec/CyberMeowfia
  • Objetivo: x86_64 Linux / Pixel 10 (6.x GKI)
  • Reciclaje de pila: PR_SET_MM_MAP copia auxv a la pila del kernel
  • Tasa de éxito: 97%, ~5 segundos para [shell root]
  • Aplicabilidad a PD2229: ❌ PR_SET_MM_MAP bloqueado con EPERM en Android

JoinChang/ghostlock-oneplus — Jailbreak de BL OnePlus

  • Repositorio: https://github.com/JoinChang/ghostlock-oneplus
  • Dispositivos verificados:
    • OnePlus Ace 6T (PLR110, SM8845) — 6.12.38 GKI ✅
    • OnePlus 15 (PLK110, SM8845) — 6.12.23 GKI ✅
  • Puntos técnicos clave:
    • Extracción automática de offsets: kallsyms (28) + BTF (57) + derivados (9) + constantes (12) = 103/103
    • Superposición de pila pselect, SP diff = -64
    • PSELECT_SHIFT = -2
    • Cadena de explotación: futex UAF → waiter falsificado → pselect controla la pila → escritura restringida rb_erase → selinux_state.enforcing=0 → sobrescritura de cred con init_cred
  • Declaración explícita de inviabilidad: "Not Feasible (stack layout incompatible)" — solo aplicable a kernels donde pselect stack_fds se superpone con el waiter
  • Aplicabilidad a PD2229: ❌ Generación de kernel incompatible (6.12 vs 5.10), y diseño de pila sin superposición

p2p3p/GhostLock-for-OnePlus — Explotación completa OnePlus 6.12

YuKongA/ghostlock-oplus — OPPO Find N5/X8

Adaptación OPPO Find X6 Pro (PGEM10) — 5.15.149

  • Dispositivo: SM8550, 5.15.149-android13, Android 15
  • Progreso: ✅ Bypass de KASLR (perf_event_open + muestreo de callchain); etapas posteriores sin explotación completa publicada
  • Importancia: demuestra que el bypass de KASLR es viable en 5.15 GKI, pero la etapa de reciclaje de pila no está verificada públicamente

pubglite55/oppo-ghostlock — OPPO Find N2

  • Repositorio: https://github.com/pubglite55/oppo-ghostlock
  • Dispositivo: OPPO Find N2 (CPH2413, SM8475)
  • Kernel: 5.10.236-android12-9-o-g74d132f4467a
  • Android: 16 (BP2A.250605.015)
  • Implementado:
    • ✅ Firefox CVE-2026-10702 AAW (Stage 1)
    • ✅ Bypass de KASLR (cálculo directo de kaslr_base)
    • ✅ Disparo de GhostLock FUTEX (FUTEX_CMP_REQUEUE_PI ret=0)
    • ✅ Fuga de mm_struct con KernelSnitch
    • ✅ Heap spray de sk_buff (4/4 envíos exitosos)
    • ✅ Verificación de 70+ offsets con IDA Pro
  • Bloqueo principal:

    "pselect no puede manipular la estructura del waiter — con NFDS >336 fd_set está en el heap; configfs/ashmem no soportados (SET_NAME de ashmem truncado); todas las demás rutas de escritura al kernel bloqueadas (/proc/self/mem, /dev/mem, binder)"

  • Relación con PD2229: Misma plataforma y misma generación (SM8475, 5.10.236 vs 5.10.233), solo 3 versiones menores de diferencia, enfrenta exactamente las mismas limitaciones arquitectónicas

harry1080/oppo-ghostlock — OPPO Find N2

  • Repositorio: https://github.com/harry1080/oppo-ghostlock
  • Dispositivo: OPPO Find N2 (CPH2413, SM8475)
  • Kernel: 5.10.236-android12-9-o-g74d132f4467a
  • Android: 16 (BP2A.250605.015)
  • Declaración pública de la comunidad:

    "En la versión explotable de pixel10, pselect stack_fds coincide exactamente con rt_waiter en la pila del kernel; esta parte es en realidad la más problemática. En el kernel del OPPO findN2, las pilas de estas dos llamadas no coinciden en absoluto, o si coinciden no es controlable; hay que encontrar otro método para controlar la pila, y se necesitan otras syscalls con pila del kernel controlable para construir la pila. Una simple adaptación de offsets es imposible que tenga éxito. El rt_waiter de oppo no coincide en absoluto con pselect stack_fds"

  • Relación con PD2229: Al igual que PD2229, es SM8475 5.10 GKI, la conclusión es totalmente aplicable

4.3 Tabla comparativa general de repositorios de referencia

RepositorioDispositivoSoCKernelMétodo de reciclaje de pilaEstadoReutilizable en PD2229
NebuSec/CyberMeowfiaPixel 10-6.xPR_SET_MM_MAP✅ 97%❌ Bloqueado por Android
JoinChang/ghostlock-oneplusOnePlus Ace 6TSM88456.12.38pselect (SP diff=-64)✅ Verificado❌ Generación de kernel incompatible
p2p3p/GhostLock-for-OnePlusOnePlus Ace 6TSM88456.12.38pselect✅ Verificado❌ Generación de kernel incompatible
YuKongA/ghostlock-oplusFind N5/X8-6.6.118pselect❌ Generación de kernel incompatible
Adaptación OPPO Find X6 ProFind X6 ProSM85505.15.149perf KASLR + ?🟡 KASLR ✅, resto no publicado❌ Plataforma diferente
pubglite55/oppo-ghostlockFind N2SM84755.10.236Enumeración fallida❌ Bloqueo principal⚠️ Misma plataforma y generación, mismo destino
harry1080/oppo-ghostlockFind N2SM84755.10.236Enumeración fallida❌ Arquitectónicamente inviable⚠️ Misma plataforma y generación, mismo destino
PD2229 (este informe)PD2229SM84755.10.233Los 17 candidatos fallaronArquitectónicamente inviable

5. Símbolos clave del kernel y offsets (medidos en vmlinux de PD2229)

Base estática 0xffffffc008000000, se debe añadir el slide de KASLR en tiempo de ejecución.

SímboloDirecciónPropósito
rt_mutex_start_proxy_lock0xffffffc00822baa8Entrada de disparo de la vulnerabilidad
futex_wait_requeue_pi0xffffffc0082d7df4Asignación del waiter, marco 0x1b0
__arm64_sys_futex0xffffffc0082dfe9cMarco 0x90
do_futex0xffffffc0082d0768Marco 0xc0
core_sys_select0xffffffc008634cf0Marco pselect 0x1c0
____sys_sendmsg0xffffffc0093eda88Marco 0x90
do_recvmmsg0xffffffc0093ef49cMarco 0x1d0
__arm64_sys_io_uring_register0xffffffc008aae328Marco 0x10+0x70
__io_uring_register0xffffffc008aae5f8Marco 0x80
inet6_protos0xffffffc00ab0a278Destino de escritura de la etapa 4
selinux_state0xffffffc00aee8c70Destino de desactivación de SELinux
init_task0xffffffc00ab0c240Fuente de lectura de cred

Estructura rt_mutex_waiter (personalizada de vivo 5.10.233)

struct rt_mutex_waiter {
    uint64_t private;           // +0x00  (campo privado de vivo)
    struct rb_node {
        uint64_t rb_parent_color; // +0x08
        uint64_t rb_right;        // +0x10  (vivo invierte el orden)
        uint64_t rb_left;         // +0x18
    } tree;
    struct task_struct *task;   // +0x20
    struct rt_mutex *lock;      // +0x28
};
// Tamaño total 0x30 (48 bytes)

6. Implementado vs pendiente de implementar

✅ Infraestructura implementada

  1. Bypass de KASLRperf_event_open + muestreo de callchain (mismo método que OPPO Find X6 Pro 5.15.149)
  2. Disparo de UAF — Deadlock PI de tres hilos, FUTEX_CMP_REQUEUE_PI devuelve -EDEADLK
  3. Tabla de símbolos completa — 103+ símbolos verificados con IDA (siguiendo la metodología de extracción 103/103 de JoinChang)
  4. Diseño de la estructura rt_mutex_waiter — offsets personalizados de vivo confirmados
  5. Análisis preciso del diseño de marcos de pila — cálculo de profundidad de rutas futex y pselect/io_uring completado
  6. Exclusión exhaustiva de 17 candidatos de reciclaje de pila — matriz completa de "inviabilidad" establecida

❌ No implementado (bloqueo principal)

  1. Primitiva de reciclaje de pila — el diseño de pila del compilador SM8475 5.10 GKI lo hace arquitectónicamente inutilizable
  2. Primitiva de escritura restringida — no se puede disparar rb_erase debido al fallo del reciclaje de pila
  3. Todas las etapas posteriores — bloqueo en cascada

7. Conclusión final

⚠️ GhostLock (CVE-2026-43499) no es explotable en PD2229 (vivo X Fold+, SM8475, 5.10.233 GKI, Android 15 OriginOS 5).

La causa raíz es el diseño de pila generado por el compilador SM8475 5.10 GKI (PGO+LTO+BOLT), que hace que los marcos de pila de todas las syscalls conocidas no se superpongan arquitectónicamente con rt_mutex_waiter. Este es un hecho objetivo determinado por el compilador, no un problema de técnica de explotación.

Todos los casos de explotación exitosa son en 6.6/6.12 GKI, porque la salida del compilador en estos kernels más nuevos hace que pselect fd_set se superponga perfectamente con el waiter (SP diff=-64). El 5.10 GKI no tiene esta condición.


Infraestructura establecida

  • ✅ Primitiva de bypass de KASLR (canal lateral perf_event_open)
  • ✅ 103+ símbolos del kernel y offsets
  • ✅ Diseño de la estructura rt_mutex_waiter
  • ✅ Capacidad de disparo de UAF
  • ✅ Matriz de exclusión de 17 candidatos de reciclaje de pila

9. Índice de repositorios de referencia

RepositorioURLValor clave
NebuSec/CyberMeowfiahttps://github.com/NebuSec/CyberMeowfiaFramework de explotación original, 97% de éxito
JoinChang/ghostlock-oneplushttps://github.com/JoinChang/ghostlock-oneplusAdaptación exitosa en 6.12 GKI, metodología de extracción de 103 offsets
p2p3p/GhostLock-for-OnePlushttps://github.com/p2p3p/GhostLock-for-OnePlusCadena de explotación completa en 6.12 GKI
YuKongA/ghostlock-oplushttps://github.com/YuKongA/ghostlock-oplusAdaptación OPPO en 6.6 GKI
pubglite55/oppo-ghostlockhttps://github.com/pubglite55/oppo-ghostlockReferencia de fallo en misma plataforma SM8475 5.10.236
harry1080/oppo-ghostlockhttps://github.com/harry1080/oppo-ghostlockReferencia de fallo en misma plataforma SM8475 5.10.236
Análisis técnico de NebuSechttps://nebusec.ai/research/ionstack-part-2/Detalles técnicos de la cadena original de GhostLock
Fix upstreamcommit 3bfdc63936ddCódigo de corrección

Categorías