LaTeX Injection
La inyección LaTeX aparece cuando una aplicación compila a PDF texto que controla el usuario (informes, facturas, currículums) pasándolo a un motor LaTeX real. LaTeX no es solo un lenguaje de maquetación: sus primitivas permiten leer ficheros del servidor e incluso ejecutar comandos, así que una entrada sin sanear se convierte en lectura de ficheros arbitraria o en RCE.
Para leer ficheros, la vía obvia es \input/\include, pero suelen estar en lista negra. Se sortea con las primitivas de lectura de bajo nivel, que las blacklists ingenuas olvidan:
\input{/etc/passwd} % lectura directa (si no esta filtrada)
\lstinputlisting{/etc/passwd} % del paquete listings
\newread\file \openin\file=/etc/passwd \read\file to\line \text{\line} \closein\fileCuando el contenido tiene caracteres que LaTeX no sabe componer (y rompen la compilación), se lee en base64 para transportarlo intacto y se descodifica fuera:
\immediate\write18{cat /etc/passwd | base64 > /var/www/html/compile/out.txt}Ese \write18 es la puerta a RCE: ejecuta un comando del sistema, siempre que la compilación se haga con --shell-escape (o --enable-write18) habilitado. El resultado se recupera del propio error de compilación o escribiéndolo a un fichero servido por la web:
\immediate\write18{id}Requisitos. El servidor debe compilar la entrada con un motor LaTeX sin sanear los comandos. La lectura de ficheros funciona casi siempre; la ejecución de comandos vía \write18 exige que la compilación corra con --shell-escape activado (desactivado por defecto en distribuciones modernas, pero frecuente en generadores caseros de PDF).
Cómo detectarlo. En el log de la aplicación, la firma son envíos al generador de PDF que contienen primitivas LaTeX de fichero o ejecución (\input, \openin, \lstinputlisting, \write18, \immediate), especialmente con rutas del sistema como /etc/passwd. En el host, la traza es el proceso pdflatex/latexmk lanzando hijos inesperados (sh -c, cat, base64) cuando se abusa de \write18.
Defensa. No compilar LaTeX no confiable: usar un generador que no invoque un motor completo, o compilar en modo restringido sin --shell-escape y dentro de un sandbox (contenedor efímero, usuario sin privilegios, sistema de ficheros de solo lectura). Filtrar por lista blanca de comandos permitidos, no por lista negra (siempre hay una primitiva olvidada). Como desemboca en lectura de ficheros y ejecución, se solapa con la traversal/LFI y la inyección de comandos.