cocuh's note

type(あうとぷっと) -> 駄文

SVGでXSSしてみる。その2

スクリプトのSVGがCSP(Content-Security-Policy)下でどのように動くのかを検証したのでまとめてみました。

『SVGでXSSしてみる。その1』のつづきです
前回はsvgをhtmlに取り入れるタグをそれぞれ試して挙動がどのように変わるかを見ました。

今回はそれをCSP下でためしてみます。環境はfirefox26です。
どちらかというと試したことをそのまま乗っけてる実験レポートに近いものなのでもう一回まとめないといけないかなと思ってます。


まず、CSP下で試すにおいて、2つの場合があります。
svgファイル自身がSameOrigin内にある場合と外にある場合です。
それぞれためしてみます。

CSPに関してはw3cとmdnにドキュメントがあるのでそちらを。(私もきちんと読んでるわけではないですが)
https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#directives
https://developer.mozilla.org/ja/docs/Security/CSP/CSP_policy_directives

SameOriginsvgファイルがある場合

f:id:cocu_628496:20131224014319p:plain

  • cspヘッダなし

f:id:cocu_628496:20131224015940j:plain

  • content-security-policy: default-src 'self'

f:id:cocu_628496:20131224015957j:plain

  • content-security-policy: default-src 'self'; object-src *;

f:id:cocu_628496:20131224020042j:plain

  • content-security-policy: default-src 'self'; frame-src *;

f:id:cocu_628496:20131224020132j:plain

  • content-security-policy: default-src 'self'; img-src *;

f:id:cocu_628496:20131224020144j:plain

結論
  • svgをcspのどのポリシーに当たるかはタグで見ているようです。
  • object,embed,iframe,ではcspヘッダがない時と同様にjavascriptが実行されています。(写真にはコンソールは写っていませんが実行されています)
  • script-srcについては記述していないにも関わらず、外部スクリプト(svgが参照している別スクリプト)も実行されています。
  • document.domain+':'+location.portは0.0.0.0:8888でした。




SameOriginsvgファイルがあり別オリジンファイルを参照している場合

f:id:cocu_628496:20131224014121p:plain
ここではobjectとinline svgのみ取り上げます。

  • cspヘッダなし

f:id:cocu_628496:20131224030826j:plain

  • content-security-policy: default-src 'self'

f:id:cocu_628496:20131224052537j:plain
上の円はstyle属性で指定しているため、inlineのほうはinline styleとして弾かれています。
下の円はclassで指定しており、そのクラス宣言はオリジンの違うcssでなされています。inlineのほうではhtmlヘッダ内でlinkしているため弾かれています。objectのほうはsvg内でxml-stylesheetを使っていますが反映されています。
猫の画像は別オリジンのファイルを参照しているため弾かれています。

objectタグに注目してみる

f:id:cocu_628496:20131224055413j:plain
問題はobjectで入れられたsvgファイルが別オリジンのスクリプトを参照しており、それがCSP下で動作しているということです。
document.domain+':'+location.portは0.0.0.0:8000でした。
firefox26だけでなくIE11,opera11,chrome31でも確認しました。
https://gist.github.com/cocu/8104643

iframeでも許可しているオリジンを一度通した後は別オリジンでもcspに引っかからないようです。
(たぶん既知だろうとは思うのですが私は知りませんでした。よいページや文書があれば教えていただければ喜びます)

追記(2013 12/25 07:00)

svg側のほうにCSPヘッダがない状態で検証していたため、このようなことがおきました。
svg側にもアクセス制御を入れれば防止出来ます。


怖いなと思ったことは一見画像ファイルとして扱われがちなsvgですが、使うときはiframeと同じぐらい注意して扱わないとこわいものなのかもしれないです。

この検証は片手間にやったものなので変なところで落としてることがありそうだと思っていますました。
じっくりsvgとCSPの仕様を読んだり、落ち着いて一つ一つ試したりしてみたいと思います。