The face of X-Content-Type-Options which you may not know

The face of X-Content-Type-Options which you may not know

LT向け資料。ざっっっっっっくりなのでまさかりはマジかんべん。 #roppongijs #2

6aaffafb38a160209c9164da25b3a3f3?s=128

Yu Yagihashi

April 24, 2018
Tweet

Transcript

  1. あなたの知らない(かもしれない)
 X-Content-Type-Options Yu YAGIHASHI(@yagihashoo) @Roppongi.js#2

  2. None
  3. None
  4. Content Sniffing • Content-Typeヘッダの内容に関係なく、レスポンスボディの内容に
 応じてIEがContent-Typeを勝手に判断する機能
 →と思っていませんか? • 正確なContent-Typeが設定されていても無視されるのが特に悪質で、
 その解決策としてX-Content-Type-Optionsヘッダによるこの機能の
 制御・無効化が一般的となった

    • 具体的には、HTMLタグを含む画像ファイルを開くとHTMLとして
 認識されてしまうことによるXSSなど
  5. FirefoxとかChromeにもあるよ • 画像を開くとHTMLに!みたいなトンデモ仕様はない(はず) • (LTなので)細かい挙動は調べていないが、どちらかというと内容よりも
 コンテキストに応じて既存のContent-Typeヘッダの値を無視し、
 別のContent-Typeとしてロードする挙動をするように見える • 例えば、.jsファイルのContent-Typeがなぜかtext/htmlであっても
 script要素のsrc属性で指定し、ロードできるなど

  6. FirefoxとかChromeにもあるよ HTML PNGファイルだよ〜 は?JSとして読むわ <script src=“hoge.png”></script> \x89PNG~~~~~~ Content-Type: image/png

  7. ごく一般的なGIFファイル GIF8=1;alert("あなたの知らない(かもしれない)X-Content-Type-Options")

  8. fileコマンドでも

  9. PHPでも

  10. シナリオ HTML Content-Security-Policy: default-src ‘self’ GIF(仮) <script src=“hoge.gif”></script> なんか悪い感じのJSコード GIF(仮)

  11. シナリオ HTML Content-Security-Policy: default-src ‘self’ GIF(仮) <script src=“hoge.gif”></script> なんか悪い感じのJSコード GIF(仮)

    XSSの脆弱性があるが、いい感じのCSPヘッダに よって悪い感じのコードはそもそも動かない
  12. シナリオ HTML Content-Security-Policy: default-src ‘self’ GIF(仮) <script src=“hoge.gif”></script> なんか悪い感じのJSコード GIF(仮)

    攻撃者が自由に画像ファイルを
 同一オリジンにアップロードできる
  13. シナリオ HTML Content-Security-Policy: default-src ‘self’ GIF(仮) <script src=“hoge.gif”></script> なんか悪い感じのJSコード GIF(仮)

    XSSで埋め込んだscript要素から
 同一オリジンにアップロードした
 悪い感じのGIFファイルを参照する
  14. シナリオ HTML Content-Security-Policy: default-src ‘self’ GIF(仮) <script src=“hoge.gif”></script> なんか悪い感じのJSコード GIF(仮)

    CSPでいい感じなのに
 XSSできてしまう!!!
  15. さいごに • やることは変わらないです。X-C-T-O: nosniff、ちゃんと付けましょう。