XHR Lv.2 - UTF-8.jp

Download Report

Transcript XHR Lv.2 - UTF-8.jp

Web::Security
beyond HTML5
Sep 28 2012
Yosuke HASEGAWA
謝罪
「HTML5」関係ないです
Perlのコードも出てきません
自己紹介
はせがわようすけ
ネットエージェント株式会社
株式会社セキュアスカイ・テクノロジー 技術顧問
Microsoft MVP for Consumer Security Oct 2005 http://utf-8.jp/
YAPC::Asia Tokyo 2012
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
...
YAPC::Asia Tokyo 2012
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
攻撃者
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
今日のはなし
Today's topic
今日のはなし
ぼくはPerlほとんどわかりません!
色々とセキュリティにまつわる細かい話をする
ので、みなさんぜひPerlのコードに落とし込ん
で、よい実装を広めてください!
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
今日のはなし
最近見かけた脆弱性のはなし
Ajaxデータを利用した攻撃
XHR Level.2の注意点
ブラウザの保護機構
XSSフィルター/XSS Auditor
Content-Typeの強制
クリックジャッキング対策
Content-Security-Policy
HTTPSの強制
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
今日のはなし
最近見かけた脆弱性のはなし
Ajaxデータを利用した攻撃
XHR Level.2の注意点
ブラウザの保護機構
XSSフィルター/XSS Auditor
Content-Typeの強制
クリックジャッキング対策
Content-Security-Policy
HTTPSの強制
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃
Ajaxの利用増加
Webアプリケーションの高機能化
Ajaxデータを利用したXSS
Ajaxデータ(JSON,text, csv etc..)を直接
ブラウザ上で開いたときにXSS
Ajaxデータの盗み見
機密情報を含むAjaxデータを受動的攻撃によ
り攻撃者が盗み見る
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃
Ajaxの利用増加
Webアプリケーションの高機能化
Ajaxデータを利用したXSS
Ajaxデータ(JSON,text, csv etc..)を直接
ブラウザ上で開いたときにXSS
Ajaxデータの盗み見
機密情報を含むAjaxデータを受動的攻撃によ
り攻撃者が盗み見る
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
Ajaxデータを直接開いてXSS
IEのContent-Type無視
HTMLではないものがHTMLに昇格してXSS
例えばtext/plain
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
IEは最終的に「ファイルタイプ」に基づいて
コンテンツを処理する
Content-Type 以外にも様々な要因から
ファイルタイプを決定
文書化されていない複雑なメカニズム
「ファイルのダウンロードダイアログで表示され
るファイル名の命名規則」
http://support.microsoft.com/kb/436153/ja
ファイルタイプ決定のメカニズム解明に近づく唯一のドキュメント
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
ファイルタイプの決定因子
"Content-Type" HTTPレスポンスヘッダ
"X-Content-Type-Option" HTTPレスポ
ンスヘッダ
Windowsレジストリにおける関連付け
IEの設定:"拡張子ではなく、内容によって
ファイルを開く"
URL自身
コンテンツそのもの
YAPC::Asia Tokyo 2012
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
プラグインを起動
またはダウンロード
21
Yosuke HASEGAWA http://utf-8.jp/
Ajaxデータを利用したXSS
ファイルタイプ決定のメカニズムは、と
にかく複雑すぎる!
そもそも例外的な挙動が多い
いつのまにか挙動が変化していることも多い
Microsoft自身も挙動を把握しきれていない
のでは
YAPC::Asia Tokyo 2012
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" はレジストリに未登録
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
XSS実例
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
AjaxコンテンツによるXSSは以下のよう
な状況で発生しやすい
JSON - JSON文字列内
{"text" :"<script>..." }
JSONP - callback名
http://example.com/?callback=<script>...
text, CSV - そもそもエスケープできない
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
JSON - JSON文字列内
Content-Type: application/json; charset=utf-8
{ "txt" : "<script>alert(1);</script>" }
"application/javascript" はレジストリに未登録
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
JSONP – callback名
http://example.com/?callback=<script>alert(1);</script>
Content-Type: text/javascript; charset=utf-8
<script>alert(1)</script>( { "name" : "value" } );
"text/javascript" はレジストリに未登録
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
text, csv – そもそもエスケープできない
Content-Type: text/plain; charset=utf-8
これはテキストファイルです。<script>alert(1)</script>
"text/plain" はsniff対象
Content-Type: text/csv; charset=utf-8
1,2,"abcd","<script>alert(1)</script>"
"text/csv" はレジストリに未登録
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用したXSS
Ajaxデータ内に<script>を埋め込む
JSON, JSONP, CSV, text など
Ajaxデータを直接開いたときにHTML扱
い
IEのContent-Type無視が原因
対策の話はあとで。
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃
Ajaxの利用増加
Webアプリケーションの高機能化
Ajaxデータを利用したXSS
Ajaxデータ(JSON,text, csv etc..)を直接
ブラウザ上で開いたときにXSS
Ajaxデータの盗み見
機密情報を含むAjaxデータを受動的攻撃によ
り攻撃者が盗み見る
YAPC::Asia Tokyo 2012
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]"}
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータの盗み見
様々な手法でブラウザごとにJSONデータ
を奪取
JSON Array Hijacking for Android
JSON Hijacking for IE
JSON以外にもCSVなどは狙いやすい
<script src="target.csv">
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータの盗み見
様々な手法でブラウザごとにJSONデータ
を奪取
JSON Array Hijacking for Android
JSON Hijacking for IE
JSON以外にもCSVなどは狙いやすい
<script src="target.csv">
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Array Hijacking for Android
Androidでは、古いJSON Hijackingの
手法がまた通用する
PC用ブラウザでは2008年頃にはすでに根絶
Android 2.2, 2.3で確認
property setter の再定義
機密情報を含むJSON配列がターゲット
YAPC::Asia Tokyo 2012
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>
攻撃者の作成した罠ページ
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータの盗み見
様々な手法でブラウザごとにJSONデータ
を奪取
JSON Array Hijacking for Android
JSON Hijacking for IE
JSON以外にもCSVなどは狙いやすい
<script src="target.csv">
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
JSON Hijacking for IE
IE6,IE7では特定条件下でJSONの奪取が
可能
攻撃者がJSON内に文字列を挿入可能
機密情報を含むJSONがターゲット
YAPC::Asia Tokyo 2012
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
YAPC::Asia Tokyo 2012
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
YAPC::Asia Tokyo 2012
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]"
}
]
YAPC::Asia Tokyo 2012
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]"
}
]
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
JSON Hijacking for IE
IE6,IE7はHTTPレスポンスヘッダより
<script>要素のcharset属性を優先
IE8では修正されている
2008年10月に報告したが修正されない
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃
Ajaxデータを利用した攻撃
Ajaxデータを利用したXSS
Ajaxデータ(JSON,text, csv etc..)を直接ブラウザ上
で開いたときにXSS
Ajaxデータの盗み見
機密情報を含むAjaxデータを受動的攻撃により攻撃者
が盗み見る
対策
X-Content-Type-Options: nosniffヘッダ
XMLHttpRequest以外からのアクセスを弾く
エスケープ(XSS対策),POST限定(盗み見対
策)なども次善策として…
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃への対策
X-Content-Type-Optoins:nosniff
XSS対策
レスポンスヘッダで応答
Content-Type: application/json; charset=utf-8
X-Content-Type-Options: nosniff
IE8以降でHTML扱いされることがなくなる
IE6,7には効果なし
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃への対策
XMLHttpRequest以外からのアクセスを
弾く
Ajaxデータは通常、XHRからのリクエスト
を想定している
XHR以外からアクセスさせないことでXSSお
よび盗み見を防ぐことができる
YAPC::Asia Tokyo 2012
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 は自動挿入される
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃への対策
汎用的なWAFなど
XHR経由のリクエストだけとは限らない
POST限定にはできない
泥臭い対策が必要
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃への対策
例: Amon2
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Ajaxデータを利用した攻撃への対策
JSONの過剰エスケープ
"<>+" を "\u003c\u003e\u002b" に
下記条件を満たす場合は403を返す
「GET リクエストである」かつ
「Cookie ヘッダを送信している」かつ
「/android/i にマッチする User-Agent
ヘッダを付与している」かつ
「X-Requested-With ヘッダを付与してい
ない」
http://blog.64p.org/entry/20111125/1322185155
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
今日のはなし
最近見かけた脆弱性のはなし
Ajaxデータを利用した攻撃
XHR Level.2の注意点
ブラウザの保護機構
XSSフィルター/XSS Auditor
Content-Typeの強制
クリックジャッキング対策
Content-Security-Policy
YAPC::Asia Tokyo 2012
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 );
YAPC::Asia Tokyo 2012
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: *
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
XHR Lv.2
現在のXMLHttpRequestは任意のサーバ
と通信可能
特定相手とのみ通信する場合はクライアント
側、サーバ側双方で注意が必要
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
XHR Lv.2
クライアント側:DOM based XSS
自サイトとの通信を想定
サーバはHTML断片を返す
innerHTMLにXHR.responseTextを代入
XHRの送信先が任意に指定可能な脆弱性
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
XHR Lv.2
典型的なコード
// 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/#//evil.example.jp/
などの指定で任意コンテンツを挿入可能
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
XHR Lv.2
YAPC::Asia Tokyo 2012
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( ??????? ) ){
var xhr = new XMLHttpRequest();
xhr.open( "GET", url, true );
...
}
url.match( /^\// )
url.match( /^\/[^\/]/ )
url.match( /^\/\w/ )
YAPC::Asia Tokyo 2012
// NG : #//evil.example.jp/
// NG : #/\evil.example.jp/
// OK : #/foo/
NetAgent http://www.netagent.co.jp/
XHR Lv.2
URLの確認は実はめんどうくさい。
詳細は「めんどうくさいWebセキュリティ」
参照
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
XHR Lv.2
むしろXHRの宛先は固定で保持するべき
var pages = [ "/", "/foo", "/bar", "/baz" ];
var index = location.hash.substring(1) | 0;
var xhr = new XMLHttpRequest();
xhr.open( "GET", pages[ index ], true );
YAPC::Asia Tokyo 2012
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ヘッダは偽装されている可能性がある。
YAPC::Asia Tokyo 2012
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
YAPC::Asia Tokyo 2012
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
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
XHR Lv.2
クロスドメインでのpreflightリクエスト
xhr.setRequestHeader( "X-Secret-Key", "A251BBCA" );
OPTIONS / HTTP/1.1
Host: another.example.jp
Origin: http://base.example.jp/
Access-Control-Request-Method: GET
Access-Control-Request-Headers: X-Secret-Key
リクエスト
HTTP/1.1 200 OK
レスポンス
Access-Control-Allow-Origin: htp://base.example.jp
Access-Control-Allow-Methods: GET
Access-Control-Allow-Headers: X-Secret-Key
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
XHR Lv.2
クロスドメインでのpreflightリクエスト
Plack::Middleware::CrossOrigin
xhr.setRequestHeader( "X-Secret-Key", "A251BBCA" );
builder {
enable 'CrossOrigin',
origins => '*', methods => ['GET'],
headers => X-Secret-Key';
}
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
今日のはなし
最近見かけた脆弱性のはなし
Ajaxデータを利用した攻撃
XHR Level.2の注意点
ブラウザの保護機構
XSSフィルター/XSS Auditor
Content-Typeの強制
クリックジャッキング対策
Content-Security-Policy
HTTPSの強制
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
XSSフィルター / XSS Auditor
反射型のXSSをほぼ軽減
IE8+、Chrome、Safari (WebKit)に搭載
リクエストとレスポンス両方に同一のスクリ
プトが含まれる場合にブロック
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
XSSフィルター / XSS Auditor
レスポンスヘッダに
X-XSS-Protection: 0
の指定でフィルタを停止可能
誤検知の実害が出ていない場合は指定なし
(XSSフィルタ有効)をおすすめ
WebKitのXSS AuditorはXSSを検出し
てもユーザへの通知なし
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
今日のはなし
最近見かけた脆弱性のはなし
Ajaxデータを利用した攻撃
XHR Level.2の注意点
ブラウザの保護機構
XSSフィルター/XSS Auditor
Content-Typeの強制
クリックジャッキング対策
Content-Security-Policy
HTTPSの強制
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
X-Content-Type-Options
Content-Typeに従ってコンテンツを開
く指定
コンテンツ内の "sniff" を行わなくなる
IE8+で有効
レスポンスヘッダに以下をつける
X-Content-Type-Options: nosniff
原則、全てのコンテンツにつけておくべ
き。
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
X-Content-Type-Options
Content-Typeに従ってコンテンツを開
く指定
コンテンツ内の "sniff" を行わなくなる
IE8+で有効
レスポンスヘッダに以下をつける
X-Content-Type-Options: nosniff
原則、全てのコンテンツにつけておくべ
き。
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
今日のはなし
最近見かけた脆弱性のはなし
Ajaxデータを利用した攻撃
XHR Level.2の注意点
ブラウザの保護機構
XSSフィルター/XSS Auditor
Content-Typeの強制
クリックジャッキング対策
Content-Security-Policy
HTTPSの強制
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
クリックジャッキング対策
クリックジャッキング
標的サイトを透明に重ね、意図しないクリッ
ク等を引き起こす攻撃
透明表示の
標的サイト
罠サイト
YAPC::Asia Tokyo 2012
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
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
今日のはなし
最近見かけた脆弱性のはなし
Ajaxデータを利用した攻撃
XHR Level.2の注意点
ブラウザの保護機構
XSSフィルター/XSS Auditor
Content-Typeの強制
クリックジャッキング対策
Content-Security-Policy
HTTPSの強制
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Content Security Policy
Content-Security-Policy(CSP)
XSS根絶の切り札
指定された以外のリソースが読めない
<script><img><iframe>...
インラインスクリプトが禁止される
<script>alert(1)</script> … NG
evalやイベント属性が禁止される
<body onload=alert(1)> … NG
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Content Security Policy
Content-Security-Policy(CSP)
規格、実装が不安定
レスポンスヘッダで許可するリソースを指定
Content-Security-Policy: directive;
X-Content-Security-Policy: directive;
X-WebKit-CSP: directive;
// W3C
// Firefox
// Chrome
<meta>でも指定可。上書きは不可。
http://www.w3.org/TR/2012/WD-CSP-20120710/
http://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Content Security Policy
Content-Security-Policy(CSP)
許可するリソースを記述
Content-Security-Policy: default-src 'self'
'self'は同一ドメイン、同一ポートのみ許可
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
Content Security Policy
Content-Security-Policy(CSP)
リソースの種別ごとに指定可能
// 画像以外を同一ドメインに制約
Content-Security-Policy: default-src 'self'; image-src *
// example.jp の script src を許可
Content-Security-Policy: default-src 'self'; script-src example.jp
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
今日のはなし
最近見かけた脆弱性のはなし
Ajaxデータを利用した攻撃
XHR Level.2の注意点
ブラウザの保護機構
XSSフィルター/XSS Auditor
Content-Typeの強制
クリックジャッキング対策
Content-Security-Policy
HTTPSの強制
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
HTTPSの強制
HSTS
- HTTP Strict Transport Security
HTTPとHTTPS、両方を提供しているサイト
で、HTTPSの使用を強制する機能
中間者攻撃の低減に
Google Chrome、Firefoxが対応
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
HTTPSの強制
HTTPSのレスポンスヘッダで以下を返す
Strict-Transport-Security: max-age=15768000
Strict-Transport-Security: max-age=15768000 ; includeSubDomanis
これ以降のHTTPへのアクセスはHTTPSに置
き換わる
max-age は有効期間を秒数で指定
includeSubDomainsが指定されるとサブド
メインも対象
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
HTTPSの強制
HTTPSサイトのみがStrict-TransportSecurityを返す
Strict-Transport-Security: max-age=15768000
HTTPはすでに汚染されているかもしれない
ので
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
今日のはなし
最近見かけた脆弱性のはなし
Ajaxデータを利用した攻撃
XHR Level.2の注意点
ブラウザの保護機構
XSSフィルター/XSS Auditor
Content-Typeの強制
クリックジャッキング対策
Content-Security-Policy
HTTPSの強制
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
まとめ
まとめ
Ajax関連の脆弱性はブラウザ起因が多い
Android 2.x、IE6-8
古いブラウザは直らない!サーバ側で対策
新しいブラウザには多数の保護機能
使えるものはどんどん取り込もう
よい実装を広めてほしい!!
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/
質問タイム
質問
[email protected]
[email protected]
@hasegawayosuke
http://utf-8.jp/
YAPC::Asia Tokyo 2012
NetAgent http://www.netagent.co.jp/