
Prueba de concepto para CVE-2026-43494 (PinTheft): escalada de privilegios local en Linux mediante el error de recuento de referencias de zerocopy de RDS + búferes fijos de io_uring → sobrescritura de caché de página SUID. Solo para investigación autorizada.
Prueba de concepto — uid=1000(raken) → uid=0(root) después de ./sley en WSL2 (6.6.87.2-microsoft-standard-WSL2)
Prueba de concepto en un solo archivo para CVE-2026-43494 (PinTheft): una escalada de privilegios local del kernel de Linux que encadena un error de conteo de referencias en RDS zerocopy con búferes fijos de io_uring para sobrescribir la caché de páginas de un binario SUID-root.
Aviso legal: Este repositorio es solo para investigación de seguridad autorizada, educación y pruebas defensivas. Ejecutar esto contra sistemas que no posee o para los cuales no tiene permiso explícito para probar es ilegal y poco ético. Los autores no asumen ninguna responsabilidad por su uso indebido.
La investigación pública original y el PoC fueron publicados por el equipo de V12 Security (Aaron Esau). SLEY es una reimplementación independiente y compacta con una interfaz de terminal estilizada para uso en laboratorio y aprendizaje.
flowchart LR
A[mmap anonymous page] --> B[io_uring: register fixed buffer]
B --> C[Clone buffer table to 2nd ring]
C --> D[1024× failing RDS zerocopy sends]
D --> E[Drain FOLL_PIN bias / steal refs]
E --> F[munmap → page freed]
F --> G[SUID binary page reclaimed in page cache]
G --> H[Stale io_uring ptr writes ELF stub]
H --> I[exec SUID → root shell]su, mount, passwd, …).FOLL_PIN ≈ 1024).munmap libera la página; reabrir el objetivo SUID compite con la reclamación de la caché de páginas; los metadatos obsoletos del búfer fijo permiten escribir un pequeño stub ELF x86_64 en la caché.execve el binario SUID ejecuta el stub inyectado como root.CONFIG_RDS=y y CONFIG_RDS_TCP=yCONFIG_IO_URING=y y kernel.io_uring_disabled = 0rds / rds_tcp cargados (o autocargables por usuarios sin privilegios)IORING_REGISTER_CLONE_BUFFERS usada por la cadena públicasudo apt install build-essential linux-libc-dev # Debian/Ubuntu
# o el paquete de cabeceras equivalente en su distribución
# ¿Parcheado? (ejemplo — ajuste para su distribución)
uname -r
grep -r CVE-2026-43494 /usr/share/doc/linux* 2>/dev/null || true
# ¿RDS disponible?
grep CONFIG_RDS /boot/config-$(uname -r) 2>/dev/null
lsmod | grep -E '^rds'
# ¿io_uring habilitado?
cat /proc/sys/kernel/io_uring_disabled # esperar 0
gcc -O2 -Wall -Wextra -o sley sley.c
Enlace estático (opcional, para imágenes de laboratorio mínimas):
gcc -O2 -static -o sley sley.c
./sley
Toda la salida de estado va a stderr (interfaz ANSI de 256 colores, barra de progreso, registro por fases). Asegúrese de que su terminal soporte UTF-8 y truecolor/256 colores para la interfaz de dibujo de cuadros.
Fases de ejemplo:
PHASE 1 │ Reconnaissance
PHASE 2 │ Memory & io_uring setup
PHASE 3 │ Pin reference theft (RDS zerocopy)
PHASE 4 │ Page cache overwrite & privesc
En una configuración explotada con éxito, la cadena se completa y entrega el control al binario SUID descubierto con la primera página sobrescrita — produciendo un shell de root si la carrera y el estado del kernel se alinean.
En kernels parcheados, hosts reforzados o falta de RDS/io_uring, el PoC fallará temprano (sin objetivo SUID, errores de mmap/io_uring/socket, etc.).
Los avisos de seguridad específicos de la distribución pueden incluir parches retroportados — siga la cola de seguridad del kernel de su proveedor.
.
├── README.md # Este archivo
├── proof-of-concept.jpg # Captura: LPE exitosa (uid 1000 → root)
├── sley.c # PoC en un solo archivo + interfaz de terminal
└── .gitignore
Este software se proporciona tal cual para investigación y educación. Usted es responsable de cumplir con las leyes aplicables y obtener autorización por escrito antes de probar cualquier sistema que no posea.
MIT — consulte el archivo de licencia del repositorio si se añade. Úselo responsablemente.
| Elemento | Detalle |
|---|
| CVE | CVE-2026-43494 |
| Nombre público | PinTheft |
| Componente | net/rds — ruta de envío zerocopy (rds_message_zcopy_from_user) |
| Primitiva | Doble put_page() cuando falla el pinning de página → robar referencias FOLL_PIN |
| Armamento | Búfer fijo de io_uring + RDS zerocopy fallido → escritura UAF en caché de páginas |
| Impacto | Root local en configuraciones vulnerables |
| Corrección oficial | e17492979319 |
| Acción | Notas |
|---|
| Parchear el kernel | Aplicar la corrección estable que contiene el commit e17492979319 |
| Deshabilitar RDS | modprobe -r rds_tcp rds (y bloquear la carga automática) si no es necesario |
| Restringir io_uring | kernel.io_uring_disabled=1 o 2 mediante sysctl |
| Mínimo privilegio | Eliminar binarios SUID innecesarios; usar contenedores con perfiles reforzados |
| Monitorear | Alertar sobre ráfagas de fallos de zerocopy de RDS + patrones de registro de búferes io_uring |