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
CVE-2026-43499-S26 — Explota CVE-2026-43499 en dispositivos Android GKI 6.12: lectura/escritura arbitraria determinista del kernel, bypass de KASLR y root completo mediante payload LD_PRELOAD. | Kitploit
Herramientas/GitHubGitHub/1ndevelopment/cve-2026-43499-s26
Seguridad AndroidEscalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónPost-ExplotaciónDesarrollo de PayloadsExplotación de Binarios
GitHub1ndevelopment/cve-2026-43499-s26

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

CVE-2026-43499-S26

Explota CVE-2026-43499 en dispositivos Android GKI 6.12: lectura/escritura arbitraria determinista del kernel, bypass de KASLR y root completo mediante payload LD_PRELOAD.

Ver Repositorio
71hace 12h 48mAún no revisado

CVE-2026-43499 — Exploit de kernel para Android GKI 6.12 pselect / configfs

Un exploit de kernel Linux para la línea de Android GKI 6.12 (dispositivos Samsung y Pixel) que apunta a CVE-2026-43499: una reversión defectuosa en remove_waiter() dentro de rt_mutex_start_proxy_lock() que usa current en lugar de waiter::task, dejando el pi_blocked_on de un waiter apuntando a su rt_mutex_waiter de pila (que luego se extrae). Combinado con una sobrescritura de pila del fd_set de pselect() y un recorrido falso de rb_tree impulsado por Sched_setattr consumidor, produce una primitiva de escritura de kernel determinista y root completo.

El exploit se ejecuta como una biblioteca compartida LD_PRELOAD (preload.so) e instala un demonio su root y un wallpaper como artefactos post-root.

Estado: desarrollo activo. Los offsets de profundidad de pila por objetivo (PSELECT_* word shifts) y el comportamiento del slide varían según el dispositivo y todavía se están verificando en el hardware. El objetivo m1q (ZF1) es el foco actual del bring-up.

Primitiva vulnerable (CVE-2026-43499)

Cuando FUTEX_CMP_REQUEUE_PI reencola un waiter y el recorrido de la cadena de detección de interbloqueo del requeue devuelve -EDEADLK, __rt_mutex_start_proxy_lock() revierte mediante remove_waiter() (rtmutex.c:1535). La reversión desencola correctamente al waiter del árbol de espera, pero limpia el pi_blocked_on del llamador del requeue en lugar de waiter->task->pi_blocked_on. El pi_blocked_on del WAITER queda colgando en su rt_mutex_waiter de pila, que se extrae cuando el futex expira.

Después del tiempo de espera, la región de la pila del kernel del waiter se reutiliza: core_sys_select() copia los tres fd_sets en ese buffer de pila (la ruta de pila nfds < 344 en ZF1). Una matriz de palabras fd_set manipulada re-materializa un rt_mutex_waiter falso / task falso / rt_mutex falso (con una raíz rb_tree cuyos punteros están controlados). Un hilo consumidor llama entonces a sched_setattr_tid(waiter) → rt_mutex_adjust_pi() → rb_erase_cached, lo que produce una escritura de dirección arbitraria de un valor controlado.

Toda la primitiva requiere el ciclo de la cadena PI: el propietario mantiene f_pi_target y también se bloquea en f_pi_chain (retenido por el waiter), por lo que el recorrido de la cadena alcanza owner → chain → waiter → target → owner y falla con -EDEADLK. Eliminar el ciclo hace que el requeue devuelva éxito sin efecto en el kernel.

Cadena de explotación

  1. Slide (KASLR) — filtrar la base del kernel. Dos rutas:
    • tracefs sched_blocked_reason (principal en m1q): el PC de retorno guardado de un kworker bloqueado (stack_trace_save_tsk) se lee del ring buffer y se compara con el offset de worker_thread compilado.
    • Ruta pselect de boot_id (fallback, independiente del slide): una escritura pselect coloca SLIDE_LOGGERS_0_1 en los datos sysctl de boot_id mediante un alias de mapa lineal; el valor filtrado reconstruye stext.
  2. KernelSnitch — rociar objetos del tamaño de mm_struct y usar una colisión de hash de futex para localizar un mm_struct en el heap, filtrando una dirección de página del heap del kernel que se usa como base del rociado de objetos falsos.
  3. Ruta principal — la corrupción pselect escribe configfs_bin_write_iter en el slot write_iter (+0x30) de los file_operations de ashmem estáticos en .data. Abrir ashmem yield entonces lectura/escritura arbitraria del kernel a través de la ruta binaria de configfs.

Etapa 3 (puente pgd-swap, solo estático/build)

Fase opcional STAGE3=1 que bifurca un hijo puente, intercambia su mm->pgd con una tabla de páginas falsa escalonada (3 niveles: PGD→L1→L2, hoja de bucle RX + hoja de pila RW) y deja que el hijo ejecute un blob ensamblador solo de registros que parchea su propio cred a través de una ventana de escaneo físico de 2MB — R/W físico de toda la RAM sin las primitivas configfs/pipe. Actualmente está conectada solo al objetivo m1q y no se ha ejecutado en el dispositivo.

Objetivos compatibles

41 objetivos en src/targets/<codename>-<build>/, cada uno requiere como mínimo un target.h (offsets de símbolos del kernel, KIMAGE_TEXT_BASE, base del mapa directo, offsets de estructuras). Los objetivos Pixel (comet, tokay, tegu, caiman, komodo, frankel, mustang, rango, stallion, blazer) sobrescriben las fuentes compartidas; los objetivos Samsung (m1q-*) añaden lógica específica del dispositivo.

root@kitploit:~
make list-projects   # lista completa

Los diseños de las estructuras del kernel difieren según el dispositivo: los offsets deben verificarse contra el binario real del kernel / kallsyms para cada objetivo.

Compilación

Salida: build/<PROJECT>/bin/preload.so (biblioteca compartida cargada vía LD_PRELOAD).

root@kitploit:~
# Proyecto por defecto
CC=clang make

# Objetivo de dispositivo específico (por defecto: blazer-CP2A.260605.012)
CC=clang make PROJECT=m1q-BP4A.251205.006

# Sin CC=clang: usa NDK si se encuentra ($NDK_ROOT / $ANDROID_NDK_HOME /
# $ANDROID_NDK_ROOT); de lo contrario, clang del host + sysroot de Android
make PROJECT=m1q-BP4A.251205.006

# Mostrar configuración de compilación
make info

# Limpiar
make clean

La compilación embebe un binario PIE su_daemon (src/su_daemon.c, compilado en build/embed/su_daemon_aarch64_pie) y assets/wallpaper.webp en preload.so mediante src/su_blob.S / src/wallpaper_blob.S.

Ejecución en el dispositivo

Empuje los artefactos de compilación a /data/local/tmp y luego ejecute el exploit bajo LD_PRELOAD. Ejecute SIN tee en un objetivo de bring-up en vivo — tee almacena en búfer su propio stdio y pierde la cola del registro en un pánico del kernel (el stdout del exploit no tiene búfer, por lo que redirigir directamente a un archivo conserva cada línea):

root@kitploit:~
adb push build/m1q-BP4A.251205.006/bin/preload.so /data/local/tmp/preload.so
adb push build/embed/su_daemon_aarch64_pie /data/local/tmp/su_daemon_aarch64_pie
adb shell "chmod 755 /data/local/tmp/preload.so /data/local/tmp/su_daemon_aarch64_pie"

adb shell "LD_PRELOAD=/data/local/tmp/preload.so \
  /data/local/tmp/su_daemon_aarch64_pie \
  > /data/local/tmp/output.log 2>&1"

En caso de éxito, el demonio escucha en /data/local/tmp/temp_su.sock y su se instala en /apex/com.android.virt/bin.

Configuración en tiempo de ejecución (variables de entorno)

Estructura del proyecto

root@kitploit:~
exploit/
  Makefile
  assets/                     # wallpaper.webp (artefacto post-root embebido)
  src/
    main.c                    # punto de entrada run_exploit() (compartido)
    preload.c                 # constructor LD_PRELOAD, instalación de su/wallpaper
    util.c                    # traducción de direcciones, preparación de páginas, helpers de configfs
    pipe.c                    # lectura/escritura física basada en pipes
    root.c                    # parcheo de cred / recorrido de tareas
    slide.c                   # slide de KASLR (rutas tracefs + boot_id)
    fops.c                    # corrupción pselect + manipulación de fops
    faketables.c              # constructores de tablas de páginas falsas de etapa 3 (3 niveles)
    stage3.c                  # hijo puente pgd-swap (no-op salvo que se configure)
    stage3_loop.S, stage3_poll.S  # blob puente + trampolín de entrada
    su_daemon.c               # demonio root (compilado como PIE separado)
    su_blob.S, wallpaper_blob.S   # binarios embebidos
    offset.h                  # extrae target.h por objetivo vía -DTARGET_CONFIG_H
    kernelsnitch/             # biblioteca de fuga de futex-hash de mm_struct
    targets/<codename>-<build>/    # target.h por dispositivo + sobrescrituras opcionales
poc/poc.c                     # POC independiente (separado del exploit)

Los objetivos sobrescriben las fuentes compartidas mediante el mecanismo pick_src del Makefile: si existe src/targets/<PROJECT>/<file>.c, se usa en lugar de src/<file>.c compartido; de lo contrario, se usa la versión compartida.

Notas y trampas

  • Nunca elimine el ciclo de la cadena PI. La primitiva de escritura depende de que el requeue falle con -EDEADLK (errno 35). Un ciclo faltante aparece como success=1 sin efecto en el kernel.
  • El waiter debe mantener el bloqueo de la cadena PI a lo largo de pselect. Liberarlo primero permite que el propietario se despierte y corra contra el recorrido falso del rb_tree → pánico.
  • m1q: PSELECT_WAITER_WORD_SHIFT debe ser 0 (profundidades de pila ZF1 verificadas desde ELF). Otros objetivos todavía usan 1 por defecto: verifique por dispositivo antes de confiar en ellos.
  • p0_data_alias() usa DIRECT_MAP_BASE (el mapa lineal), que difiere de P0_PAGE_OFFSET en ZF1. Los alias de datos para objetos del kernel dereferenciados deben usar el mapa lineal.
  • pr_error() es fatal (exit(-1)), a diferencia de las macros de advertencia/info.
  • La reconstrucción del slide usa SLIDE_LOGGERS_0_1, no SLIDE_NFULNL_LOGGER; la palabra es un alias de mapa lineal no aleatorizado, por lo que la ruta boot_id es independiente del slide (úsela solo en slide=0 — ejecute primero la fuga de tracefs).

Descargo de responsabilidad

Este es código de exploit para dispositivos Android y está destinado a investigación de seguridad, pruebas de vulnerabilidad autorizadas y trabajo defensivo en hardware que usted posee o para el que tiene permiso explícito para probar. El uso indebido en dispositivos que no le pertenecen es ilegal. El autor no es responsable de dispositivos brickeados, kernels brickeados ni garantías anuladas.

Descargar herramienta
  • Pipe physrw — forjar páginas de buffer de pipe en la página del kernel rociada para lectura/escritura física: parcheo de cred, desactivación de SELinux y manipulación directa de la memoria del kernel.
  • Root — parchear el cred del hijo root (uid/gid/caps/SID de SELinux) y luego preload.c instala el demonio su embebido (montado en tmpfs en /apex/com.android.virt/bin, además de variantes en el namespace de adbd y local) y cambia el wallpaper.
  • VariablePredeterminadoPropósito
    PSELECT_ROUTE_SHIFTtiempo de compilaciónDesplazamiento de palabras fd_set A/B para la ruta principal (m1q)
    SLIDE_SHIFTtiempo de compilaciónDesplazamiento de palabras fd_set A/B para la ruta del slide
    PSELECT_ROUTE_DELAY_USEC50000Retardo del consumidor antes de sched_setattr (debe ser > 0)
    SLIDE_CONSUME_USEC, SLIDE_ENTER_DELAY_USEC, SLIDE_CONSUMER_CORE—Temporización/afinidad de la ruta del slide
    SKIP_SLIDE0Usar el fallback de mapa directo (slide = 0)
    SLIDE_ONLY0Ejecutar solo el slide de KASLR y salir
    SLIDE_P0_OFFSET, SLIDE_BOOTID_OFF—Sobrescribir offsets de alias p0 / boot_id del slide
    KSNITCH_COLLISIONS4Número de colisiones de KernelSnitch
    STAGE30Habilitar la fase del hijo puente pgd-swap (m1q)
    STAGE3_DRYRUN0Preparar/verificar tablas y luego abortar antes del intercambio
    PAGE_RECLAIM_SENDS, PSELECT_SIMPLE_LAYOUT—Ajustes de rociado/diseño de fd_set
    TMP_PAGE_* / TMP_UNAME_*—Ruta experimental tmp_page (m1q)