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
copy_fail — Exploit PoC en Rust para LPE del kernel de Linux CVE-2026-31431 (escritura en page-cache de AF_ALG) más defensa en tiempo de ejecución con eBPF que bloquea la creación de sockets AF_ALG mediante LSM o kprobe sin reiniciar. | Kitploit
Herramientas/GitHubGitHub/spensercai/copy_fail
Herramientas DefensivasEscalada de PrivilegiosFrameworks de ExploitsAnálisis de VulnerabilidadesExplotaciónVirtualización de SeguridadExplotación de Binarios
GitHubspensercai/copy_fail

copy_fail

Exploit PoC en Rust para LPE del kernel de Linux CVE-2026-31431 (escritura en page-cache de AF_ALG) más defensa en tiempo de ejecución con eBPF que bloquea la creación de sockets AF_ALG mediante LSM o kprobe sin reiniciar.

Ver Repositorio
3hace 3 mesesAún no revisado

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 →
Sitio web
Compartir

Copy Fail — CVE-2026-31431

CVE-2026-31431 (Copy Fail) es una vulnerabilidad de escalada de privilegios local en el módulo algif_aead del kernel de Linux (subsistema AF_ALG). Un fallo lógico introducido en agosto de 2017 permite a cualquier usuario local sin privilegios escribir 4 bytes controlados en la caché de páginas de cualquier archivo legible mediante AF_ALG + splice(), y luego ejecutar un binario setuid corrupto para obtener acceso root. El exploit es determinista: sin condiciones de carrera, sin offsets del kernel, sin bloqueos del sistema. Afecta a todas las principales distribuciones de Linux con kernels desde 4.14 hasta 7.0-rc.

CVSS: 7.8 | Corregido en: kernel 7.0, 6.19.12, 6.18.22 | Corrección en mainline: commit a664bf3d603d

Fuentes: copy.fail, The Hacker News, Aviso de CloudLinux

Estructura del proyecto

root@kitploit:~
crates/
├── exp/                            # Exploit PoC (reimplementación en Rust)
├── copy_fail_guard/                # Cargador eBPF en espacio de usuario — modo LSM
├── copy_fail_guard-ebpf/           # Programa eBPF LSM (fuera del workspace)
├── copy_fail_guard_kprobe/         # Cargador eBPF en espacio de usuario — modo kprobe
└── copy_fail_guard_kprobe-ebpf/    # Programa eBPF kprobe (fuera del workspace)
scripts/
└── build_guard.sh                  # Compilación con un clic → salida en dist/

Resumen de la vulnerabilidad

La causa raíz es una cadena de tres características independientes del kernel que interactúan de forma insegura:

  1. Socket AF_ALG — expone la API criptográfica del kernel al espacio de usuario sin privilegios
  2. splice() — transfiere datos de archivos con copia cero como referencias a la caché de páginas (no copias) hacia el scatterlist criptográfico
  3. Plantilla AEAD authencesn — usa el buffer de salida del llamador como espacio temporal, escribiendo 4 bytes en dst[assoclen + cryptlen]

En 2017, una optimización in-place en algif_aead.c (72548b093ee3) hizo que req->src == req->dst, encadenando páginas de la caché de páginas en el scatterlist de destino escribible. Cuando authencesn escribe sus bytes temporales, sobrepasa el buffer de salida hacia las páginas encadenadas de la caché de páginas. El atacante controla:

  • Qué archivo: cualquier archivo legible por el usuario actual
  • Qué offset: determinado por el offset de splice, la longitud de splice y assoclen
  • Qué 4 bytes: provienen de los bytes 4–7 de AAD (seqno_lo), establecidos en sendmsg()

La página corrupta nunca se marca como sucia: el archivo en disco no se toca, pero execve() lee desde la caché de páginas. Corrompe un binario setuid → root.

crates/exp — Exploit PoC

Reimplementación en Rust del PoC público de 732 bytes en Python. Apunta a /usr/bin/su, hace splice de sus páginas de caché hacia un socket AEAD AF_ALG y las sobrescribe con una carga útil de shell comprimida.

Compilación

Requiere Rust 1.85+ (edición 2024).

root@kitploit:~
cargo build --release -p copy_fail

El binario es solo para Linux. En otras plataformas sale con un error Unsupported.

Ejecución

Advertencia: Esto explota una falla real del kernel. Ejecútalo solo en sistemas que poseas y controles, idealmente una VM desechable.

  1. Inicia una VM con un kernel vulnerable (cualquier distribución convencional con kernel < 7.0 / < 6.19.12 / < 6.18.22).

  2. Copia el binario compilado a la VM y ejecútalo como usuario sin privilegios:

    root@kitploit:~
    ./target/release/copy_fail
    
  3. Vulnerable: aparece un shell root (#). Ejecuta whoami para confirmar root.

  4. No vulnerable (kernel parcheado): la operación AF_ALG falla o el binario su se comporta con normalidad. Verás un error o un prompt normal de contraseña de su.

Herramienta de defensa — copy_fail_guard

Una defensa del kernel en tiempo de ejecución que bloquea CVE-2026-31431 sin actualizar el kernel ni reiniciar. Usa eBPF para interceptar la creación de sockets AF_ALG, cortando el primer paso del exploit.

Se proporcionan dos modos. El cargador con un clic selecciona automáticamente el mejor modo disponible:

Modo LSMModo kprobe
Cómo bloqueaDevuelve -EPERM (creación de socket denegada)SIGKILL (proceso eliminado)
Requisito del kernel≥ 5.7 con parámetro de arranque lsm=bpf≥ 5.3, sin parámetros especiales
Requiere reinicio para activarQuizás (si lsm=bpf no está configurado)No
Punto de engancheHook LSM socket_createkprobe __sys_socket

Cómo funciona

root@kitploit:~
┌──────────────────────────────────────────────────┐
│  run_guard.sh                                    │
│  • Detecta soporte BPF LSM                       │
│  • LSM disponible  → copy_fail_guard (EPERM)     │
│  • LSM no disponible → copy_fail_guard_kprobe (KILL)│
└──────────────┬───────────────────────────────────┘
               │
┌──────────────▼───────────────────────────────────┐
│  Programa eBPF                                   │
│  si familia de socket == 38 (AF_ALG)             │
│     → bloquear (EPERM o SIGKILL)                 │
│  si no                                           │
│     → permitir                                   │
└──────────────────────────────────────────────────┘

Impacto en el sistema

Bloquear AF_ALG tiene un impacto casi nulo en sistemas típicos:

  • No afectados: dm-crypt/LUKS, kTLS, IPsec/XFRM, OpenSSL/GnuTLS/NSS (compilaciones predeterminadas), SSH, criptografía del keyring del kernel — estos usan la API criptográfica del kernel directamente, no a través de AF_ALG
  • Potencialmente afectados: aplicaciones configuradas explícitamente para usar AF_ALG (p. ej., OpenSSL con el motor afalg habilitado, algunas rutas de descarga criptográfica embebida)
  • Rendimiento: cero sobrecarga para cualquier cosa que no llame a socket(AF_ALG, ...)

Compilación

Compilación con un clic (recomendada):

root@kitploit:~
./scripts/build_guard.sh

Esto instala automáticamente las toolchains faltantes (nightly, bpf-linker), compila todos los programas eBPF y los cargadores de espacio de usuario, y genera todo en dist/:

root@kitploit:~
dist/
├── copy_fail_guard.bpf.o          # Programa eBPF LSM
├── copy_fail_guard_kprobe.bpf.o   # Programa eBPF kprobe
├── copy_fail_guard                 # Cargador de espacio de usuario (LSM)
├── copy_fail_guard_kprobe          # Cargador de espacio de usuario (kprobe)
└── run_guard.sh                    # Auto-selección: sudo ./run_guard.sh

Copia el directorio dist/ a cualquier máquina de destino y ejecuta sudo ./run_guard.sh para activar la protección.

Compilación manual (paso a paso):

Paso 1: Compilar los programas eBPF (debe hacerse en Linux):

root@kitploit:~
# Variante LSM
cd crates/copy_fail_guard-ebpf
cargo +nightly build --target bpfel-unknown-none -Z build-std=core --release

# Variante kprobe
cd crates/copy_fail_guard_kprobe-ebpf
cargo +nightly build --target bpfel-unknown-none -Z build-std=core --release

Paso 2: Compilar los cargadores de espacio de usuario:

root@kitploit:~
cargo build --release -p copy_fail_guard -p copy_fail_guard_kprobe

Ejecución

Recomendado — selecciona automáticamente el mejor modo:

root@kitploit:~
sudo ./dist/run_guard.sh

Manual — ejecuta un modo específico:

root@kitploit:~
# Modo LSM (requiere lsm=bpf)
sudo GUARD_BPF_OBJ=ruta/al/copy_fail_guard.bpf.o RUST_LOG=info ./copy_fail_guard

# Modo kprobe (funciona en todas partes)
sudo GUARD_BPF_OBJ=ruta/al/copy_fail_guard_kprobe.bpf.o RUST_LOG=info ./copy_fail_guard_kprobe

Pulsa Ctrl-C para desacoplar el programa eBPF y restaurar el comportamiento normal.

Verificación de la defensa

Con el guard ejecutándose en una terminal:

root@kitploit:~
# En otra terminal, intenta el exploit:
./target/release/copy_fail
# Modo LSM:   "error: Operation not permitted"
# Modo kprobe: "已杀死" / "Killed"

# O prueba directamente con Python:
python3 -c "import socket; socket.socket(38, 5, 0)"
# Modo LSM:   PermissionError: [Errno 1] Operation not permitted
# Modo kprobe: Killed

Limitaciones actuales

  • Sin soporte de listas blancas aún — la versión actual bloquea TODA creación de sockets AF_ALG de espacio de usuario de forma incondicional. No hay mecanismo para eximir procesos específicos por PID, cgroup o nombre de comando. Esto está planificado para una versión futura (mediante mapas HashMap de eBPF). Para la gran mayoría de sistemas esto es aceptable, ya que casi nada usa AF_ALG.
  • Los crates eBPF deben compilarse por separado en Linux con bpf-linker (apuntan a bpfel-unknown-none y no pueden ser miembros normales del workspace).
  • La protección está activa solo mientras el proceso del cargador esté en ejecución. Para protección persistente, ejecútalo como un servicio systemd.

Habilitación de BPF LSM (opcional, para modo LSM)

La mayoría de las distribuciones no habilitan BPF LSM de forma predeterminada. Si deseas el modo LSM más limpio (EPERM en lugar de SIGKILL):

root@kitploit:~
# Verifica los LSM actuales:
cat /sys/kernel/security/lsm

# Si falta "bpf", agrégalo:
sudo sed -i 's/^GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="\1 lsm=lockdown,capability,yama,apparmor,bpf"/' /etc/default/grub
sudo update-grub && sudo reboot

El modo kprobe funciona sin este paso.

Verificación de la corrección del kernel

Después de parchear el kernel a ≥ 7.0 / ≥ 6.19.12 / ≥ 6.18.22:

root@kitploit:~
# Confirma la versión del kernel
uname -r

# Vuelve a ejecutar el exploit — ya no debería producir un shell root
./target/release/copy_fail

Alternativamente, confirma que el módulo vulnerable está neutralizado:

root@kitploit:~
modinfo algif_aead | grep filename

# Si está integrado, bloquea el initcall (requiere reinicio)
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
sudo reboot
Descargar herramienta