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よりも安全であると信じる理由はありません。