私のWebサイトはエンドユーザー向けのドキュメントをホストします。これを可能な限り安全にしたいと考えています。
質問
悪意のあるコードが含まれている可能性のあるWebサイトでドキュメントを共有する必要がある場合、自分とエンドユーザーを保護するにはどうすればよいですか?
信頼できないソースからのドキュメントの表示について懸念しているようです(たとえば、悪意のあるドキュメントがPDFビューア、またはWordなどで)の脆弱性を悪用するリスクについて懸念している) 。それは合理的な懸念事項です。
それが問題である場合、それを軽減する1つの方法は、Googleドキュメントを使用してドキュメントを表示することです。 Googleドキュメントには、ウェブブラウザでドキュメントを表示する機能があります。 GoogleはドキュメントをGoogleのサーバーでHTMLに変換し、そのHTMLをブラウザーに送信します。その後、Googleは、サーバーが悪意のあるドキュメントを安全に処理できるようにする責任を負います。これは、悪意のあるドキュメントから身を守るための合理的なアプローチです。
主な欠点は、機密文書を表示するには適さない可能性があることです。これは、この方法で表示する前に、Googleにアップロードする必要があるためです。
別の防御策は、ドキュメントビューアに完全にパッチを適用することです。 Adobe ReaderとMicrosoft Officeの自動更新をオンにすることをお勧めします。これは、リスクを軽減する別の方法です。
サイトの所有者として、あなたができることはそれだけです。悪意のあるドキュメントからユーザーを保護する主な責任は、ドキュメントビューアを作成するソフトウェアベンダー(Adobe、Microsoft、および場合によってはブラウザーベンダーなど)にあります。彼らは、ユーザーを最大限に支援する機会を持つ人々です。あなたのレバレッジはより制限されています。
とはいえ、ユーザーを可能な限り保護するために実行できる、または実行する必要があるいくつかの手順を次に示します。
ホワイトリストに登録されたタイプのドキュメントのみを許可します。MIMEタイプのホワイトリストを作成し、サポートが比較的安全で重要であると考えるドキュメント形式を表します。 (このホワイトリストには、PDF、Word、PowerPoint、Excelスプレッドシートなどが含まれる場合がありますが、ネイティブ実行可能ファイル、Flashビデオ、Zipまたはjarアーカイブ、HTMLまたはJavaScriptなどは含まれません。)ユーザーがドキュメントをアップロードしたとき、ホワイトリストで確認します。このドキュメントを他の人に提供するときは、コンテンツタイプのスニッフィング攻撃を防ぐために 他の場所で概説したプラクティス に従ってください。最も重要なのは、以前に検証されたMIMEタイプを使用して、画像を提供するHTTP応答に正しい_Content-Type:
_ヘッダーを設定することです。また、一部のバージョンのIEがコンテンツタイプのスニッフィングを試行しないようにするには、_X-Content-Type-Options: nosniff
_ヘッダーを含めます。これにより、コンテンツスニッフィング攻撃から身を守るだけでなく、攻撃者が他の ブラウザが特別に扱うファイル (例:_crossdomain.xml
_、HTML5マニフェストファイル)をアップロードすることも防ぎます その他 )。
ファイル名を検証します。アップロード時にファイル名の健全性チェックを実行します。たとえば、それらが[a-zA-Z-_!(),: ]*(\.[a-zA-Z]+)?
のような正規表現に一致することを確認します。特に、スラッシュを除外する必要があります(パストラバーサルから保護するため)。また、拡張機能(存在する場合)が検証済みのMIMEタイプと一致し、既知の安全な拡張機能のホワイトリストに含まれていることを確認します。ソーシャルエンジニアリング攻撃を防ぐために、ファイル名に2つの拡張子(_foo.txt.exe
_など)が含まれていないことを確認することをお勧めします。
または、ドキュメントごとにランダムなファイル名を生成することもできます。これが最も安全ですが、使いやすさが低下する可能性があります。 3番目のオプションは、元のファイル名が有効性チェックに合格しない場合にのみ、元のファイル名を置き換えることです。
オプション:ウイルスまたはマルウェアのファイルアップロードをスキャンします。ファイルがアップロードされたら、ウイルススキャナーを使用して、既知のウイルスまたはマルウェアをチェックします。ローカルのウイルススキャナーを使用することもできますが、 VirusTotal にアップロードする方が簡単な場合があります。最近のウイルス定義ファイルは古いドキュメントでより多くのウイルスを検出するため、アップロード時に、場合によってはその後も定期的に(たとえば、1000回に1回のダウンロードごとに、または毎週1回)これを行います。これを非同期またはバッチモードで実行すると、パフォーマンスが向上する場合は問題ありません。ウイルスチェックで問題が発生した場合は、その時点でいつでもファイルを削除できます。
オプション:別のドメインを使用してファイルのアップロードをホストします。ユーザーがアップロードしたドキュメントをホストするためにのみ使用される別のドメインでドキュメントをホストできます。これにより、コンテンツタイプのスニッフィングなど、一部のブラウザーレベルの攻撃の影響が制限されます。ただし、これは、ドキュメントビューアーの脆弱性(バッファーオーバーラン、ダブルフリーなど)を悪用し、攻撃者にネイティブコードを実行させるコードインジェクション攻撃を防ぐものではありません。
DoSおよびスパムに対する障壁を設置します。提出に圧倒されないように、最大ファイルサイズに制限を設定します。認証されていないユーザーにファイルのアップロードを許可する場合は、アップロードの一部としてキャプチャを解読するようユーザーに要求します。
オプション:古いブラウザーとプラグインを検出します。ユーザーのブラウザーをスキャンします。彼らが古いブラウザ(IE6など)または古いプラグインを実行している場合は、彼らがネットを閲覧するときに自分自身を保護するために、更新することを推奨することを検討してください。これを支援するリソースは次のとおりです。
IE6ユーザーに更新を勧めたい場合は、 IE6 Update を使用すると、IE6を使用しているユーザーを検出し、ブラウザーの更新を促すコードをWebサイトに簡単に追加できます。
どのブラウザーバージョンがユーザーにアップグレードを促す小さな通知をトリガーするかについてより柔軟性が必要な場合は、 browser-update.com を参照してください。
古いプラグインまたは既知の脆弱なプラグインを確認する必要がある場合は、 Mozilla plugin check が役立つことがあります。 Firefox、Safari、Chrome、Operaをサポートし、IEを部分的にサポートしています。また、プラグインバージョンデータベースへの programmatic API もあります。これに基づいて、おそらくユーザーのプラグインを自動的にチェックするように何かをコーディングし、サポートしているドキュメントタイプの古いプラグインがあるかどうかを確認できます(例:Adobe PDFビューアプラグインの古いバージョン) 、通知をトリガーして、ユーザーにプラグインのアップグレードを促すことができます。
ファイルをソース形式から別の形式に変換し、場合によっては3番目の形式に変換する前に、これに取り組む必要があったとき。
Open/LibreOfficeがドキュメント形式をサポートしている場合は、--convert-to pdf
で呼び出すことができます。次に、そのPDFを使用して、ImageMagickを使用するなど、さらに操作できます。
convert source.pdf source-page-%d.jpg
convert -page A4 --compress jpeg source-page-*.jpg source.pdf
3をチェーン化すると、PDF誰のコンテンツがレンダリングされたページになるかということになります。これはかなり安全なはずです。
DWの答え について:
私の考えでは、これの最も安全な実装は、すべてのファイルに対して一意のDNSドメインを作成することです。そのため、1回のダウンロードで問題が発生しても、リポジトリ内の他のドメインに影響する可能性は低くなります。
これは2つの部分で実装できます。最初に、ファイルを保持するWebサーバーを指すDNSのワイルドカードエントリから始めます(例:*.userfiles.com
)。誰かが/Accounting/budget.xls
彼らは次の事前に計算されたURLに移動します。この場合、ドメインプレフィックスはURLのMD5ハッシュです。
https://fd4929a6ea48f85130f5a43f89cb7dd6.userfiles.com/Accounting/budget.xls
次に、サーバー側のコードは、「fd4929a6ea48f85130f5a43f89cb7dd6」が要求されたファイルのMD5であることを確認できます。サーバー側コンポーネントは、実行時にこの値をチェックして、アクセスを許可または拒否できます。
例:
https://96a077f305f5720221b338863ea8e3d7.userfiles.com/tech/SecurityPolicy.docx - OK
https://fd4929a6ea48f85130f5a43f89cb7dd6.userfiles.com/Accounting/budget.xls - OK
https://fd4929a6ea48f85130f5a43f89cb7dd6.userfiles.com/Accounting/Budget.xls - Fails Checksum
https://fd4929a6ea48f85130f5a43f89cb7dd6.userfiles.com/Accounting/forecast.xls - Fails checksum
悪意のあるコードが含まれている可能性のあるWebサイトでドキュメントを共有する必要がある場合、自分とエンドユーザーを保護するにはどうすればよいですか?
先に進んで、この質問に答えてみましょう。正直なところ、Word文書、pdf文書のほとんどのエクスプロイトでは、有効なコンテンツと悪意のあるコンテンツの両方が含まれている選択した文書が使用されます。
理論的には、悪意のあるサードパーティのコンテンツ(一部の外部コンテンツは許可されています)を含む完全に有効なWord文書があり、悪意のあるコードの実行を許可する重大な未知のイベントが発生するか、= PDF Adobe Reader内のファイル悪意のあるJavaScriptが実行されます。
だからあなたができることがいくつかあります。
すべてのドキュメントを単一の形式に変換します(私の提案はPDF)であり、Chrome、IE9、およびFirefoxの組み込みのセキュリティ機能を使用して、ブラウザー自体にドキュメントを表示します。つまり、ユーザーがファイルを保存することを決定しない限り、実際にファイルをユーザーに転送します。
私が言ったように、あなたはすべてのものを捕まえることができないでしょう。