PDFの仕様「Launch action」 について思う

2010 年 3 月 29 日に Didier Stevens が公開した PDF 仕様 「Launch action」の悪用手法(元記事はこちら)が話題になっていますね。Didier Stevens 氏の PoC(zip)Adobe Reader 9.3.1 で開いてみると、警告ダイアログが表示され、[OK] をクリックすると cmd.exe が実行されました。この「Launch action」仕様を調べてみて、思ったことをまとめます。

「Launch action」仕様について思ったこと

これまで見てきた PDF ファイルの中に「Launch action」を使用したものがなかったことから、「Launch action」は(少なくとも僕のまわりでは)必要とされていない仕様だと考えます。各 PDF ビューアの「Launch action」に関する挙動を確認した限りでは、いきなり実行ファイルが起動するものはなかったので*1、「ウェブサイト閲覧だけで任意のコードが実行される」脆弱性よりも危険視する必要はないと思います。ただし、必要な人が有効にすればいいと思うので、初期設定で無効にしてほしいです。

Didier Stevens 氏の発表により、「Launch action」仕様が認知されたことに意義があると考えます。元々「Launch action」仕様が追加された頃は、PDF が不正プログラムの拡散に悪用されていなかったことから、この仕様に疑問を投げかける研究者等がいなかったと推測します。その頃はこの仕様も PDF 利用者に求められていたのかもしれませんが、実際にこの仕様を使っている PDF がないことから現在は必要とされていないと思います。今回の騒ぎをきっかけに、一般的に使われていない仕様が無効になるか、実装において初期設定で無効にされるといいな。


以下、「Launch action」について調べたことをまとめています。

「Launch action」が追加された PDF バージョン

まず「Launch action」が PDF 仕様に追加された PDF バージョンを調べてみました。「Launch action」が PDF 仕様に追加されたのは、PDF 1.1(1996 年発行)でした。

wikipedia:PDF を読んでみると、「PDF のバージョン」 の項目がありました。PDF 1.3 までは Adobe 社のウェブサイトから仕様書がダウンロードできるようです。どうせなら、PDF 1.3 以前のものを見たいと思い、Google で検索したところ、PDF 1.2 の仕様書が見つかりました。この仕様書をみたところ、p.96 に「6.9 Actions」の小節がありました(下図を参照)。このページを読んでみると、Actions は PDF 1.1 から追加されたようです(下図の赤枠)。


PDF 1.2 の仕様書の表紙を確認すると、発行年は 1996 年となっています(下図を参照)。

「Launch action」が仕様に追加された頃に流行していた不正プログラム

この仕様が追加された 1996 年頃はどんな不正プログラムが流行していたのか、調べてみました。Microsoft Word, Excel のマクロを悪用した(いわゆる)マクロウイルスの全盛期だっだようですね。

独立行政法人 情報処理推進機構(旧 情報処理振興事業協会)が発表した「1997年ウイルス被害届出状況」を読むと、1996 年から 1997 年になり、マクロウイルスの届出件数が増加しています。1998 年1990 年とマクロウイルスの届出が多い傾向が続いて、2000 年以降にメール、ネットワーク経由で感染を広げる不正プログラムが主流になっていったようですね。

各 PDF ビューアの「Launch action」に関する挙動

Didier Stevens 氏のブログでは、Adobe Reader、Foxit Reader で「Launch action」を含んだ PoC を開いた時の挙動のみ指摘されています。が、ブログのコメントには、他の PDF ビューアの挙動について投稿されていました。実際に他の PDF ビューアで PoC を開いた時の cmd.exe の起動可否を確認してみました。確認した結果を以下の表にまとめました。

PDF ビューア cmd.exe の起動可否
Adobe Reader 9.3.1 cmd.exe 起動(要警告ダイアログ[開く]押)
Foxit Reader 3.2.1.0401 cmd.exe 起動(要警告ダイアログ[Open]押)
PDF-XChange Viewer 2.0(Build 49.0) cmd.exe 起動しない
Nuance PDF Reader 6.0 cmd.exe 起動(要警告ダイアログ[OK]押)*2
Sumatra PDF 1.0.1 cmd.exe 起動しない
Evince Document Viewer 2.30.0 cmd.exe 起動しない

確認した結果から、「Launch action」実装としては、実行ファイルを起動する前に警告ダイアログを出すというのが一般的のようです。この実装は Microsoft Word, Excel のマクロと同様です。Adobe Reader では「Launch action」自体を無効にできますが、Foxit Reader, Nuance PDF Reader には無効にする設定は確認できませんでした。「Launch action」を実装している PDF ビューアでは、無効にできる設定項目があり、かつ初期設定でその設定が有効になっていてほしいです。

各 PDF ビューアで PoC を開いた時の様子

Adode Reader 9.3.1 で PoC を開いたところ。[開く] を押すと、cmd.exe が起動する。


Foxit Reader 3.2.1.0401 で PoC を開いたところ。[OK] を押すと、cmd.exe が起動する。Adobe Reader とは異なり、警告ダイアログの選択は [Open] となっている。


PDF-XChange Viewer 2.0(Build 49.0) で PoC を開いたところ。下図では左下の [警告アイコン] をクリックし、警告内容を表示したものになります。


Nuance PDF Reader 6.0 で PoC を開いたところ。「cmd.exe」を開けないとのエラーが表示され、cmd.exe が起動しませんでした。

PoC の cmd.exe を絶対パス(C:\\WINDOWS\\system32\\cmd.exe)に変更し、この PoC を開くと以下のようになります。[OK] をクリックすると、cmd.exe が起動してしまいます。


Sumatra PDF 1.0.1 で PoC を開いたところ。cmd.exe は起動しません。


Evince Document Viewer 2.30.0 で PoC を開いたところ。cmd.exe は起動しません。


【2010年4月18日追記】
Linux の PDF ビューアについては、2010年4月17日の日記でまとめています。

*1:Foxit Reader は修正された最新バージョンで確認しています

*2:PoC をそのまま開くとエラーで cmd.exe は起動しませんでした。cmd.exe を絶対パスに変更すると cmd.exe を実行ファイルとして認識するようです