web-dev-qa-db-ja.com

安全でないファイルを特定するために、ファイル拡張子とMIMEタイプ(file -i -bの出力として)の組み合わせを使用していますか?

ユーザーが多数のファイルをアップロードすることを許可します。これらのファイルはすべてscribd(doc、xls、pptsなど)に送信するか、自分でビデオとして表示する(flowplayerではflv、mov、mp4など)。

ユーザーが安全でないファイルをアップロードしないようにするために、既知の「安全な」ファイル拡張子のセットをチェックしてから、MIMEタイプを示すfile -i -bコマンドの出力をチェックします。

Usage: file [OPTION]... [FILE]...
Determine file type of FILEs.
...
-i, --mime                 output mime type strings

これは、「安全でないスクリプト」をサーバーに近づけないようにするための適切な保護ですか、それとも他の人が別のものを使用するのですか?

17
siliconpi

警告。サーバーからこれらのファイルが利用できる場合、説明する手順は安全であるには不十分です。

説明。ブラウザーはさまざまな状況でコンテンツスニッフィングを行って適切なMIMEタイプを推測するため、さまざまな微妙なクロスサイトスクリプティング攻撃があります。それは可能なままです。一般的なカテゴリは、content-sniffing XSSと呼ばれることもあります。

次の研究論文を参照してください。

次のブログ投稿とメッセージでもこの脅威について説明しています。

防御。次の防御と緩和策を採用することをお勧めします。

  1. ユーザーがアップロードしたコンテンツをホストするためにのみ使用される別のドメインでコンテンツをホストします。これによりサンドボックス化されるため、コンテンツを盗聴するXSS攻撃は他のユーザーのコンテンツのみを攻撃でき、サイトを攻撃することはできません。 (たとえば、WikipediaとFacebookはこの防御策を使用しています。)

  2. ユーザーがアップロードしたコンテンツを提供するすべての応答で、正しいContent-Type:ヘッダーを設定してください。 content-typeを調べて、安全なコンテンツタイプのホワイトリストのいくつかのオプションの1つであることを確認します。無効なMIMEタイプ(*/*unknown/unknownapplication/unknownなど)の送信を避け、Content-Type:ヘッダーのない応答を避けます。これらはブラウザコンテンツタイプのスニッフィングの対象となるため、攻撃のリスクが高くなります。 IE7にコンテンツタイプのスニッフィングを行わせるMIMEタイプは避けてください(リストについては、Barth et alのペーパーを参照してください。

  3. ユーザー提供のコンテンツを提供するときは、アクティブなコードの実行をトリガーする可能性がある安全でないMIMEタイプのコンテンツを提供しないでください。たとえば、text/htmlapplication/x-shockwave-flashは特権コードを含む可能性があるため、これらはすべて避けてください。残念ながら、サイトからユーザー提供のFlashコンテンツを提供するのは安全ではないと思います。

  4. ユーザー提供のコンテンツを提供する場合は、X-Content-Type-Options: nosniffヘッダーとContent-Type:ヘッダーを含めて、IEの一部のバージョンでコンテンツタイプのスニッフィングを無効にします。

  5. ブラウザでの表示が想定されていないコンテンツについては、ブラウザでファイルのダウンロードとして処理されるようにマークを付けます。たとえば、Content-Disposition: attachmentヘッダーを追加します。

(これが煩わしいように聞こえる場合は、間違いありません。長年Web標準に違反し、それについて何かをするための嘆願を無視した不必要なデフォルト設定を含めたことで、Apacheの人々を非難します。残念ながら、今では手遅れです。危険なことを行うブラウザの大規模な展開ベースで。)

16
D.W.

それで十分だと思います。ただし、私はneverにアップロードしたファイルを、Webサーバーから直接アクセスできるディレクトリに配置します。ダウンロードスクリプトを使用してユーザーがファイルにアクセスできるようにします。このように、誰かがなんらかの実行可能ファイルをアップロードしても、実行されません。

ちなみに「ファイル」を呼び出すときは十分注意してください。ユーザーが指定したファイル名が引数である場合は、system()で使用する前に適切にエスケープしてください。

4
chris

おそらく安全ではありません。コンテンツタイプスニファをだまして、ファイルが間違ったコンテンツタイプであると信じ込ませるさまざまな攻撃があります。これは特に悪名高い例です:

http://adblockplus.org/blog/the-hazards-of-mime-sniffing

前のポスターの提案は、悪意のあるスクリプトからサーバーを保護するのに適しています。アップロードされたファイルをWebルートの外部に移動し、それらを送信するスクリプトを記述しますユーザー。 Webサーバーまたはランタイムがユーザーのアップロードしたファイルを実行するのを避けたいと考えています。言語を指定しませんでしたが、PHPここに例があります:

http://php.net/manual/en/function.readfile.php

「ファイルの安全性」で見落とされがちなもう1つの側面は、ユーザーのファイルを安全に保つことです。他のユーザーによってアップロードされたファイルをユーザーにダウンロードさせる場合、悪意のあるユーザーがサイトを使用してマルウェアを拡散する可能性があります。この場合、AVでスキャンできるようになるまで、アップロードされたファイルを隔離する必要があります。

4
Mark E. Haase