web-dev-qa-db-ja.com

SVG攻撃から保護するために、HTMLフィルターは何をする必要がありますか?

私は最近、SVG(Scalable Vector Graphics)画像がWebへの微妙な攻撃の多くの機会をもたらすことを学びました。 (以下の用紙を参照してください。)SVG画像は画像のように見える場合がありますが、ファイル形式には実際にはJavaScriptを含めることができ、HTML、Flash、またはその他のコンテンツのロードまたは実行をトリガーできます。したがって、SVG形式は、Webページに悪意のあるコンテンツを忍び込ませる、またはHTMLフィルターをバイパスする新しい潜在的な方法を導入します。

ユーザーが提供したHTMLをサニタイズするHTMLフィルターを書いています。 SVG画像を使用してフィルターをバイパスできないようにするには、HTMLフィルターで何をする必要がありますか?ブロックする必要のあるHTMLタグと属性は何ですか? CSSをフィルタリングするときに何かする必要がありますか?すべてのSVG画像を単純にブロックしたい場合、SVGをHTMLドキュメントに埋め込むにはどのような方法がありますか?

参照:

SVGアップロードでのエクスプロイトまたはその他のセキュリティリスク? (別の、しかし関連する質問)および Mike Samuelの回答 も参照してください。

15
D.W.

私の知る限り、次の方法を使用してsvgを参照できます。

  1. _<img src="http://example.com/some-svg.svg">_
  2. CSSスタイルのタグ。例えばstyle="background-image:url(http://example.com/some-svg.svg)
  3. 拡張機能でのフィルタリングでは不十分です。 HTTPヘッダーは、拡張子ではなくコンテンツタイプを決定します。 _.jpg_ファイルはSVGとして読み取ることができます。したがって、リモートイメージは危険です。
  4. SVGを含む任意のXML形式をWebページにインライン化できます。

上記のすべての項目をチェックしても、SVGインジェクションが可能でないかどうかはわかりません。ブラックリストではなくホワイトリストに登録することをお勧めします。

8
jocewyn

良い一日!

編集:リンクが解除されたリンクについて申し訳ありません-これに返信するためにアカウントを作成したばかりであることを考えると、 1つの投稿に2つ以上のリンクを投稿するには「十分」ではない...

この投稿は私が考える最新のものではありませんが、それでも返信します。私はあなたがリンクしたこの論文の著者の一人です。そして、私は、このスレッドで与えられたアドバイスのいくつかは意味があり、よく考えられているが、100%正確ではないことに気づきました。

たとえば、Operaは、<img>またはCSSバックグラウンドを介して埋め込まれたSVGを処理するときに信頼できる安全性を提供していません。ここにその例を示します。<img>を介して埋め込まれたSVGを作成したファンジーのために、PDFを含み、skype:のURLを開いて呼び出します。

  • http://heideri.ch/opera/
  • http://www.slideshare.net/x00mario/the-image-that-called-me

SVGPurifierを作成しました。これは、HTMLPurifierを拡張してSVGのクリーニングに対応できるようにする一連のルールです。これらのルールを書いたとき(必要に応じてそれらを含めることができます。知らせて、Githubに載せます)、テストしたすべてのブラウザーでSVGの扱いが異なりました。また、それが埋め込まれた方法にも強く依存します:インライン、<embed>/<object><applet><img>、SVGのSVG、CSS backgroundlist-styleおよびcontent...

脅威モデルが主にXSS以降を含む場合、SVGで無害なサブセットを見つけることが可能であることがわかりました。それでも脅威モデルに、UIのオーバーラップの緩和、サイドチャネル、履歴盗用攻撃などが含まれている場合は、少し難しくなります。たとえば、次の面白いスニペットは、非常に難読化されたJavaScript URIハンドラーでXSSを生成する方法を示しています。http://jsbin.com/uxadon

次に、インラインSVGがあります。私の個人的な意見では、これはW3C/WHATWGがこれまでに持った中で最悪のアイデアの1つでした。 HTML5文書内のXML文書を許可し、HTML5解析ルールに準拠するように強制します。セキュリティ違反の悪夢です。インラインSVGと、含まれているJavaScriptのわかりやすい例を1つ示します。これは、何を処理するかを示しています。http://Pastebin.com/rmbiqZgd

セキュリティ/ XSSのコンテキストでSVGがどれほどひどいのかということについて、このすべてが最終的に悲しむことにならないように、いくつかのアドバイスを紹介します。このHTMLフィルターに本当に取り組んでいる、または引き続き取り組んでいる場合は、次のことを検討してください。

  • 私たちがそれをハンマーで打つことができるいくつかのテストを公開してください。

  • ルールセットを柔軟にし、毎日新しい迂回を期待します。

  • インラインSVGをフィルタリングすることの意味を必ず知っておいてください。

  • HTMLPurifierアプローチが最善であるかどうかを確認してください。ホワイトリストに登録し、ブラックリストに登録しないでください。

  • すべてのコストで正規表現を避けます。正規表現を使用する場所ではありません。

  • サブセットでは、関連するすべてのブラウザでセキュリティの問題がテストされている要素のみが許可されていることを確認してください。 SVGキーロガーを覚えていますか? http://html5sec.org/#132

  • すでに公開されているSVGベースの攻撃を調査し、定期的に詳細を見つける準備をしてください:http://html5sec.org/?svg

私は、適切にメンテナンスされ、おそらくは機能しているHTML + SVGフィルターを作成しようとする誰かのアイデアが好きで、それをテストして満足します。すでに-そしてSVGはまったく新しい難易度のレイヤーを追加するだけです。

11
x00mario