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
SameOrigin外にsvgファイルがある場合
- cspヘッダなし
- content-security-policy: default-src 'self'
- content-security-policy: default-src 'self'; object-src *;
- content-security-policy: default-src 'self'; frame-src *;
- content-security-policy: default-src 'self'; img-src *;
結論
- svgをcspのどのポリシーに当たるかはタグで見ているようです。
- object,embed,iframe,ではcspヘッダがない時と同様にjavascriptが実行されています。(写真にはコンソールは写っていませんが実行されています)
- script-srcについては記述していないにも関わらず、外部スクリプト(svgが参照している別スクリプト)も実行されています。
- document.domain+':'+location.portは0.0.0.0:8888でした。
SameOrigin内にsvgファイルがあり別オリジンファイルを参照している場合
ここではobjectとinline svgのみ取り上げます。
- cspヘッダなし
- content-security-policy: default-src 'self'
上の円はstyle属性で指定しているため、inlineのほうはinline styleとして弾かれています。
下の円はclassで指定しており、そのクラス宣言はオリジンの違うcssでなされています。inlineのほうではhtmlヘッダ内でlinkしているため弾かれています。objectのほうはsvg内でxml-stylesheetを使っていますが反映されています。
猫の画像は別オリジンのファイルを参照しているため弾かれています。
objectタグに注目してみる
問題はobjectで入れられたsvgファイルが別オリジンのスクリプトを参照しており、それがCSP下で動作しているということです。
document.domain+':'+location.portは0.0.0.0:8000でした。
firefox26だけでなくIE11,opera11,chrome31でも確認しました。
https://gist.github.com/cocu/8104643
iframeでも許可しているオリジンを一度通した後は別オリジンでもcspに引っかからないようです。
(たぶん既知だろうとは思うのですが私は知りませんでした。よいページや文書があれば教えていただければ喜びます)