Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CSP による防御とリアルワールドレポート収集/csp-and-real-world-reporting

1ff811939fd0923df8321ec6d8bf9d4b?s=47 Jxck
February 03, 2017

CSP による防御とリアルワールドレポート収集/csp-and-real-world-reporting

Recruit Tech Night #rtechnight 2017/2/3

1ff811939fd0923df8321ec6d8bf9d4b?s=128

Jxck

February 03, 2017
Tweet

Transcript

  1. CSP real world reporting Recruit Tech Night #rtechnight 2017/02/03

  2. Jack

  3. P rotein S teroid 3 C ontent

  4. 4 C ontent S teroid P rotein S ecurity P

    olicy
  5. 5

  6. 6 Policy of Security for Content • This content is

    allowed to ◦ exec inline script ? ◦ load assets from origin xxx ? ◦ embend iframe ? ◦ mixed content ? ◦ etc
  7. 7 How to apply CSP • via Header • via

    Meta Tag Content-Security-Policy: $policy <meta http-equiv=”Content-Security-Policy” content=”$policy” >
  8. 8 CSP directives • connect-src • font-src • frame-src •

    img-src • manifest-src • media-src • object-src • script-src • style-src • worker-src どこから読み込めるかの設定 ex) img-src ‘self’ https://jxck.io (同じ Origin と https://jxck.io のみ画像を許可) default-src は指定しない場合のフォー ルバックとして働く。
  9. 9 CSP keywords • ‘self’ • ‘none’ • ‘unsafe-inline’ •

    ‘unsafe-eval’ <script>, <style> を利用した インラインの実行や、 eval 自 体もブロックされるため、明示 的に許可するには unsafe-* を 使う。
  10. 10 Most Powerful Policy • can I have… ◦ jquery

    from cdn ? :No ◦ google anlytics ? :No ◦ youtube? :No ◦ iframe... :NO! ◦ inli :Never !! Content-Security-Policy: default-src ‘self’
  11. 11 Example: XSS <meta http-equiv="Content-Security-Policy" content="default-src 'self'">

  12. No more Escape Input ? • 本質的に攻撃を防いでいるわけではない ◦ CSP に対応してないクライアントもある

    • ポリシー違反を不活性にするだけ ◦ ポリシーに穴があれば攻撃は成り立つ • これまでのセキュリティ対策との合わせ技 ◦ 防ぎきれなかった攻撃を不活性にする最後の砦 12
  13. 13 case study: github.com

  14. It’s really works ?? 14

  15. report-uri 15 • Send Report as JSON to URI Content-Security-Policy:

    default-src ‘self’; report-uri https://report-server/... { "csp-report": { "document-uri": "発生場所", "referrer": "リファラ", "blocked-uri": "防いだもの", "violated-directive": "違反していたディレクティブ ", "original-policy": "元となるポリシー", } }
  16. Report doesn’t tells me about attack • 何が起こったかは分かる ◦ ブロックされたもの

    ◦ それを引きおこしたポリシー • どうして起こったかはわからない ◦ 攻撃か?それ以外か? • その結果ユーザがどういう体験をしたかもわかりにくい ◦ 広告が見えなかった? ◦ 登録ができなかった? 16
  17. It’s really… OK ...? 17

  18. Too strict to deploy immediate • ポリシーが妥当かをチェックするのは難しい ◦ ステージングなどでやってみるしかない •

    リアルワールドでの使われ方は多様 ◦ どんなブラウザをどんな設定で使ってるか不明 • いきなり本番で有効にするのは怖い ◦ ユーザが不都合な現象に出会わないか。。 ◦ 攻撃が発生するよりも怖いかもしれない。。 18
  19. CSP-Report-Only • CSP を適用するがブロックはしない ◦ レポートを送るだけ ◦ 実際にどんなレポートが来るかを解析できる • いつ外すか?

    ◦ ポリシーに自身が持てたら ◦ 無理に Report-Only を外す必要もないかも ◦ 何が起こってるか分かるだけでも前進してる 19
  20. 一年ほどやってみた 20

  21. blog.jxck.io 21 • basically static contents only ◦ no <input>

    ◦ no Dynamic Generated ◦ no CDN • 基本的に XSS などの発生は考えにくい ◦ その条件でもレポートがあるのか ◦ あるとすればどんなものかを調査 ◦ <input> があるサービスではもっと増えるだろう
  22. Current Settings 22 content-security-policy-report-only: default-src 'self' https://jxck.io https://*.jxck.io https://www.google-analytics.co m

    ; child-src https://blog.jxck.io https://www.youtube.com ; connect-src wss://ws.jxck.io ; report-uri https://jxck.report-uri.io/...
  23. 23 CSP report (2016/3 ~ now) deploy fixup csp setting

    non critical reports
  24. 24 CSP Report case#1 • inline style in FF view-source://

    { "csp-report": { "blocked-uri": "self", "document-uri": "view-source", "original-policy": "...", "script-sample": "-moz-tab-size: 4", "source-file": "view-source:https://blog.jxck.io/entries/...", "violated-directive": "default-src view-source:// ..." } }
  25. 25 CSP Report case#1 • inline style in FF view-source://

  26. 26 CSP Report case#2 • inline style in Chrome .txt,

    .md, .xml { "csp-report": { "document-uri": "https://jxck.io/humans.txt", "referrer": "", "violated-directive": "style-src", "effective-directive": "style-src", "original-policy":"default-src 'self' https://*.jxck.io...", "disposition":"report", "blocked-uri":"inline", "line-number":1, "status-code":0 } }
  27. 27 CSP Report case#2 • inline style in Chrome .txt,

    .md, .xml
  28. 28 CSP Report case#3 • about://blank { "csp-report": { "document-uri":

    "about://blank", "violated-directive": "default-src 'self' https://jxck.io...", "effective-directive": "img-src", "original-policy": "default-src 'self' https://jxck.io…", "blocked-uri": "data", "status-code": 0 } }
  29. 29 CSP Report case#2 • browser-extension { "csp-report": { "document-uri":

    "https://blog.jxck.io/entries/...", "violated-directive": "default-src 'self' https://jxck.io ...", "effective-directive": "img-src", "original-policy": "default-src 'self' https://jxck.io ...", "blocked-uri": "ms-browser-extension", "status-code": 0 } }
  30. 30 CSP Report case#2 • append script via bookmarklet (maybe)

    { "csp-report": { "document-uri": "https://blog.jxck.io/entries/...", "referrer": "https://blog.jxck.io/", "violated-directive": "script-src", "effective-directive": "script-src", "original-policy": "default-src 'self' https://jxck.io...", "disposition": "report", "blocked-uri": "https://code.jquery.com/jquery-3.0.0.min.js", "line-number": 1, "column-number": 108, "status-code": 0 } }
  31. More and More... 31

  32. 32 Protected? / Clippled? • ほとんどの違反は攻撃には見えない ◦ 本当に全部ブロックすべき? ◦ ユーザに不便を強いてないか?

    • 基本的に開発者向けのサイト ◦ コンテンツはいじられる前提 ◦ bookmarklets, extentions, localproxy etc ◦ レポート収集くらいがちょうど良さそう • Protected / Clippled ◦ コンテンツ次第としか言えない ◦ Github は思い切ってるなぁ
  33. Mixed Contents 33

  34. Finding Mixed Contents 34 • Mixed Contents ◦ HTTPS コンテンツ内で

    HTTP コンテンツを読み込む ◦ MITM されてるかもしれない(安全を保証できない) ◦ URL バーが緑ではなくなる • Active ◦ 元の DOM を書き換えられる(script, iframe etc) ◦ ブロックされる • Passive ◦ 元の DOM は書き換えられない(img, video, audio etc) ◦ エラーはでるがブロックされない
  35. HTTPS 移行と Mixed Contents 35 • Mixed Contents のよくあるパターン ◦

    Consumer Generated Media (ユーザの埋めた img など) ◦ Ad (広告の iframe など) ◦ Legacy Hard Coded URL (古い新聞社 など) • 勢いで HTTPS 移行すると ◦ insecure 表示になって信用を失う ◦ ユーザの作ったコンテンツが壊れる ◦ 広告が見えなくて収入がががが ◦ 全部の URL 書き換えるの、、マジ無理、、
  36. Upgrade-Insecure-Request 36 • http:// を https:// にブラウザが読み換える ◦ https:// がなければ

    404 になる ◦ ただし、絶対に mixed contents にならない • サーバの対応だけで移行できる ◦ コンテンツを書き換えないで良い ◦ https にできてないものを access.log で見つけられる Content-Security-Policy: Upgrade-Insecure-Requests
  37. Block-All-Mixed-Contents 37 • Passive でもブロックする ◦ コンテンツは壊れるかもしれない ◦ ただし、絶対に mixed

    contents にならない • CSP Report と組み合わせられる ◦ Report-Only にすればコンテツに影響が出ない ◦ https にできてないものを csp reoprt で見つけられる Content-Security-Policy: Block-All-Mixed-Contents
  38. Report Server 38

  39. 39 report-uri.io • not recommended (personaly) ◦ UI が ◦ソ

    ◦ 同時に Report をたくさん送ると 500 返すことが ◦ 半年以前のデータが表示できない? ◦ HTTP ヘッダが見えないので UA がわからない ◦ 過去のレポートをエクスポートできない • do yourself ◦ POST 受け取るシンプルなエンドポイントでよい ◦ 処理は kibana, grafana, big query などで ◦ Google Analytics がやってくれると嬉しい
  40. 40 Report Analyze • ほとんどが設定ミス ◦ ステージングとプロダクションで分けよう ◦ フレームワーク/CMS での自動化に期待

    • Attacks を見つけるのは難しい ◦ 難、、無理じゃね? ◦ でも傾向には価値がある ◦ AI とかに期待
  41. One More Thing 41

  42. HTTP Public Key Pinning 42 • 意図してない公開鍵での表示を防ぐ ◦ CA インシデントの多発により提案された

    ◦ 主に Google が怒って入れた • 運用が難しい ◦ 証明書が変わると表示されなくなる場合も ◦ バックアップのハッシュを事前にやっておくべき Public-Key-Pins: pin-sha256=”#{hash-of-public-key}”
  43. さすがに来ないだろ 43

  44. 来た 44

  45. this is Real World Web 45

  46. May the Safe be with Web 46

  47. Jack