Recruit Tech Night #rtechnight 2017/2/3
CSPreal world reportingRecruit Tech Night#rtechnight 2017/02/03
View Slide
Jack
ProteinSteroid3Content
4ContentSteroidProteinSecurityPolicy
5
6Policy of Security for Content● This content is allowed to○ exec inline script ?○ load assets from origin xxx ?○ embend iframe ?○ mixed content ?○ etc
7How to apply CSP● via Header● via Meta TagContent-Security-Policy: $policyhttp-equiv=”Content-Security-Policy”content=”$policy”>
8CSP 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 は指定しない場合のフォールバックとして働く。
9CSP keywords● ‘self’● ‘none’● ‘unsafe-inline’● ‘unsafe-eval’, <style> を利用した<br/>インラインの実行や、 eval 自<br/>体もブロックされるため、明示<br/>的に許可するには unsafe-* を<br/>使う。<br/>
10Most Powerful Policy● can I have…○ jquery from cdn ? :No○ google anlytics ? :No○ youtube? :No○ iframe... :NO!○ inli :Never !!Content-Security-Policy: default-src ‘self’
11Example: XSS
No more Escape Input ?● 本質的に攻撃を防いでいるわけではない○ CSP に対応してないクライアントもある● ポリシー違反を不活性にするだけ○ ポリシーに穴があれば攻撃は成り立つ● これまでのセキュリティ対策との合わせ技○ 防ぎきれなかった攻撃を不活性にする最後の砦12
13case study: github.com
It’s really works ??14
report-uri15● Send Report as JSON to URIContent-Security-Policy:default-src ‘self’;report-uri https://report-server/...{"csp-report": {"document-uri": "発生場所","referrer": "リファラ","blocked-uri": "防いだもの","violated-directive": "違反していたディレクティブ ","original-policy": "元となるポリシー",}}
Report doesn’t tells me about attack● 何が起こったかは分かる○ ブロックされたもの○ それを引きおこしたポリシー● どうして起こったかはわからない○ 攻撃か?それ以外か?● その結果ユーザがどういう体験をしたかもわかりにくい○ 広告が見えなかった?○ 登録ができなかった?16
It’s really… OK ...?17
Too strict to deploy immediate● ポリシーが妥当かをチェックするのは難しい○ ステージングなどでやってみるしかない● リアルワールドでの使われ方は多様○ どんなブラウザをどんな設定で使ってるか不明● いきなり本番で有効にするのは怖い○ ユーザが不都合な現象に出会わないか。。○ 攻撃が発生するよりも怖いかもしれない。。18
CSP-Report-Only● CSP を適用するがブロックはしない○ レポートを送るだけ○ 実際にどんなレポートが来るかを解析できる● いつ外すか?○ ポリシーに自身が持てたら○ 無理に Report-Only を外す必要もないかも○ 何が起こってるか分かるだけでも前進してる19
一年ほどやってみた20
blog.jxck.io21● basically static contents only○ no ○ no Dynamic Generated○ no CDN● 基本的に XSS などの発生は考えにくい○ その条件でもレポートがあるのか○ あるとすればどんなものかを調査○ があるサービスではもっと増えるだろう
Current Settings22content-security-policy-report-only:default-src 'self'https://jxck.iohttps://*.jxck.iohttps://www.google-analytics.com ;child-src https://blog.jxck.iohttps://www.youtube.com ;connect-src wss://ws.jxck.io ;report-uri https://jxck.report-uri.io/...
23CSP report (2016/3 ~ now)deploy fixup csp setting non critical reports
24CSP 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:// ..."}}
25CSP Report case#1● inline style in FF view-source://
26CSP 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}}
27CSP Report case#2● inline style in Chrome .txt, .md, .xml
28CSP 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}}
29CSP 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}}
30CSP 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}}
More and More...31
32Protected? / Clippled?● ほとんどの違反は攻撃には見えない○ 本当に全部ブロックすべき?○ ユーザに不便を強いてないか?● 基本的に開発者向けのサイト○ コンテンツはいじられる前提○ bookmarklets, extentions, localproxy etc○ レポート収集くらいがちょうど良さそう● Protected / Clippled○ コンテンツ次第としか言えない○ Github は思い切ってるなぁ
Mixed Contents33
Finding Mixed Contents34● Mixed Contents○ HTTPS コンテンツ内で HTTP コンテンツを読み込む○ MITM されてるかもしれない(安全を保証できない)○ URL バーが緑ではなくなる● Active○ 元の DOM を書き換えられる(script, iframe etc)○ ブロックされる● Passive○ 元の DOM は書き換えられない(img, video, audio etc)○ エラーはでるがブロックされない
HTTPS 移行と Mixed Contents35● Mixed Contents のよくあるパターン○ Consumer Generated Media (ユーザの埋めた img など)○ Ad (広告の iframe など)○ Legacy Hard Coded URL (古い新聞社 など)● 勢いで HTTPS 移行すると○ insecure 表示になって信用を失う○ ユーザの作ったコンテンツが壊れる○ 広告が見えなくて収入がががが○ 全部の URL 書き換えるの、、マジ無理、、
Upgrade-Insecure-Request36● http:// を https:// にブラウザが読み換える○ https:// がなければ 404 になる○ ただし、絶対に mixed contents にならない● サーバの対応だけで移行できる○ コンテンツを書き換えないで良い○ https にできてないものを access.log で見つけられるContent-Security-Policy: Upgrade-Insecure-Requests
Block-All-Mixed-Contents37● Passive でもブロックする○ コンテンツは壊れるかもしれない○ ただし、絶対に mixed contents にならない● CSP Report と組み合わせられる○ Report-Only にすればコンテツに影響が出ない○ https にできてないものを csp reoprt で見つけられるContent-Security-Policy: Block-All-Mixed-Contents
Report Server38
39report-uri.io● not recommended (personaly)○ UI が ○ソ○ 同時に Report をたくさん送ると 500 返すことが○ 半年以前のデータが表示できない?○ HTTP ヘッダが見えないので UA がわからない○ 過去のレポートをエクスポートできない● do yourself○ POST 受け取るシンプルなエンドポイントでよい○ 処理は kibana, grafana, big query などで○ Google Analytics がやってくれると嬉しい
40Report Analyze● ほとんどが設定ミス○ ステージングとプロダクションで分けよう○ フレームワーク/CMS での自動化に期待● Attacks を見つけるのは難しい○ 難、、無理じゃね?○ でも傾向には価値がある○ AI とかに期待
One More Thing41
HTTP Public Key Pinning42● 意図してない公開鍵での表示を防ぐ○ CA インシデントの多発により提案された○ 主に Google が怒って入れた● 運用が難しい○ 証明書が変わると表示されなくなる場合も○ バックアップのハッシュを事前にやっておくべきPublic-Key-Pins: pin-sha256=”#{hash-of-public-key}”
さすがに来ないだろ43
来た44
this is Real World Web45
May theSafebe with Web46