SVGファイルは billion laughs 攻撃を受けやすいです。私たちのウェブサイトでは、ユーザーがマークダウンファイルをアップロード/送信できます。レンダリングする前に、marked.jsを通じて.mdファイルを実行します。これで、マークダウン内の画像は次のようにレンダリングされます。
<img src="https://evilsite.com/badsvg.svg"/>
ウェブページで。ブラウザは<script>
badsvg.svg
実行されません。
今evilsite.com
は提供できますbadsvg.svg
10億の笑いのペイロードが含まれています。これは、さまざまなブラウザーでの処理方法です。
Edge/IE-エンティティの拡張に制限があるため、影響を受けません(コンソールのログで確認できます)
Firefox-エンティティの拡張にも制限があるようです
Chrome-制限なし、すべてのエンティティを拡張しようとし、最終的にメモリ不足になり、タブを閉じる/閉じる以外に選択肢はありません
Chromeのこの関連バグは「修正されない」とマークされました https://bugs.chromium.org/p/chromium/issues/detail?id=617891
これはクライアント側のDOSであり、サイトは基本的にChromeのすべてのユーザーが使用できなくなります。このタイプの攻撃を防ぐにはどうすればよいとお考えですか?ユーザーが外部ドメインのリソースを参照できないようにすることは、極端な措置のようです。
回避策として、サーバーにSVGプロキシのようなものを実装し、DoSをトリガーしてすべてのSVGファイルをプロキシ経由でリンクするSVGファイルを拒否することができます。 /svgproxy?f=https://evilsite.com/badsvg.svg
。ただし、chromeユーザーのみを対象にチェックを行うことで制限できる場合でも、パフォーマンスの低下が発生します。
悪いSVGを検出するのにあまりコストがかからない方法は、メモリ制限のあるプロセスでSVGをレンダリングすることです。レンダリングが失敗した場合、そのSVGは不良です。 ImageMagickを試すこともできますが、少なくとも時々、それ自体で不良SVGを拒否します。