CVE-2026-34990 - CUPS LPE


Objetivo: CUPS <= 2.4.16
Tipo: Local Privilege Escalation
S.O.: Linux
Tecnología: Python

Análisis del CVE

Vulnerabilidad Explotada

Esta vulnerabilidad representa una escalada de privilegios local (LPE) en el servicio CUPS (Common UNIX Printing System). La explotación se logra encadenando dos debilidades de diseño en el manejo del protocolo IPP (Internet Printing Protocol):

Fuga de Credenciales (Token Leak / Coercion)

El atacante puede abusar de la operación CUPS-Create-Local-Printer para obligar al demonio cupsd a conectarse a un servidor IPP malicioso. Al forzar un desafío de autenticación (401 Unauthorized con WWW-Authenticate: Local), cupsd filtra un token de autorización local de altos privilegios.

Escritura Arbitraria de Archivos (Abuso de file://)

Utilizando el token capturado, el atacante tiene permisos suficientes para registrar una nueva impresora utilizando el esquema file:// en su directiva device-uri. Esto permite redirigir el “trabajo de impresión” hacia rutas críticas y protegidas del sistema operativo.

Impacto

Crítico (Local): Un usuario local con privilegios mínimos (como www-data o un usuario estándar) puede escalar sus privilegios a root sin necesidad de interacción por parte del administrador.

Al poder escribir archivos arbitrarios en directorios sensibles del sistema (como /etc/sudoers.d/ o /etc/cron.d/), el compromiso del host es total.


Uso

Ejecuta el script de exploit contra el entorno local:

python3 CVE-2026-34990.py

Resultado esperado

[*] CVE-2026-34990 | user=labuser | cupsd=127.0.0.1:631
[*] coercing cupsd → rogue server ...
[+] captured token: D9F5BF7529096C824392C6BFF8108645
[*] writing sudoers ...
[+] wrote /etc/sudoers.d/labuser-pwn
[+] ROOT: uid=0(root) gid=0(root) groups=0(root)
[*] run: sudo -i

Una vez ejecutado, genera tu shell interactivo como root:

sudo -i


PoC

AVISO DE RESPONSABILIDAD

Este script está destinado únicamente a fines educativos y de investigación. Gixploit no se hace responsable de ningún mal uso o daño causado por este exploit.

¡Siempre asegúrate de tener permiso antes de probar o explotar vulnerabilidades!

Explicación del código

El script en Python automatiza la cadena de explotación en tres fases principales utilizando peticiones IPP construidas a nivel de bytes (struct.pack):

Captura del token de autenticación

El proceso comienza desplegando un servidor IPP falso (rogue server) en un puerto local (por ejemplo, el 9189). Cuando recibe conexiones entrantes, responde con un estado HTTP 401 Unauthorized solicitando autenticación local.

Esta respuesta fuerza al demonio cupsd a reenviar la petición original incluyendo su token de sesión administrativo en la cabecera Authorization.

Coacción e inducción al filtrado de tokens

Para desencadenar la conexión hacia el servidor falso, el script transmite una petición CUPS-Create-Local-Printer al puerto legítimo de CUPS (puerto 631). En los parámetros de la solicitud, se configura el atributo device-uri apuntando al servicio controlado por el atacante (ipp://127.0.0.1:9189/ipp/print).

Esto obliga al demonio cupsd (que se ejecuta con permisos elevados de root) a iniciar una conexión saliente, filtrando así el token de autenticación durante el saludo de red.

Escritura arbitraria mediante el esquema file://

Una vez obtenido el token, se realizan peticiones administrativas autenticadas mediante CUPS-Add-Modify-Printer para registrar una cola de impresión persistente cuyo destino especificado en device-uri es la ruta file:///etc/sudoers.d/<usuario>-pwn. A continuación, se habilita la impresora y se envía un trabajo en formato raw (Print-Job) cuyo contenido es la regla <usuario> ALL=(ALL) NOPASSWD: ALL.

Al procesar la cola, cupsd escribe el archivo directamente en el sistema de archivos con permisos de superusuario, permitiendo la ejecución de comandos con sudo sin contraseña.