PDFファイルのデジタル署名は信用できるか

ある調査チームが、署名の効力はそのままに、署名付きPDFファイルの内容を書き換えられるかどうかを調査しました。

PDFファイルは、ほとんどの企業や政府機関で使用されています。PDF形式の文書の真正性を保証するのには、デジタル署名がよく使われます。デジタル署名付きのファイルをPDFビューアーで開くと、この文書が署名されていることを示す目印と署名した個人や団体の名称が表示され、署名の妥当性を検証するためのメニューにアクセス可能となります。

さて、ドイツの複数大学のリサーチャーから成る調査チームが、PDF署名の堅牢性テストを実施しました。Chaos Communication Congress(36C3)では、ルール大学ボーフム校のウラジスラフ・ムラデノフ(Vladislav Mladenov)氏が、その成果を披露しました(英語)。

調査チームが調査したのは「署名付きPDF文書の内容を、署名を無効にすることなく変更することができるか」ということでした。理論上、この実験と同じことをサイバー犯罪者が試み、署名付きファイルに偽の情報を書き込んだり、悪意あるコンテンツを追加したりすることが可能です。銀行から署名入り文書を受け取った人がそのファイルを信用して、ファイル内に記載されたリンクをクリックしてしまう可能性は高いと考えられます。

この調査では、よく使われているPDFビューアー22種類が調査対象になりました。

PDFのファイル構造

始めに、PDF形式について簡単に説明しましょう。1つ1つのファイルは、主に4つの部分で構成されています。PDFのバージョンを表すヘッダー(Header)。利用者が目にするメインの内容であるボディ(Body)。ボディ内に含まれるオブジェクトとその位置を列挙したディレクトリである、クロスリファレンステーブル(Xref Table)。PDFビューアーが読み取りを開始する地点を示すトレイラー(Trailer)。トレイラーには、プログラムにファイルの処理を開始する位置を知らせるパラメーターと、Xrefセクションの開始位置を知らせるパラメーターという2つの重要なパラメーターが含まれます。

PDF形式には、増分更新の機能が組み込まれています。そのおかげで、たとえばテキストの一部をハイライトしてコメントを残すことができます。技術的な話をすると、この機能によって3つのセクションが追加されます。ボディの更新(Body Updates)、新しいXrefディレクトリ(Xref Table)、そして新しいトレイラー(Trailer)です。こうして、利用者が目にするオブジェクトに変化を加え、新しいコンテンツを追加することができるのです。デジタル署名も本質的には増分更新の1つで、新たな要素と対応するセクションがファイルに追加されます。

増分保存攻撃(ISA:Incremental Saving Attack)

調査チームはまず、テキストエディターを使って増分更新を新たに行い、ファイルにセクションを追加するという実験を行いました。厳密に言うと、これは攻撃ではありません。単に、このファイル形式を発明した人が実装した機能を使っただけです。この方法で変更されたファイルをPDFリーダーで開くと、デジタル署名は有効だが文書が変更されている、という内容のメッセージが表示されます。このメッセージは意味するところが明確ではなく、特に、あまりITに詳しくない人には分かりづらい内容です。PDFビューアーのうち1つ(LibreOffice)では、このメッセージが表示されませんでした。

次に行ったのは、最後の2セクションを削除する実験でした(追加されたセクションのうち、ボディの更新を残し、クロスリファレンステーブルとトレイラーを削除)。一部のビューアーは、このようなファイルを受け付けませんでした。2つのビューアーは、これらのセクションがないことを察知すると足りないセクションを自動的に追加し、コンテンツに変更があったことを知らせるメッセージは表示しませんでした。別のビューアー3つは、何事もなくファイルを表示しました。

調査チームは次に、自分たちが「手作業で」更新した部分にデジタル署名をコピーしたらどうなるだろうかと考えました。さらに2つのビューアー(FoxitとMasterPDF)が、この手法に欺かれました。

こうして、PDFビューアー22種類のうち11種類が、このような単純な改竄に対して脆弱であると証明されました。それだけではありません。そのうち6つのビューアーは、開いた文書に変更が加えられている旨の通知を表示しませんでした。残りの5つでは、ファイルを開いただけでは改竄が行われたことが分からず、メニューを開いてデジタル署名の有効性を確認しなければなりませんでした。

署名ラッピング攻撃(SWA:Signature Wrapping Attack)

文書に署名すると、ボディへの増分更新として、2つの重要なフィールドが追加されます。1つは署名を含む/Contents、もう1つは、署名対象の部分を正確に示す/ByteRangeです。/ByteRangeには4つのパラメーター(ファイルの先頭、署名コードより前のバイト数、署名コードの終端を示すバイト、署名の後のバイト数)があります。こうなっているのは、PDF文書のコードから暗号的な手段によって生成された文字の連なりがデジタル署名であるためです。当然ながら署名は自分自身に署名できないので、署名が保管されている領域は署名計算プロセスからは除外されます。

調査チームが試みたのは、/Contentsセクションに追加スペースを作り出すことでした。署名の直後に別の/ByteRangeフィールドを追加したところ、最初の2つの値は変わらずそのまま、署名コードの最後尾にあるアドレスだけが変更されました。その結果、ファイル内に余分なスペースができ、任意の悪意あるオブジェクトとこれらを説明するクロスリファレンステーブルを挿入できるようになりました。理論的には、PDFビューアーがファイルを正しく読み取れるなら、この悪意あるセクションまでは到達しません。しかし、22個中17個のビューアーが、このような攻撃に対して脆弱でした。

ユニバーサル署名偽造(USF:Universal Signature Forgery)

調査チームはさらに、各ビューアーに対してストレステストを実施しました。ここで使用したのは、フィールドの値を不正な値に置き換える、またはただ削除するという標準的な侵入テストの手法です。/Contentsセクションを使った実験では、本物の署名を0x00の値で置き換えても、2つのビューアーがこれを有効であると認証することが分かりました。

では、署名をそのまま残し、/ByteRangeセクション(署名の対象に関する情報)を削除した場合はどうなるでしょう?また、本物の値の代わりにnullを挿入した場合は?一部のビューアーでは、どちらの署名も認証されました。

実験の結果、22種類のビューアーのうち4種類に、悪用可能な実装エラーが含まれることが判明しました。

下の表はすべての結果をまとめたものですが、改竄されたPDFにだまされてしまうPDFビューアーが22種類中21種類に及ぶことが分かります。言い換えると、悪意あるコンテンツ、または利用者の目からは正しく見える偽の情報を含むPDFファイルを作成することによって、(調査対象のうち)1つのPDFビューアーを除くすべてのPDFビューアーで開くことができてしまうという結果となりました。

PDFビューアーの脆弱性のまとめ(出典

面白いことに、調査チームの手口にまったく引っかからなかった唯一のアプリケーションは、Adobe Reader 9でした。問題は、Adobe Reader 9がリモートコード実行の脆弱性の影響を受けやすいことです。また、Adobe Reader 9はLinux利用者にしか使われていません。Linux環境で使用できる最新のバージョンだから、という以上の理由はありませんが。

現実的な結論

これらの結果から引き出せる現実的な結論とは?まずは、PDFのデジタル署名をやみくもに信じてはならない、ということが1つ。どこかに緑色のチェックマークが表示されていても、それが署名の有効性を意味しているとはかぎりません。

もう1つ、署名付き文書にも危険が潜んでいる可能性がある、と言うことができます。したがって、オンラインで受け取ったファイルを開いたり、ファイル内に記載されているリンクをクリックしたりする前に、信頼できるセキュリティ製品をコンピューターにインストールしておきましょう。

ヒント