
PoC en Rust para una vulnerabilidad de escalada local de privilegios en el kernel de Linux, que explota la Crypto API y splice para sobrescribir la caché de páginas y modificar el UID en /etc/passwd para obtener acceso root.
Este proyecto es una Prueba de Concepto (PoC) implementada en Rust para una vulnerabilidad de escalada local de privilegios (LPE) (simulando CVE-2026-31431). Demuestra cómo manipular la caché de páginas del kernel de Linux explotando la Crypto API.[cite: 1, 2]
[!CAUTION] Este código es únicamente para fines educativos y de investigación ética en seguridad. El uso no autorizado de esta herramienta contra sistemas sin consentimiento previo explícito es ilegal. El autor no asume ninguna responsabilidad por el mal uso o los daños causados por este programa.
La herramienta explota una vulnerabilidad relacionada con AF_ALG (interfaz criptográfica del kernel) y la llamada al sistema splice.[cite: 2] Permite a un usuario sin privilegios sobrescribir 4 bytes de la caché de páginas de un archivo de solo lectura, apuntando específicamente al campo UID en /etc/passwd para cambiarlo temporalmente a 0000 (root).[cite: 1, 2]
main.rs para encontrar el desplazamiento exacto del archivo donde se encuentra el UID del usuario actual dentro de /etc/passwd.[cite: 1, 2]AF_ALG con el algoritmo authesn(hmac(sha256),cbc(aes)).[cite: 2]setsockopt y usar splice, redirige los datos del archivo a través de la canalización criptográfica.[cite: 2]0000).[cite: 2]--shell, ejecuta su <usuario>, que tiene éxito porque el sistema ahora ve el UID del usuario como 0 en el /etc/passwd almacenado en caché.[cite: 1]POSIX_FADV_DONTNEED para restaurar la integridad del sistema.[cite: 1]libc y nix (con las características fs, socket, zerocopy y user).[cite: 3]cargo build --release
Probar el parcheo de la caché de páginas sin abrir un shell:
./target/release/cve-2026-31431
Intentar escalar a un shell root:
./target/release/cve-2026-31431 --shell
main.rs: Orquesta el ataque, maneja los argumentos de la línea de comandos y ejecuta el comando final del shell.[cite: 1]modules.rs: Contiene la lógica principal de explotación, incluida la manipulación del socket AF_ALG y la búsqueda del desplazamiento del UID.[cite: 2]Cargo.toml: Define los metadatos del proyecto y las dependencias de crates externas.[cite: 3]main.rs, modules.rs, Cargo.toml[cite: 1, 2, 3]socket, bind, sendmsg, splice, posix_fadvise.[cite: 1, 2]