web-dev-qa-db-ja.com

どうすれば画像の脆弱性から保護できますか?

私はこの質問を読んだところです 破損した画像の脆弱性とは何ですか?それはどのように機能しますか? (GIFAR、JavaScriptを使用したEXIFデータなど)

自分と自分のWebサイトのユーザーをどのように保護できるかを考えています。

私のユーザーは、自分の画像(フォーラムアバター、メッセージの一部としての写真など)をアップロードできます。これらの写真は、対応するページの他のすべての訪問者に表示されます。

アップロードされたファイルが本物のプレーンな画像であり、他のものではないことを確認するにはどうすればよいですか?特定の脆弱性を克服する方法について尋ねているのではなく、ファイルにプレーンイメージデータしか含まれていないことをどのように確認できるのですか? (したがって、「まだ見つかる」脆弱性からも保護されます)

25
xun

私はいくつかの提案があります:

  1. 別のドメインを使用します。ユーザー提供の画像をホストするためにのみ使用される別のドメインで画像をホストします。

    これにより、ブラウザレベルの攻撃の多くが影響を限定できることが保証されます。たとえば、ユーザーのブラウザがコンテンツタイプのスニッフィング攻撃に対して脆弱であるため、一部のブラウザが悪意のあるJavaScriptを含むHTMLとして処理する画像をアップロードすることが可能であるとします。この防御により、悪意のあるJavascriptは他のユーザーの画像のみを改ざんでき、サイトのCookieやコンテンツ、またはその他のセキュリティ上重要なものにアクセスできないことが保証されます。ただし、これは、脆弱性(バッファオーバーラン、ダブルフリーなど)を悪用してネイティブコードを実行するコードインジェクション攻撃を防御しません。

  2. コンテンツタイプのスニッフィングを防御します。コンテンツタイプのスニッフィング攻撃を防御するために、他の場所で概説した プラクティス に従います。最も重要なのは、画像を提供するHTTP応答に正しいContent-Type:ヘッダーを設定することです。 IEの一部のバージョンがコンテンツタイプのスニッフィングを試行しないようにするために、X-Content-Type-Options: nosniffヘッダーを含めることも役立ちます。

  3. 固定形式に変換します。入力画像をビットマップに変換し(ビットマップデータのみを保持し、余分な注釈をすべて破棄します)、ビットマップを目的の出力形式に変換します。これを行う合理的な方法の1つは、PBM形式に変換してからPNGに変換することです。

    これは攻撃を阻止する信頼できる方法ではありませんが、攻撃者が利用できる攻撃対象の一部を減らします。たとえば、攻撃者が画像パーサーの脆弱性を悪用するために作成された悪意のあるメタデータを添付するのを防ぎます。また、攻撃者が画像形式を選択することもできません。この防御を無効にするには、攻撃者は画像のピクセルデータを読み取るコードで、PNGデコーダーの脆弱性を見つける必要があります。これにより、攻撃者がデコーダーの脆弱性を利用して、他の画像形式や、メタデータを読み取るPNGパーサーの一部に悪用することを防ぎます。したがって、リスクを軽減するのに役立つ可能性はありますが、この防御だけでは十分ではないと思います。

  4. ランダム化を検討してください。画像にランダムノイズを挿入することを検討してください。たとえば、すべてのピクセルをループし、そのピクセルの3つの強度(RGBに対応)ごとに、1を加算するか、1を減算するか、その強度値のみを残すかをランダムに選択できます。これは画像にほんの少しのノイズを導入しますが、できれば視聴者に気付かれるには不十分です。また、運が良ければ、攻撃者は変換の結果を完全に予測できないため、一部の攻撃が成功する可能性が低くなる可能性があります。この防御は非常にヒューリスティックであり、確実に効果的であるとは限りませんが、私が概説した他の防御と組み合わせて使用​​すると、一種のベルトアンドサスペンダーの多層防御戦略として役立つ可能性があります。ただし、この防御だけではおそらく十分ではないことを理解してください。

これらのリスクとサイトの感度についてどれほど懸念しているかに応じて、4つすべてを実行する必要はありません。ブラウザーのコードインジェクションの脆弱性を心配していない場合は、#1と#2だけを実行できます。ブラウザのコードインジェクションの脆弱性に対する部分的な保護が必要な場合は、#1、#2、および#3だけを実行できます。

20
D.W.

考えられる解決策の1つは、サイトに画像を表示する前に、単純な既知の形式としてファイルを書き直すことです。例えば誰かが画像を(おそらくエクスプロイトで)アップロードすると、すぐに、サーバーが安全な方法で画像を読み取り、新しい画像を書き込みます。アップロードされた画像を読み取るために使用したプログラム/スクリプトがカラーデータのみを読み取る場合、新しい画像にはカラーデータのみを含めることができます。

6
dvb

遠近法によると思いますか?エンドユーザーの観点から見ると、画像またはその他のソースからのエクスプロイト(espメモリ/バッファオーバーフロー)から保護する(ここでも、バッファオーバーフローの脆弱性をエクスプロイトする)には、メモリ保護機能を完全に有効にすることをお勧めします。 Windowsでは、DEP(NX/XDに基づく)やASLRなどのメカニズムを利用して、バッファオーバーランによるコード実行の可能性を減らします。 DEPは、単にオプトインするだけでなく、すべてのアプリケーションでデフォルトでオンにすることができます。

これは、ウイルス対策の使用、ソフトウェアへのパッチの適用、その他の明らかなことの通常の提案に追加されます。

アプリケーションをサンドボックス化してダメージを制限する(エクスプロイト後)オプションがある場合、それも実行可能な手段です。少なくとも、最小限の特権の原則を利用できます(たとえば、不要な場所で管理アカウントを使用しないなど)。

お役に立てば幸いです。

4
Garrett