
Prueba de concepto para CVE-2026-43494 (PinTheft): escalada de privilegios local del kernel de Linux que explota un error de conteo de referencias de zerocopy de RDS con búferes fijos de io_uring para sobrescribir la caché de páginas del binario SUID.
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: Este repositorio es solo para investigación de seguridad autorizada, educación y pruebas defensivas. Ejecutar esto contra sistemas que no posee o carece de permiso explícito para probar es ilegal y poco ético. Los autores no asumen ninguna responsabilidad por el mal uso.
La investigación pública original y el PoC fueron publicados por el equipo 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).execve del 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 no privilegiados)IORING_REGISTER_CLONE_BUFFERS utilizada por la cadena públicasudo apt install build-essential linux-libc-dev # Debian/Ubuntu
# or equivalent headers package on your distro
# Patched? (example — adjust for your distro)
uname -r
grep -r CVE-2026-43494 /usr/share/doc/linux* 2>/dev/null || true
# RDS available?
grep CONFIG_RDS /boot/config-$(uname -r) 2>/dev/null
lsmod | grep -E '^rds'
# io_uring enabled?
cat /proc/sys/kernel/io_uring_disabled # expect 0
gcc -O2 -Wall -Wextra -o sley sley.c
Static linking (optional, for minimal lab images):
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 recuadros.
Ejemplo de fases:
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, lo que produce un shell root si la condición de carrera y el estado del kernel se alinean.
En kernels parcheados, hosts endurecidos o si falta 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 backporteados: siga la cola de seguridad del kernel de su proveedor.
.
├── README.md # This file
├── proof-of-concept.jpg # Screenshot: successful LPE (uid 1000 → root)
├── sley.c # Single-file PoC + terminal UI
└── .gitignore
Este software se proporciona tal cual para investigación y educación. Usted es responsable de cumplir con las leyes aplicables y de obtener autorización por escrito antes de probar cualquier sistema que no posea.
MIT — consulte el archivo de licencia del repositorio si se agregó. Úselo de manera responsable.
| 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 pin de página → robar referencias FOLL_PIN |
| Armado | búfer fijo de io_uring + zerocopy fallido de RDS → escritura UAF en page cache |
| Impacto | Root local en configuraciones vulnerables |
| Corrección upstream | e17492979319 |
| Acción | Notas |
|---|
| Parchear kernel | Aplicar corrección estable que contenga el commit e17492979319 |
| Deshabilitar RDS | modprobe -r rds_tcp rds (y bloquear carga automática) si no es necesario |
| Restringir io_uring | kernel.io_uring_disabled=1 o 2 vía sysctl |
| Mínimo privilegio | Eliminar binarios SUID innecesarios; usar contenedores con perfiles endurecidos |
| Monitorear | Alertar sobre ráfagas de fallos de zerocopy de RDS + patrones de registro de búferes io_uring |