web-dev-qa-db-ja.com

PDFファイル内の「phone home」動作の検出と防止

信頼できない人からPDFドキュメントを電子メールで受け取りました。ドキュメントを読んで返信する必要があります。ドキュメントは暗号化されていません。

書類が完全に安全であることを確認したい。

複数のウイルス対策製品でスキャンしました。問題は検出されませんでした。

ウェブメール内から表示することはできますが、ダウンロードして直接表示し、記録として保管したいと考えています。

PDF reader/viewer/editorでファイルを開くと、ドキュメントにサーバーに接続して「ping」を送信して、ドキュメントを開きました。

PDFドキュメントがそれを実行することは可能ですか?その場合、これらのドキュメントのいずれかがそれを実行するように設定されているかどうかをどのように判断しますか?また、インターネットから切断する以外に、どうすれば防ぐことができますか?それ?

22
Tim

PDFドキュメントが自宅に電話をかけることは可能ですか?

はい、少なくともアドビのリーダー製品では こちら を参照):

PDFドキュメント内の表示リンクに加えて、フォームフィールドには、ブラウザーでページを開いたり、インターネットからデータをサイレントに要求したりする非表示のJavaScript呼び出しを含めることができます。

特定のPDFがこれを実行しているかどうかを確認するにはどうすればよいですか?

これを行う方法は確かにありますが、それが何かはわかりません。おそらくAdobe pdfリーダーが特定のドキュメントが使用する機能を表示しますが、私はそれらを使用しないので、本当にわかりません。もっと重要な質問は...

PDFファイルコーリングホームから保護する方法は?

まず、アンチウイルススキャンはこれを行う方法ではないということを言う必要があります。一つには、「家に電話をかける」はPDFのウイルスではなく、「正当な」機能の使用だけです。さらに、ウイルススキャンは壊れたセキュリティモデルのようなものです。新しいウイルスは毎回スキャナーを通過します。

幸い、リーダーの設定を使用して、WebリンクやJavaScriptなどの多くのオプションを無効にすることができます(たとえば here を参照してください。アドビの用語「インターネットへのリンク」は通常のハイパーリンクを参照しないことに注意してください)ウェブのようですが、実際の接続)。おそらく、インターネットアクセスとJavaScriptを永久に無効にする必要があります。これらの機能が必要になることはめったになく、潜在的な問題が露呈するだけです。

実際には、これは本当にあなた自身を安全に保つためにあなたがする必要があるすべてです。

しかしながら...

また、長年にわたり、さまざまなpdfビューアに脆弱性が発見されており、特別に細工されたpdfが任意のコードを実行するなどの厄介なことを可能にしています。これを軽減する方法もあります。Adobeリーダーの最新バージョンには、有効にできる組み込みのサンドボックスがあります。 ここ を参照してください。

パッチを当てたままのシステムで実行していると仮定すると、これはおそらく大きなリスクではありません。さらに詳しく確認する必要がある場合は、仮想マシン( VMWare または VirtualBox など)を使用します。この手順をお勧めします:

  • 仮想マシンを作成し、それにPDFリーダーソフトウェアをインストールする
  • ホストマシンと仮想マシンの間に共有フォルダーを設定する
  • この共有フォルダーを使用して、PDFファイルを仮想マシンにコピーします。
  • 仮想マシンをシャットダウンし、ネットワークと共有フォルダを無効にします
  • 仮想マシンのハードディスクの状態のスナップショットを取得します
  • 仮想マシンを再起動して、PDFファイルを表示します。ネットワークファイルと共有ファイルが無効になっているため、PDFファイル内の厄介なものが仮想マシンから降りる方法はありません。
  • 終了したら、仮想マシンをシャットダウンし、その状態をチェックポイントにロールバックします。これで、PDFが仮想マシンに悪影響を及ぼしていた可能性のある問題はすべて解消されました。

しかしながら...

そうは言っても、仮想化ソフトウェアに欠陥があり、PDFファイルの余分な厄介な問題を回避できる可能性があります。私たちは仮想マシンIMHOで極度のパラノイアの領域にいて、今はWAY over the Edgeですが、完全を期すために、エアギャップされた物理マシンはさらに安全なオプションです。

(ディアハンターのコメントが示唆しているように、後で破壊するネットワークに接続されていない物理ハードウェアを使用することはさらに安全になりますが、分単位で急激に偏執的になっています)。

21
stochastic

コメントするほどの評判はありませんが、ドタンコーエンの答えを付け加えたいと思います。 PDFプレーンテキストで読みたい場合) pdftk は驚くべき無料のツールです。

次のようなコマンドを実行するだけです:

pdftk input.pdf output out.pdf uncompress

また、すべての圧縮コンテンツストリームは圧縮解除されます。構造(オブジェクト番号など)は少し異なる場合がありますが、これにより、 '/ JavaScript'などの既知の文字列をお気に入りのツールで簡単に解析できます。

PDFスペックで十分かどうかを確認する必要があるかもしれませんが、それで始められるはずです。既製のツールまたはファイアウォールVMこのための時間や興味がありません。

12
Nick P

このページ の場合、ダウンロードできますPDFサンプルスクリプトを含むファイル。ダウンロードした このページ

実験として、stringsを介してファイルを実行し、grepを使用してJavaScriptを検索しました。

$ strings JSPopupCalendar.pdf | grep -i Java
<</JavaScript 251 0 R/EmbeddedFiles 243 0 R>>
<</S/JavaScript/JS 253 0 R>>
<</S/JavaScript/JS(\n\r\n       /* Set day 18 */\r\n    FormRouter_SetCurrentDate\("18"\);\r)>>
<</S/JavaScript/JS(\nFormRouter_PlaceCalendar\(this.getField\("FormDateField"\), false, "mmmm dd, yy"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 17 */\r\n    FormRouter_SetCurrentDate\("17"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 26 */\r\n    FormRouter_SetCurrentDate\("26"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 16 */\r\n    FormRouter_SetCurrentDate\("16"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 31 */\r\n    FormRouter_SetCurrentDate\("31"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 15 */\r\n    FormRouter_SetCurrentDate\("15"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 25 */\r\n    FormRouter_SetCurrentDate\("25"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 14 */\r\n    FormRouter_SetCurrentDate\("14"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /*  Set day 13 */\r\n   FormRouter_SetCurrentDate\("13"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 24 */\r\n    FormRouter_SetCurrentDate\("24"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 12 */\r\n    FormRouter_SetCurrentDate\("12"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 30 */\r\n    FormRouter_SetCurrentDate\("30"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 21 */\r\n    FormRouter_SetCurrentDate\("21"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 23 */\r\n    FormRouter_SetCurrentDate\("23"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 10 */\r\n    FormRouter_SetCurrentDate\("10"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 9 */\r\n     FormRouter_SetCurrentDate\("9"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 22 */\r\n    FormRouter_SetCurrentDate\("22"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 8 */\r\n     FormRouter_SetCurrentDate\("8"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 29 */\r\n    FormRouter_SetCurrentDate\("29"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 7 */\r\n     FormRouter_SetCurrentDate\("7"\);\r)>>
<</S/JavaScript/JS(\n/* Set day 1 */\r\nFormRouter_SetCurrentDate\("1"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 6 */\r\n     FormRouter_SetCurrentDate\("6"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 28 */\r\n    FormRouter_SetCurrentDate\("28"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 5 */\r\n     FormRouter_SetCurrentDate\("5"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 20 */\r\n    FormRouter_SetCurrentDate\("20"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 4 */\r\n     FormRouter_SetCurrentDate\("4"\);\r)>>
<</S/JavaScript/JS(\n\r\n\r\n   /* Set day 3 */\r\n     FormRouter_SetCurrentDate\("3"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n\r\n   /* Set day 19 */\r\n    FormRouter_SetCurrentDate\("19"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n/* Set day 2 */\r\nFormRouter_SetCurrentDate\("2"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 27 */\r\n    FormRouter_SetCurrentDate\("27"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 11 */\r\n    FormRouter_SetCurrentDate\("11"\);\r)>>
<</S/JavaScript/JS(\nFormRouter_PlaceCalendar\(this.getField\("DateTest2"\), true, "ddd mmm d, yyyy"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 23 */\r\n    FormRouter_SetCurrentDate\("23"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 24 */\r\n    FormRouter_SetCurrentDate\("24"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 25 */\r\n    FormRouter_SetCurrentDate\("25"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 26 */\r\n    FormRouter_SetCurrentDate\("26"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 27 */\r\n    FormRouter_SetCurrentDate\("27"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 28 */\r\n    FormRouter_SetCurrentDate\("28"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 29 */\r\n    FormRouter_SetCurrentDate\("29"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 30 */\r\n    FormRouter_SetCurrentDate\("30"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 31 */\r\n    FormRouter_SetCurrentDate\("31"\);\r)>>
<</S/JavaScript/JS(\n/* Set day 1 */\r\nFormRouter_SetCurrentDate\("1"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\nFormRouter_PlaceCalendar\(this.getField\("FormDateField.1"\), false, "mmm d, yyyy"\);\r\n\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\nFormRouter_PlaceCalendar\(this.getField\("DateTest1"\), false, "mm/dd/yyyy"\);\r\n\r\n\r\n\r\n\r)>>
<</S/JavaScript/JS(\n/* Set day 2 */\r\nFormRouter_SetCurrentDate\("2"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n\r\n   /* Set day 3 */\r\n     FormRouter_SetCurrentDate\("3"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 4 */\r\n     FormRouter_SetCurrentDate\("4"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 5 */\r\n     FormRouter_SetCurrentDate\("5"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 6 */\r\n     FormRouter_SetCurrentDate\("6"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 7 */\r\n     FormRouter_SetCurrentDate\("7"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 8 */\r\n     FormRouter_SetCurrentDate\("8"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 9 */\r\n     FormRouter_SetCurrentDate\("9"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 10 */\r\n    FormRouter_SetCurrentDate\("10"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 11 */\r\n    FormRouter_SetCurrentDate\("11"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 12 */\r\n    FormRouter_SetCurrentDate\("12"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /*  Set day 13 */\r\n   FormRouter_SetCurrentDate\("13"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 14 */\r\n    FormRouter_SetCurrentDate\("14"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 15 */\r\n    FormRouter_SetCurrentDate\("15"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 16 */\r\n    FormRouter_SetCurrentDate\("16"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 17 */\r\n    FormRouter_SetCurrentDate\("17"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 18 */\r\n    FormRouter_SetCurrentDate\("18"\);\r)>>
<</S/JavaScript/JS(\n\r\n\r\n   /* Set day 19 */\r\n    FormRouter_SetCurrentDate\("19"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 20 */\r\n    FormRouter_SetCurrentDate\("20"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 21 */\r\n    FormRouter_SetCurrentDate\("21"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 22 */\r\n    FormRouter_SetCurrentDate\("22"\);\r)>>
<</S/JavaScript/JS(\n\r\n\r)>>
<</S/JavaScript/JS 233 0 R>>
<</S/JavaScript/JS(\n\r\nif\(!event.willCommit\)\r\n{\r\n  FormRouter_SetDays\(parseInt\(event.changeEx\), parseInt\(getField\("FR_00000_Calendar.CalendarYear"\).value\)\);\r\n}\r\n\r\n\r\n\r\n\r\n\r)>>
               <rdf:li>JavaScript</rdf:li>

allPDF Javascriptを含むファイルがstringsでJavascriptを表示できることを保証できません。ただし、 、この方法をチェックすることは良い最初のステップになるでしょう。

4
dotancohen

既に述べたように、PDFドキュメントをコールホームにすることは可能です。

これは通常、ほとんどの場合ドキュメントが開いたときにURLを起動することによって行われます。

おそらく最も簡単で最も実用的なアプローチは、非常に馬鹿なPDFビューア(アクションなどを知らない)を使用し、ビューアを起動する前にネットワークからマシンを切断し、その後再接続することです。やめる)。

ただし、記録のためにPDFを保持します。この場合、それを「サニタイズ」する必要があり、そのためにダムよりも良い何かが必要になりますPDFビューア。

1つの可能性は、Acrobatを使用することです(マシンがネットワークから切断されている場合)、PDFOptimizerを見つけます(Acrobat XIでは、メニューの[ファイル]-> [他のファイルとして保存...]-> [最適化されたPDF]を選択します)。そのダイアログでは、アクティブな要素などを削除するためのかなりの数のオプションがあります。これは十分に信頼できると言われています。

処理するファイルの数が多い場合は、一部の製品をAppligentで確認できます。私が正しく覚えている場合、PDFをアクティブな要素から適切に削除するユーティリティが1つあります(そして、PDFビューアではないため、ドキュメント家に電話する機会はありません)。

0
Max Wyss