原則はファイル無害化
ファイルのアップロードは入力値と一緒です。原則はファイル自体を再構築(CDR:Content Disarm and Reconstruction)をマクロや不正なスクリプトを除外することで根本原因を除きシステム内に入れないことです。
単純に除外してしまうと見かけも崩れてしまう可能性がありますがCDR方式はすべてのファイルに悪意があるものとみなし、不正なマクロやスクリプトなどを除き再構築ことが可能です。
大原則:システムに入ってくるデータはまずは全て疑う、必要のないものは除外する
検知するだけでになく検知した場合の判断を運用プロセスに組み込まなければならない
サービスの事情からファイルの変換がNGな場合は、ファイルに視認できる以外の何か含まれていないか確認することは必要となるでしょう。
PDFid:利用されている要素の数を知りたい場合に有用
PDFiDは特定のキーワードの抜き出しが可能です。「pip install pdfid」で導入可能です。
/javaScript 15
/OpenAction 3
横の数字で使われている箇所が確認できます。
【 pdfinfo 】コマンド:LinuxやMacOSXなどで利用可能な
以下のコマンドでJavascriptの有無をシンプルに返してくれます。
pdfinfo -js (PDF file)
peepdfはPythonの2系が条件ですがファイル中の脆弱性をcveで出せる点は優秀です。
検知はその後のフローに繋げるための手段に過ぎませんのでファイルを受け入れ拒否するか、通知で入力の可否を判断させるかの仕組みを実装するところまでリスクコントロールしましょう。
シンプルに検知し受入可否を判断するフローへスムーズに繋げることが重要
低減策:上記の策が使えない場合はどうすれば良いか
「ブラウザプレビューで引かせずダウンロードさせる」「注意書きで了承してもらう」などサービスの全面的な責任から切り出す。
リスクがある以上は無策だけは避けるようにする
以上です。参考になれば幸いです。