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

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

Jxck
February 03, 2017

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

Recruit Tech Night #rtechnight 2017/2/3

Jxck

February 03, 2017
Tweet

More Decks by Jxck

Other Decks in Technology

Transcript

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

    View Slide

  2. Jack

    View Slide

  3. P
    rotein
    S
    teroid
    3
    C
    ontent

    View Slide

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

    View Slide

  5. 5

    View Slide

  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

    View Slide

  7. 7
    How to apply CSP
    ● via Header
    ● via Meta Tag
    Content-Security-Policy: $policy
    http-equiv=”Content-Security-Policy”
    content=”$policy”
    >

    View Slide

  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 は指定しない場合のフォー
    ルバックとして働く。

    View Slide

  9. 9
    CSP keywords
    ● ‘self’
    ● ‘none’
    ● ‘unsafe-inline’
    ● ‘unsafe-eval’
    , <style> を利用した<br/>インラインの実行や、 eval 自<br/>体もブロックされるため、明示<br/>的に許可するには unsafe-* を<br/>使う。<br/>

    View Slide

  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’

    View Slide

  11. 11
    Example: XSS

    View Slide

  12. No more Escape Input ?
    ● 本質的に攻撃を防いでいるわけではない
    ○ CSP に対応してないクライアントもある
    ● ポリシー違反を不活性にするだけ
    ○ ポリシーに穴があれば攻撃は成り立つ
    ● これまでのセキュリティ対策との合わせ技
    ○ 防ぎきれなかった攻撃を不活性にする最後の砦
    12

    View Slide

  13. 13
    case study: github.com

    View Slide

  14. It’s really works ??
    14

    View Slide

  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": "元となるポリシー",
    }
    }

    View Slide

  16. Report doesn’t tells me about attack
    ● 何が起こったかは分かる
    ○ ブロックされたもの
    ○ それを引きおこしたポリシー
    ● どうして起こったかはわからない
    ○ 攻撃か?それ以外か?
    ● その結果ユーザがどういう体験をしたかもわかりにくい
    ○ 広告が見えなかった?
    ○ 登録ができなかった?
    16

    View Slide

  17. It’s really… OK ...?
    17

    View Slide

  18. Too strict to deploy immediate
    ● ポリシーが妥当かをチェックするのは難しい
    ○ ステージングなどでやってみるしかない
    ● リアルワールドでの使われ方は多様
    ○ どんなブラウザをどんな設定で使ってるか不明
    ● いきなり本番で有効にするのは怖い
    ○ ユーザが不都合な現象に出会わないか。。
    ○ 攻撃が発生するよりも怖いかもしれない。。
    18

    View Slide

  19. CSP-Report-Only
    ● CSP を適用するがブロックはしない
    ○ レポートを送るだけ
    ○ 実際にどんなレポートが来るかを解析できる
    ● いつ外すか?
    ○ ポリシーに自身が持てたら
    ○ 無理に Report-Only を外す必要もないかも
    ○ 何が起こってるか分かるだけでも前進してる
    19

    View Slide

  20. 一年ほどやってみた
    20

    View Slide

  21. blog.jxck.io
    21
    ● basically static contents only
    ○ no
    ○ no Dynamic Generated
    ○ no CDN
    ● 基本的に XSS などの発生は考えにくい
    ○ その条件でもレポートがあるのか
    ○ あるとすればどんなものかを調査
    ○ があるサービスではもっと増えるだろう

    View Slide

  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/...

    View Slide

  23. 23
    CSP report (2016/3 ~ now)
    deploy fixup csp setting non critical reports

    View Slide

  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:// ..."
    }
    }

    View Slide

  25. 25
    CSP Report case#1
    ● inline style in FF view-source://

    View Slide

  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
    }
    }

    View Slide

  27. 27
    CSP Report case#2
    ● inline style in Chrome .txt, .md, .xml

    View Slide

  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
    }
    }

    View Slide

  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
    }
    }

    View Slide

  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
    }
    }

    View Slide

  31. More and More...
    31

    View Slide

  32. 32
    Protected? / Clippled?
    ● ほとんどの違反は攻撃には見えない
    ○ 本当に全部ブロックすべき?
    ○ ユーザに不便を強いてないか?
    ● 基本的に開発者向けのサイト
    ○ コンテンツはいじられる前提
    ○ bookmarklets, extentions, localproxy etc
    ○ レポート収集くらいがちょうど良さそう
    ● Protected / Clippled
    ○ コンテンツ次第としか言えない
    ○ Github は思い切ってるなぁ

    View Slide

  33. Mixed Contents
    33

    View Slide

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

    View Slide

  35. HTTPS 移行と Mixed Contents
    35
    ● Mixed Contents のよくあるパターン
    ○ Consumer Generated Media (ユーザの埋めた img など)
    ○ Ad (広告の iframe など)
    ○ Legacy Hard Coded URL (古い新聞社 など)
    ● 勢いで HTTPS 移行すると
    ○ insecure 表示になって信用を失う
    ○ ユーザの作ったコンテンツが壊れる
    ○ 広告が見えなくて収入がががが
    ○ 全部の URL 書き換えるの、、マジ無理、、

    View Slide

  36. Upgrade-Insecure-Request
    36
    ● http:// を https:// にブラウザが読み換える
    ○ https:// がなければ 404 になる
    ○ ただし、絶対に mixed contents にならない
    ● サーバの対応だけで移行できる
    ○ コンテンツを書き換えないで良い
    ○ https にできてないものを access.log で見つけられる
    Content-Security-Policy: Upgrade-Insecure-Requests

    View Slide

  37. Block-All-Mixed-Contents
    37
    ● Passive でもブロックする
    ○ コンテンツは壊れるかもしれない
    ○ ただし、絶対に mixed contents にならない
    ● CSP Report と組み合わせられる
    ○ Report-Only にすればコンテツに影響が出ない
    ○ https にできてないものを csp reoprt で見つけられる
    Content-Security-Policy: Block-All-Mixed-Contents

    View Slide

  38. Report Server
    38

    View Slide

  39. 39
    report-uri.io
    ● not recommended (personaly)
    ○ UI が ○ソ
    ○ 同時に Report をたくさん送ると 500 返すことが
    ○ 半年以前のデータが表示できない?
    ○ HTTP ヘッダが見えないので UA がわからない
    ○ 過去のレポートをエクスポートできない
    ● do yourself
    ○ POST 受け取るシンプルなエンドポイントでよい
    ○ 処理は kibana, grafana, big query などで
    ○ Google Analytics がやってくれると嬉しい

    View Slide

  40. 40
    Report Analyze
    ● ほとんどが設定ミス
    ○ ステージングとプロダクションで分けよう
    ○ フレームワーク/CMS での自動化に期待
    ● Attacks を見つけるのは難しい
    ○ 難、、無理じゃね?
    ○ でも傾向には価値がある
    ○ AI とかに期待

    View Slide

  41. One More Thing
    41

    View Slide

  42. HTTP Public Key Pinning
    42
    ● 意図してない公開鍵での表示を防ぐ
    ○ CA インシデントの多発により提案された
    ○ 主に Google が怒って入れた
    ● 運用が難しい
    ○ 証明書が変わると表示されなくなる場合も
    ○ バックアップのハッシュを事前にやっておくべき
    Public-Key-Pins: pin-sha256=”#{hash-of-public-key}”

    View Slide

  43. さすがに来ないだろ
    43

    View Slide

  44. 来た
    44

    View Slide

  45. this is Real World Web
    45

    View Slide

  46. May the
    Safe
    be with Web
    46

    View Slide

  47. Jack

    View Slide