the_open_door
café
ESEN
← Volver al índice

Secret leakage via print jobs

Cuando se imprime un documento, el sistema de impresión no envía el fichero "tal cual": lo renderiza a un formato intermedio (normalmente PostScript o PDF) y lo guarda temporalmente en una cola de impresión (spool) mientras espera turno. En CUPS ese directorio es /var/spool/cups. Si el documento contenía información sensible (una contraseña, una clave, datos personales), esa información queda escrita en claro dentro del trabajo guardado.

Por qué es accesible. El usuario que gestiona la cola de impresión (en muchos sistemas, lp) tiene acceso a esos ficheros. Aunque el directorio no sea listable (ls puede devolver Permission denied), CUPS nombra cada trabajo de forma predecible: un fichero de control c<NNNNN> y un fichero de datos d<NNNNN>-<NNN> (una d, cinco dígitos, un guion y tres dígitos). El primer trabajo es d00001-001, el segundo d00002-001, etc. Así que, aun sin poder listar, se puede leer un trabajo concreto por su nombre:

cd /var/spool/cups
ls                    # Permission denied: no podemos listar el directorio...
cat d00001-001        # ...pero sí leer un trabajo por su nombre predecible

Qué se busca dentro. El fichero es PostScript/PDF: las cadenas de texto que se dibujan en la página aparecen como literales (en PostScript, dentro de paréntesis: (texto) show). Basta con leerlo hasta el final o filtrar por cadenas para encontrar contraseñas u otros secretos que se imprimieron:

strings d00001-001 | grep -iE 'pass|pwd|secret'

Una vez recuperada una contraseña, el siguiente paso suele ser tan simple como un su al usuario al que pertenece (en EvilCups, root directamente). Es una variante de reutilización de credenciales: el secreto no se obtiene con un exploit, sino leyendo un artefacto que el sistema dejó atrás.

Cómo detectarlo. La firma es la lectura de ficheros de /var/spool/cups (c*/d*) por un proceso o usuario que no es cupsd/lp: auditd -w /var/spool/cups -p r registra ese acceso, y un strings/grep sobre esos ficheros de spool es antinatural. En reposo, un CUPS con PreserveJobFiles Yes acumulando trabajos completados es la exposición a auditar; el su posterior con una contraseña extraída del spool cierra la cadena (login inusual en /var/log/auth.log).

Defensa. No imprimir documentos con secretos en claro. Configurar CUPS para purgar los trabajos completados (PreserveJobFiles No, PreserveJobHistory) en lugar de conservarlos indefinidamente, y restringir el acceso al spool. En general, recordar que colas, spools, ficheros temporales y cachés conservan datos mucho después de que el usuario crea que han desaparecido: revisarlos es parte de la post-explotación. En EvilCups esta fuga fue la vía a root tras el RCE de la cadena de CUPS.

Máquinas donde se aplica