Logotipo de Zephyrnet

El error de Ghostscript podría permitir que los documentos no autorizados ejecuten comandos del sistema

Fecha:

Incluso si no has oído hablar del venerable Ghostscript proyecto, es muy posible que lo hayas usado sin saberlo.

Alternativamente, puede tenerlo integrado en un servicio en la nube que ofrezca, o tenerlo preinstalado y listo para usar si usa un servicio de software basado en paquetes, como una distribución BSD o Linux, Homebrew en una Mac o Chocolatey en Windows.

Ghostscript es una implementación gratuita y de código abierto del ampliamente utilizado sistema de composición de documentos PostScript de Adobe y su formato de archivo PDF aún más utilizado, abreviatura de Formato de Documento Portátil. (Internamente, los archivos PDF se basan en el código PostScript para definir cómo componer un documento).

Por ejemplo, el popular programa de gráficos de código abierto Inkscape utiliza Ghostscript en segundo plano para importar archivos EPS (Postscript incrustado) archivos de gráficos vectoriales, como los que puede descargar de una biblioteca de imágenes o recibir de una empresa de diseño.

En pocas palabras, Ghostscript lee el código de programa PostScript (o EPS, o PDF), que describe cómo construir las páginas de un documento y lo convierte, o renders (para usar la palabra de la jerga), en un formato más adecuado para mostrar o imprimir, como datos de píxeles sin procesar o un archivo de gráficos PNG.

Desafortunadamente, hasta la última versión de Ghostscript, ahora en la versión 10.01.2, el producto tenía un error, denominado CVE-2023-36664, que podría permitir que los documentos no autorizados no solo creen páginas de texto y gráficos, sino que también envíen comandos del sistema al motor de renderizado Ghostscript y engañen al software para que los ejecute.

Tuberías y oleoductos

El problema surgió porque el manejo de Ghostscript de los nombres de archivo para la salida hizo posible enviar la salida a lo que se conoce en la jerga como tubo en lugar de un archivo normal.

Las canalizaciones, como sabrá si alguna vez ha realizado alguna programación o escritura de scripts, son objetos del sistema que fingen ser archivos, en los que puede escribir en ellos como lo haría en el disco, o leer datos de ellos, utilizando el sistema normal. funciones tales como read() y write() en sistemas tipo Unix, o ReadFile() y WriteFile() en Windows…

…pero los datos en realidad no terminan en el disco.

En cambio, el extremo de "escritura" de una tubería simplemente empuja los datos de salida en un bloque temporal de memoria, y el extremo de "lectura" absorbe cualquier dato que ya esté en la tubería de memoria, como si hubiera venido de un bloque permanente. archivo en disco.

Esto es súper útil para enviar datos de un programa a otro.

Cuando desee tomar la salida del programa ONE.EXE y usarlo como entrada para TWO.EXE, no es necesario que primero guarde la salida en un archivo temporal y luego vuelva a leerla usando el > y < caracteres para la redirección de archivos, como este:

 C:Usersduck> ONE.EXE > TEMP.DAT C:Usersduck> DOS.EXE < TEMP.DAT

Hay varios problemas con este enfoque, incluidos estos:

  • Tienes que esperar a que termine el primer comando y cerrar el TEMP.DAT archivo antes de que el segundo comando pueda comenzar a leerlo.
  • Podría terminar con un enorme archivo intermedio que consume más espacio en disco del que desea.
  • Podrías enredarte si alguien más juega con el archivo temporal entre la finalización del primer programa y el lanzamiento del segundo.
  • Debe asegurarse de que el nombre del archivo temporal no entre en conflicto. con un archivo existente que desea conservar.
  • Te queda un archivo temporal para limpiar más tarde que podría filtrar datos si se olvida.

Con un "pseudoarchivo" intermedio basado en la memoria en forma de tubería, puede condensar este tipo de cadena de proceso en:

 C:Usuarios> ONE.EXE | DOS.EXE

Puede ver en esta notación donde los nombres tubo y industrial provienen, y también por qué el símbolo de la barra vertical (|) elegido para representar la canalización (tanto en Unix como en Windows) se conoce más comúnmente en el mundo de TI como el carácter de tubería.

Debido a que los archivos que en realidad son canalizaciones en el nivel del sistema operativo casi siempre se utilizan para la comunicación entre dos procesos, ese carácter de canalización mágica generalmente no va seguido de un nombre de archivo para escribir en él para su uso posterior, sino de el nombre de un comando que consumirá la salida de inmediato.

En otras palabras, si permite que el contenido proporcionado de forma remota especifique un nombre de archivo que se utilizará para la salida, debe tener cuidado si permite que ese nombre de archivo tenga una forma especial que diga: “No escriba en un archivo; inicie una canalización en su lugar, utilizando el nombre de archivo para especificar un comando para ejecutar”.

Cuando las características se convierten en errores

Aparentemente, Ghostscript tenía tal "característica", por la que podía decir que quería enviar la salida a un nombre de archivo con un formato especial que comenzaba con %pipe% o simplemente |, lo que le brinda la oportunidad de ejecutar furtivamente un comando de su elección en la computadora de la víctima.

(No hemos probado esto, pero suponemos que también puede agregar opciones de línea de comandos, así como un nombre de comando para ejecutar, lo que le brinda un control aún más preciso sobre qué tipo de comportamiento deshonesto provocar en el otro extremo. )

Curiosamente, si esa es la palabra correcta, el problema "a veces los parches necesitan parches" apareció nuevamente en el proceso de corregir este error.

En el artículo de ayer sobre una falla en el complemento de WordPress, descrito cómo los creadores del complemento con errores (Ultimate Member) han pasado recientemente y rápidamente por cuatro parches tratando de aplastar un error de escalada de privilegios:

También escribimos recientemente sobre el software para compartir archivos MOVEit que está saliendo tres parches en rápida sucesión para hacer frente a una vulnerabilidad de inyección de comandos que apareció por primera vez como un día cero en manos de delincuentes de ransomware:

En este caso, el equipo de Ghostscript primero agregó un cheque como este, para detectar la presencia del texto peligroso %pipe... al comienzo de un nombre de archivo:

/* "%pipe%" no sigue las reglas normales para las definiciones de rutas, por lo que no las "reducimos" para evitar resultados inesperados */ if (len > 5 && memcmp(path, "%pipe", 5) ! = 0) { . . . 

Luego, los programadores se dieron cuenta de que su propio código aceptaría un simple | carácter así como el prefijo %pipe%, por lo que el código se actualizó para tratar ambos casos.

Aquí, en lugar de verificar que la ruta de la variable no comience con %pipe... para detectar que el nombre de archivo es "seguro", el código declara que el nombre de archivo no es seguro si comienza con un carácter de barra vertical (|) o el temido texto %pipe...:

/* "%pipe%" no sigue las reglas normales para las definiciones de ruta, por lo que no las "reducimos" para evitar resultados inesperados */ if (ruta[0] == '|' || (len > 5 && memcmp(ruta, "%tubería", 5) == 0)) { . . .

¿Qué hacer?

  • Si tiene un paquete de Ghostcript independiente administrado por su distribución de Unix o Linux (o por un administrador de paquetes similar como el Homebrew mencionado anteriormente en macOS), asegúrese de tener la última versión.
  • Si tiene un software que viene con una versión incluida de Ghostscript, consulte con el proveedor para obtener detalles sobre la actualización del componente Ghostscript.
  • Si es un programador, no acepte ninguna corrección de errores inmediatamente obvia como el principio y el final de su trabajo de aplastamiento de vulnerabilidades. Pregúntese, como lo hizo el equipo de Ghostscript, "¿Dónde más podría haber ocurrido un tipo de error de codificación similar y qué otros trucos podrían usarse para desencadenar el error que ya conocemos?"

punto_img

Información más reciente

punto_img