15
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

WESEEKAdvent Calendar 2020

Day 1

実際に発生したSVGを利用したXSSについて

Last updated at Posted at 2020-12-01

この記事は WESEEK Advent Calendar 2020 1日目の記事です。

SVGを利用したXSS

概要

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

前提知識

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

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

参考

SVGとは

今回報告された脆弱性

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

GROWI では、 ページに添付された SVG ファイルは SVG として DB 上に保存されますが、
レンダリングされる時は img タグを使用します。
5fbe787f36ac6300497c222a.png
そのため、ページを閲覧するだけであれば 悪意のあるスクリプトは実行されません。

しかし、添付された AttachmentID を使用した url、 https://tips.weseek.co.jp/attachment/5fbe7a0736ac6300497c224e にアクセスすることで、SVG をブラウザに直接表示することが可能です。
5fbe86ea36ac6300497c2349.png
(AttachmentID を知らなくても、添付データ一覧のリンクを押すことで上記の url にアクセスされます。)

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

対策方法

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

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

参考

まとめ

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

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

※この記事は WESEEK Tips wiki に 2020/11/26 に投稿された記事の転載です。
Tips wiki では、IT企業の技術的な情報やプロジェクトの情報を公開可能な範囲で公開してます。

参考資料

15
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?