Didier Stevens는 다음과 같은 쇼를 제작했습니다."pdfid"(https://blog.didierstevens.com/2009/03/31/pdfid/ 그리고 https://blog.didierstevens.com/programs/pdf-tools/#pdfid).
그는 말했다:
"저는 PDF 문서를 분류하기 위한 새로운 도구인 PDFiD를 개발했습니다. 이 도구는 악성일 수 있는 PDF 문서와 악성이 아닐 가능성이 가장 높은 PDF 문서를 구별하는 데 도움이 됩니다."
그것이 내가 그것을 사용하고 싶은 것입니다.
"PDFiD는 PDF 문서에서 주어진 문자열 목록을 스캔하고 각 단어의 발생 횟수(전체 및 난독화)를 계산합니다."
obj
endobj
stream
endstream
xref
trailer
startxref
/Page
/Encrypt
/ObjStm
/JS
/JavaScript
/AA
/OpenAction
/AcroForm
/JBIG2Decode
/RichMedia
/Launch
/XFA
내가 아는 한, "obj"와 "endobj"의 값은 일치해야 합니다. 즉, 열려 있는 닫히지 않은 개체가 없다는 의미입니다(이로 인해 버퍼 오버플로 또는 기타 문제가 발생할 수 있음).
이상적으로는
/JS /JavaScript /AA /OpenAction /AcroForm
값이 0이어야 합니다.
그런데 "obj"와 "endobj"가 일치하지 않는 PDF 문서를 많이 봤는데, 다른 값은 괜찮은 것 같습니다.
예: 다음의 Using_FreeDOS.pdfhttp://www.freedos.org/ebook/download/using-freedos-24.pdf.
pdfid 결과:
PDF Header: %PDF-1.4
obj 520
endobj 519
stream 193
endstream 193
xref 1
trailer 1
startxref 1
/Page 100
/Encrypt 0
/ObjStm 0
/JS 0
/JavaScript 0
/AA 0
/OpenAction 1
/AcroForm 0
/JBIG2Decode 0
/RichMedia 0
/Launch 0
/EmbeddedFile 0
/XFA 0
/URI 8
/Colors > 2^24 0
그러나 여기에는 "/OpenAction 1"도 있습니다. 이것이 얼마나 관련성이 있는지 잘 모르겠습니다.
그럼에도 불구하고:
문자열 목록의 나머지 부분과 개수가 정상일 때 "obj"와 "endobj"가 일치하는 것이 얼마나 중요합니까?
이미 말했듯이 "obj"와 "endobj"가 일치하지 않는 PDF 문서가 많이 있습니다.
답변1
pdfid는 분명히 obj/endobj 쌍을 계산하는 끔찍한 작업을 수행합니다. 특정 예에서 이상한 "obj"는 FlateDecode 스트림의 일부입니다.
$ cat pdf.pl
use Compress::Zlib qw(inflateInit Z_STREAM_END);
use strict;
my ($o);
while(<>){
$o -= s/\bendobj\b//g;
$o += s/\b\d+\s+\d+\s+obj\b//g;
if(/\bstream\s*$/){
local $/ = "endstream"; my $s = <>; $s =~ s/\s*endstream$//;
if($s =~ /(\w*obj)/){
my ($d, $err) = inflateInit->inflate($s);
if(length($s) == 0 && $err == Z_STREAM_END){
warn "innocuous '$1' in well formed stream\n";
}else{
warn "WARNING: inflateInit: $err\n";
}
}
}
if(/(\w*obj)\b/){ warn "WARNING: possible stray $1\n" }
}
warn "WARNING: unbalanced obj/endobj: $o\n" if $o;
$ perl pdf.pl using-freedos-24.pdf
innocuous 'obj' in well formed stream
참고: 이는 현재 문제를 설명하기 위한 것일 뿐입니다. PDF가 안전한지 확인하는 데 사용하지 마세요.
PDF 형식은 매우 번거롭고 복잡합니다. 구조를 이해하려면 정교한 파서가 필요합니다. 악성 PDF를 올바르게 식별하기 위해 이를 수행할 수 있는 프로그램 자체가 공격 벡터가 됩니다. 임시 파서가 libpoppler 또는 libmupdf보다 더 안전하다고 믿을 이유가 없습니다.