4

私は非常に機密性の高い情報を含むサーバーを持っているので、セキュリティは大きな問題です。ユーザーは動画をアップロードできる必要があります。ユーザーがファイルをアップロードできるようにすることは、ユーザーが非ビデオをアップロードしないようにする100%の方法がないため、セキュリティ上の脅威となることを私は知っています。しかし、私は明らかにサーバーが保持するファイルを選択できます。

ファイル拡張子をチェックするだけでは不十分であることを私は知っています。MIMEタイプをチェックする方が良いですが、それでも偽造される可能性があります。では、ファイルがビデオであるかどうかを確認するにはどうすればよいですか?

4

4 に答える 4

9

再生してください!

確実にする唯一の方法は、問題のタイプのビデオをデコードするコードを用意し、それを確認することです(そして、ゼロ以外の継続時間など、賢明な結果があることを確認してください)。

それ以外の場合でも、リスクは低いです。

悪意のないシナリオ:

  1. アップローダーは、video/*コンテンツタイプでビデオをアップロードします。
  2. オクテットとコンテンツタイプを保存します。
  3. ダウンローダーはビデオをダウンロードし、受け取ったコンテンツタイプを使用します。
  4. ダウンローダーはビデオを見る(またはコーデックなどについて不平を言う)

悪意のあるシナリオ1:

  1. Uploaderは、ビデオ/*コンテンツタイプを使用して厄介なトロイの木馬をアップロードします。
  2. オクテットとコンテンツタイプを保存します。
  3. ダウンローダーは厄介なトロイの木馬をダウンロードし、受け取ったコンテンツタイプを使用します。
  4. Downloaderは、ビデオプレーヤーで厄介なトロイの木馬を開きます。厄介なトロイの木馬はビデオではないので何もしません。ユーザーはコーデックについて不平を言います。最悪のシナリオは、独自のフォーマットのサポートの欠如についてubuntuフォーラムに暴言を書いたり、ビデオが機能しなかったためにサイトがどのように悪いかについてあなたのページにスペルト小麦のコメントを追加したりすることです。

悪意のあるシナリオ2:

  1. Uploaderは、人気のあるビデオプレーヤーでのバッファオーバーフローの問題を悪用するビデオに書き込まれる厄介なトロイの木馬をアップロードします。
  2. あなたは保存します...
  3. ダウンローダー...
  4. 上記のいずれかのようになりますが、エクスプロイトに見舞われる可能性もあります(影響を受けるプレーヤーを使用している場合)。

ただし、シナリオ2について注意すべき3つのこと:

  1. 一部のプレーヤーでも問題なく動作する可能性があるため、ビデオであるかどうかをテストしても安全性は保証されません。
  2. 脆弱性がffmpegにある場合、それがビデオであることをテストすると、サーバーがエクスプロイトに対して脆弱になる可能性があります。
  3. このタイプのエクスプロイトはまれであり、実行するのは困難です。一般的なリスクは、jpegまたはpngのアップロードとダウンロードと同じです。確かにそれは少し小さいです(実際、しばらくの間、一般的に使用されるjpegライブラリに影響を与えるこのタイプのエクスプロイトがありました)。

全体として、受け入れるコンテンツタイプのみを出力するようにし、ファイル拡張子をそれらと一致させるようにします。ユーザーがhahaha.exeというビデオ/mpegをアップロードした場合は、名前をhahaha.mpgに変更します。

編集:ああ、また:

悪意のあるシナリオ3:

アップローダーは、多くのリソースを使用する方法で一部のプレーヤーを悪用するビデオをアップロードします。この場合、ダウンローダーは単にkill-9 / ctrl-alt-delete / your-OSs-kill-them-all-of-choiceになりますが、サーバーがビデオをテストしている場合は、問題が発生する可能性があります。誰も介入して200を殺す(そしてスクリプトキディのスクリプトがさらにアップロードし続けるにつれて成長する)「ビデオ」を解釈しようとしています。

通常のビデオ処理を行うだけで、DoS機能を導入できます(ビデオ処理は結局のところ比較的重いです)。そのため、ファイルをテストすると、節約できるよりも多くの危険が生じる可能性があります。

于 2012-08-07T17:36:53.333 に答える
2

ffmpegphp拡張機能を介して呼び出すことができます:

https://github.com/char0n/ffmpeg-php/

これは基本的にの出力をラップしffmpeg、phpでチェックインできます。ただし、最初にffmpegに慣れておく必要があります。これは、それ自体がトピック全体です。ライブラリを使用したくない場合は、execを使用して自分でffmpegを実行できます。

さらに、mimetypeを確認します。JSを介して入力されたファイル内でクライアント側のファイルをチェックすることもできます(すべてのブラウザーで行われるわけではなく、これは真の検証に代わるものではありません)。

lg、

flo

于 2012-08-07T17:35:15.223 に答える
1

ユーザーは、適切なディレクトリに移動し、サーバー上で何も実行しようとしない限り、何でも安全にアップロードできます(ビデオであると想定されている場合は、何も試行されません)。マルウェアは、被害者が何らかの方法でアクティブ化しない限り、何もできません。

于 2012-08-07T17:32:02.400 に答える
0

私は、ビデオプレーヤーに、破損したビデオファイルを介して悪用される可能性のある問題がない限り、それほど心配しないことに同意します。ただし、必ずしもセキュリティ上の理由から、所有しているファイルがビデオファイルであり、すべてが有効であるかどうかを確認する必要があるとしましょう。次の手順を実行できます。

  1. 引数なしでファイルに対してffprobeを実行します。それはファイルに関するいくつかの情報を提供します。コーデック、コンテナ、期間、フレームレート、ビットレート。
  2. 次に、-show_packetsを指定してffprobeを実行します。ファイルに関するフレームごとの情報を提供する必要があります。最初のコマンドで指定されたduration*frame_rateと同じ数のビデオフレームを取得する必要があります。誰かが細工したヘッダーを与えるか、ファイルの最初のセクションが有効なビデオである可能性があるため(ffmpegとffprobeはビデオの最初の数秒のみをテストしてそのタイプを確認します)、残りは破損している可能性があるため、これを確認できます。
  3. -show_framesを指定してffprobeを実行します。これにより、各フレームのヘッダーがデコードされ、各ヘッダーが有効なビデオフレームであることが確認されます。一部のコンテナにはshow_packetsに使用できるテーブルがあるだけなので、これは追加の手順です。したがって、ffprobeは単にそのテーブルを読み取った可能性があり、それが指しているデータが破損している可能性があります。

これで、理論的には、ファイルにすべてのフレームに対してすべての有効なヘッダーが含まれているが、データが間違っている可能性がありますが、実際のコンテンツをデコードしてプレーヤーで表示することなく、これが最善の方法です。そして、それで十分で、非常に高速だと思います。

于 2012-08-09T07:03:53.027 に答える