SVGを利用したXSS

概要

実際に GROWI で存在していた脆弱性。
SVG を利用した XSS を元にその仕組みと解決方法をまとめます。

前提知識

SVG は画像を記述する XML ファイルです。
一般的な PNG や GIF、 Javascript を埋め込むことが可能です。

埋め込んだ Javascript が実行されるのは画像が表示されるタイミングです。

参考

SVGとは

今回報告された脆弱性

SVG は、img タグを使用して表示する限りは画像として扱われます。
そのため、動的に SVG のスタイルを変更させることはできませんが、 悪意のあるスクリプトを防ぐことが可能です。

GROWI では、 ページに添付された SVG ファイルは SVG として DB 上に保存されますが、
レンダリングされる時は img タグを使用します。

スクリーンショット 2020-11-26 0.28.41.png

そのため、ページを閲覧するだけであれば 悪意のあるスクリプトは実行されません。

しかし、添付された AttachmentID を使用した url、 https://tips.weseek.co.jp/attachment/5fbe7a0736ac6300497c224e にアクセスすることで、SVG をブラウザに直接表示することが可能です。

スクリーンショット 2020-11-26 1.31.25.png (AttachmentID を知らなくても、添付データ一覧のリンクを押すことで上記の url にアクセスされます。)

SVG を直接表示すると埋め込まれたスクリプトが実行されてしまいます。 過去の GROWI では、直接表示された SVG のスクリプトを対策していなかったため、脆弱性として報告されました。

対策方法

対策方法として、 CSP の script-src に unsafe-hashes を指定する方法を取りました。
unsafe-hashes によって指定された hash 値以外のハッシュ値をもつスクリプトの実行を防げます。

hash 値を一切指定していないため、全てのスクリプトを防ぐことになります。
もし、ユーザーが意図的に script を実行したければ、 addEventListener を使う必要があります。

参考

まとめ

報告をいただいた脆弱性は JVN#56450373 GROWI における複数の脆弱性 external_link にて対策方法と共に公開されました。
対策として、v4.1.5 へのアップデートを推奨しております。

今回の脆弱性は、SVG のアップロードをする必要があるため、アップロードの権限を持たない外部のユーザーが脆弱性を利用して攻撃することはできませんが、典型的な XSS として良い例だと思います。

参考資料

https://digi.ninja/blog/svg_xss.php external_link