Web::Security beyond HTML5

Post on 23-Feb-2016

50 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Web::Security beyond HTML5. Sep 28 2012 Yosuke HASEGAWA. 謝罪. 「 HTML5 」関係ないです Perl のコードも出てきません. 自己紹介. はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ・テクノロジー 技術顧問 Microsoft MVP for Consumer Security Oct 2005 - http://utf-8.jp/. これまでに調べた脆弱性. Web ブラウザ、 Web アプリケーションを中心にいろいろ … - PowerPoint PPT Presentation

Transcript

Web::Securitybeyond HTML5

Sep 28 2012Yosuke HASEGAWA

謝罪「 HTML5 」関係ないです

Perl のコードも出てきません

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

自己紹介

はせがわようすけネットエージェント株式会社株式会社セキュアスカイ・テクノロジー 技術顧問

Microsoft MVP for Consumer Security Oct 2005 -

http://utf-8.jp/

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

これまでに調べた脆弱性

Web ブラウザ、 Web アプリケーションを中心にいろいろ… CVE-2007-0995 XSS of Mozilla Firefox CVE-2007-1262 XSS of SquirrelMail CVE-2007-2227 XSS of Internet Explorer CVE-2008-0416 XSS of Mozilla Firefox CVE-2008-1468 XSS of Namazu CVE-2008-5808 XSS of Movable Type CVE-2010-1213 Cross-origin data disclosure of Mozilla Firefox CVE-2010-3348 Cross-origin data disclosure of Internet

Explorer CVE-2010-3770 XSS of Mozilla Firefox CVE-2011-1339 XSS of Google Search Appliance CVE-2011-3384 XSS of Sage CVE-2011-3648 XSS of Mozilla Firefox

...

難読化 JavaScriptObfuscated JavaScript

$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();

記号 JavaScript JS without alnum

jjencode - http://utf-8.jp/public/jjencode.html

゚ ω ゚ノ = / `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 ゚ ]) ( ゚ Θ ゚ )) ('_');

顔文字 JavaScript JS with emoticons

aaencode - http://utf-8.jp/public/aaencode.html

質問Question

質問 : Web 技術、好きですか ?Q. Do you love web technologies?

質問 : Web 技術、好きですか ?Q. Do you love web technologies?

クロスサイトスクリプティング

SQL インジェクション

CSRF

HTTP レスポンス分割

オープンリダイレクタ

HTTP ヘッダインジェクション

セッションハイジャックパストラバーサル

リモートファイルインクルード

DoS

OS コマンドインジェクション

メモリリーク

バッファオーバーフロー

強制ブラウズ

セッション固定攻撃

LDAP インジェクション

XPath インジェクション

書式文字列攻撃

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Web 技術、好きですか ?

「はい」に挙手した人かなり打たれ強い

or攻撃者

今日のはなしToday's topic

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

ぼくは Perl ほとんどわかりません!

 色々とセキュリティにまつわる細かい話をするので、みなさんぜひ Perl のコードに落とし込んで、よい実装を広めてください!

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃

Ajax の利用増加Web アプリケーションの高機能化

Ajax データを利用した XSSAjax データ (JSON,text, csv etc..) を直

接ブラウザ上で開いたときに XSSAjax データの盗み見

機密情報を含む Ajax データを受動的攻撃により攻撃者が盗み見る

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃

Ajax の利用増加Web アプリケーションの高機能化

Ajax データを利用した XSSAjax データ (JSON,text, csv etc..) を直

接ブラウザ上で開いたときに XSSAjax データの盗み見

機密情報を含む Ajax データを受動的攻撃により攻撃者が盗み見る

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

Ajax データを直接開いて XSSIE の Content-Type 無視HTML ではないものが HTML に昇格して

XSS例えば text/plain

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

IE は最終的に「ファイルタイプ」に基づいてコンテンツを処理する

Content-Type 以外にも様々な要因からファイルタイプを決定文書化されていない複雑なメカニズム

「ファイルのダウンロードダイアログで表示されるファイル名の命名規則」 http://support.microsoft.com/kb/436153/jaファイルタイプ決定のメカニズム解明に近づく唯一のドキュメント

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

ファイルタイプの決定因子"Content-Type" HTTP レスポンスヘッダ"X-Content-Type-Option" HTTP レスポ

ンスヘッダWindows レジストリにおける関連付けIE の設定 :" 拡張子ではなく、内容によって

ファイルを開く "URL 自身コンテンツそのもの

IE におけるファイルタイプ決定のメカニズム

Y N

Y

N

N

Y

有効無効

Y N

N YY N

Y N

Content-Type がレジストリに登録されている ? [ HKEY_CLASSES_ROOT\MIME\Database\Content Type ]

ファイルタイプを仮決定

外部プラグイン / アプリが必要 ?

IE8+ && "X-Content-Type-Options:nosniff"?

コンテンツを sniff しファイルタイプを決定

URL の拡張子が ".cgi" または ".exe" または "/" ? e.g. http://utf-8.jp/a.cgi?abcd, http://utf-8.jp/foo/

外部プラグイン / アプリが必要 ?プラグインを起動またはダウンロード

「拡張子ではなく、内容によってファイルを開く」設定値 仮決定したファイルタイプを使用

IE8+ && "X-Content-Type-Options:nosniff"? 仮決定したファイルタイプを使用

QUERY_STRING からファイルタイプを仮決定

プラグインを起動またはダウンロードコンテンツを sniff しファイルタイプを決定

コンテンツを sniff しファイルタイプを決定

外部プラグイン / アプリが必要 ?

URL の拡張子からファイルタイプを仮決定

ダウンロード

プラグインを起動またはダウンロードYosuke HASEGAWA http://utf-8.jp/※ これ以外にも例外的な挙動が多数あり

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

ファイルタイプ決定のメカニズムは、とにかく複雑すぎる!そもそも例外的な挙動が多いいつのまにか挙動が変化していることも多いMicrosoft 自身も挙動を把握しきれていな

いのでは

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSSXSS 実例

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-8Date: Wed, 22 Jun 2011 13:53:37 GMTContent-Length: 2092

var <script>alert(1)</script>={"Webtrends":{"enabled":true,"settings":{"interactiontype":{"0":true,"1":true,"2":true,"3":true,"4":true,"5":true,"6":true,"7":true,"8":true,"9":true,"10":true,"11":true,"12":true,"13"....

"text/javascript" はレジストリに未登録

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSSXSS 実例

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

Ajax コンテンツによる XSS は以下のような状況で発生しやすいJSON - JSON 文字列内

{"text" :"<script>..." }JSONP - callback 名

http://example.com/?callback=<script>...text, CSV - そもそもエスケープできない

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

JSON - JSON 文字列内Content-Type: application/json; charset=utf-8

{ "txt" : "<script>alert(1);</script>" }

"application/javascript" はレジストリに未登録

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

JSONP – callback 名http://example.com/?callback=<script>alert(1);</script>

"text/javascript" はレジストリに未登録

Content-Type: text/javascript; charset=utf-8

<script>alert(1)</script>( { "name" : "value" } );

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

text, csv – そもそもエスケープできない

"text/plain" は sniff 対象

Content-Type: text/plain; charset=utf-8

これはテキストファイルです。 <script>alert(1)</script>

"text/csv" はレジストリに未登録

Content-Type: text/csv; charset=utf-8

1,2,"abcd","<script>alert(1)</script>"

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

Ajax データ内に <script> を埋め込むJSON, JSONP, CSV, text など

Ajax データを直接開いたときに HTML扱いIE の Content-Type 無視が原因

対策の話はあとで。

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃

Ajax の利用増加Web アプリケーションの高機能化

Ajax データを利用した XSSAjax データ (JSON,text, csv etc..) を直

接ブラウザ上で開いたときに XSSAjax データの盗み見

機密情報を含む Ajax データを受動的攻撃により攻撃者が盗み見る

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データの盗み見

JavaScript として解釈可能な Ajaxデータが狙われやすいJavaScript の src として読み込む

<script src="target.json"></script><script src="target.csv"></script>

{"from" : "a@example.com"}

JSON

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データの盗み見

様々な手法でブラウザごとに JSON データを奪取JSON Array Hijacking for Android JSON Hijacking for IE

JSON 以外にも CSV などは狙いやすい<script src="target.csv">

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データの盗み見

様々な手法でブラウザごとに JSON データを奪取JSON Array Hijacking for Android JSON Hijacking for IE

JSON 以外にも CSV などは狙いやすい<script src="target.csv">

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Array Hijacking for Android

Android では、古い JSON Hijackingの手法がまた通用するPC 用ブラウザでは 2008年頃にはすでに根絶

Android 2.2, 2.3 で確認property setter の再定義機密情報を含む JSON配列がターゲット

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Array Hijacking for Android[ { "name" : "alice", "mail" : "alice@example.com" }, { "name" : "bob", "mail" : "bob@example.jp" },]

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

攻撃対象となる JSON : http://example.jp/target.json

攻撃者の作成した罠ページ

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データの盗み見

様々な手法でブラウザごとに JSON データを奪取JSON Array Hijacking for Android JSON Hijacking for IE

JSON 以外にも CSV などは狙いやすい<script src="target.csv">

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

JSON Hijacking for IE

IE6,IE7 では特定条件下で JSON の奪取が可能攻撃者が JSON 内に文字列を挿入可能機密情報を含む JSON がターゲット

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

JSON Hijacking for IE

[ { "name" : "abc+MPv/fwAiAH0AXQA7-var t+AD0AWwB7ACIAIg-:+ACI-", "mail" : "hasegawa@utf-8.jp" }, { "name" : "John Smith", "mail" : "john@example.com" }]

攻撃者によって挿入

ターゲットとなる JSON : http://example.com/newmail.json

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

JSON Hijacking for IE

[ { "name" : "abc"}];var t=[{"":"", "mail" : "hasegawa@utf-8.jp" }, { "name" : "John Smith", "mail" : "john@example.com" }]

ターゲットとなる JSON : http://example.com/newmail.json

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

JSON Hijacking for IE

<script src="http://example.com/newmail.json" charset="utf-7"><script> alert( t[ 1 ].name + t[ 1 ].mail ); </script>

攻撃者は罠ページを準備して誘導

[ { "name" : "abc+MPv/fwAiAH0AXQA7-var t+AD0AWwB7ACIAIg-:+ACI-", "mail" : "hasegawa@utf-8.jp" }, { "name" : "John Smith", "mail" : "john@example.com" }]

ターゲットとなる JSON http://example.com/newmail.json[ { "name" : "abc"}];var t=[{"":"", "mail" : "hasegawa@utf-8.jp" }, { "name" : "John Smith", "mail" : "john@example.com" }]

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

JSON Hijacking for IE

<script src="http://example.com/newmail.json" charset="utf-7">攻撃者の準備した罠ページ

Content-Type: application/json; charset=utf-8

[ { "name" : "abc+MPv/fwAiAH0AXQA7-var t+AD0AWwB7ACIAIg-:+ACI-", "mail" : "hasegawa@utf-8.jp" }, { "name" : "John Smith", "mail" : "john@example.com" }]

攻撃者対象の JSON こっちが優先される

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

JSON Hijacking for IE

IE6,IE7 は HTTP レスポンスヘッダより<script> 要素の charset属性を優先IE8 では修正されている

2008年 10月に報告したが修正されない

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃Ajax データを利用した攻撃

Ajax データを利用した XSSAjax データ (JSON,text, csv etc..) を直接ブラウザ上で開いたときに XSS

Ajax データの盗み見機密情報を含む Ajax データを受動的攻撃により攻撃者が盗み見る

対策X-Content-Type-Options: nosniff ヘッダXMLHttpRequest 以外からのアクセスを弾くエスケープ (XSS 対策 ),POST限定 ( 盗み見対

策 ) なども次善策として…

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃への対策

X-Content-Type-Optoins:nosniffXSS 対策レスポンスヘッダで応答

IE8 以降で HTML扱いされることがなくなるIE6,7 には効果なし

Content-Type: application/json; charset=utf-8X-Content-Type-Options: nosniff

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃への対策

XMLHttpRequest 以外からのアクセスを弾くAjax データは通常、 XHR からのリクエス

トを想定しているXHR 以外からアクセスさせないことで XSS

および盗み見を防ぐことができる

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃への対策

XMLHttpRequest 以外からのアクセスを弾くリクエストヘッダに特定文字列を入れる

GET http://example.jp/foo.json HTTP/1.1Host: example.jpConnection: keep-aliveX-Request-With: XMLHttpRequestUser-Agent: Mozilla/5.0 (Windows NT 6.0; rv:8.0)

jQuery 、 prototype.js だと X-Request-With は自動挿入される

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃への対策

汎用的な WAF などXHR経由のリクエストだけとは限らないPOST限定にはできない泥臭い対策が必要

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃への対策例 : Amon2

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃への対策

JSON の過剰エスケープ"<>+" を "\u003c\u003e\u002b" に

下記条件を満たす場合は 403 を返す「 GET リクエストである」かつ「 Cookie ヘッダを送信している」かつ「 /android/i にマッチする User-Agent

ヘッダを付与している」かつ「 X-Requested-With ヘッダを付与して

いない」http://blog.64p.org/entry/20111125/1322185155

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-Policy

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

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 );

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

XMLHttpRequest現在はクロスドメインでのリクエストが可能

GET / HTTP/1.1Host: another.example.jpOrigin: http://base.example.jp/

HTTP/1.1 200 OKAccess-Control-Allow-Origin: *

HTML

base.example.jp

another.example.jp

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

現在の XMLHttpRequest は任意のサーバと通信可能特定相手とのみ通信する場合はクライアント側、サーバ側双方で注意が必要

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

クライアント側:DOM based XSS自サイトとの通信を想定サーバは HTML断片を返すinnerHTML に XHR.responseText を代入

XHR の送信先が任意に指定可能な脆弱性

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

典型的なコード// bad code: http://example.jp/#/foo/bar.txtvar 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/  などの指定で任意コンテンツを挿入可能

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

XHR を利用する側は、任意ドメインからのデータを読まないようにチェック// http://example.jp/#/foo/bar.txtvar url = location.hash.substring(1);if( url.match( ??????? ) ){ var xhr = new XMLHttpRequest(); xhr.open( "GET", url, true ); ...}url.match( /^\// ) // NG : #//evil.example.jp/url.match( /^\/[^\/]/ ) // NG : #/\evil.example.jp/url.match( /^\/\w/ ) // OK : #/foo/

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

URL の確認は実はめんどうくさい。詳細は「めんどうくさい Web セキュリ

ティ」参照

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

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 );

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

サーバ側 :特定の相手にのみ応答を許可

サーバ側はリクエストの Origin ヘッダを見て相手を判別してはいけない

Origin ヘッダは偽装されている可能性がある。

GET / HTTP/1.1Host: another.example.jpOrigin: http://base.example.jp/

HTTP/1.1 200 OKAccess-Control-Allow-Origin: htp://base.example.jp

リクエスト

レスポンス

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2サーバ側 :特定の相手にのみ応答を許可。

JS で明示的に指定した場合のみ Cookie が送信される

GET / HTTP/1.1Host: another.example.jpOrigin: http://base.example.jp/Cookie: sessionid=A251BBCA

HTTP/1.1 200 OKAccess-Control-Allow-Origin: htp://base.example.jpAccess-Control-Allow-Credentials: true

リクエスト

レスポンス

xhr.withCredentials = true; // JavaScript 内

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2サーバ側 :特定の相手にのみ応答を許可。

リクエストヘッダに「秘密の情報」を含める

サーバ側はリクエストヘッダ内の情報を確認して正規の通信相手か判断

クロスドメインでの setRequestHeader は癖があるので注意事前に OPTIONS 要求が発行 (preflight)https://developer.mozilla.org/en/http_access_control

xhr.setRequestHeader( "X-Secret-Key", "A251BBCA" );

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

クロスドメインでの preflight リクエストOPTIONS / HTTP/1.1Host: another.example.jpOrigin: http://base.example.jp/Access-Control-Request-Method: GETAccess-Control-Request-Headers: X-Secret-Key

HTTP/1.1 200 OKAccess-Control-Allow-Origin: htp://base.example.jpAccess-Control-Allow-Methods: GETAccess-Control-Allow-Headers: X-Secret-Key

リクエスト

レスポンス

xhr.setRequestHeader( "X-Secret-Key", "A251BBCA" );

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

クロスドメインでの preflight リクエストPlack::Middleware::CrossOrigin

builder { enable 'CrossOrigin', origins => '*', methods => ['GET'], headers => X-Secret-Key';}

xhr.setRequestHeader( "X-Secret-Key", "A251BBCA" );

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XSS フィルター / XSS Auditor

反射型の XSS をほぼ軽減IE8+ 、 Chrome 、 Safari (WebKit) に搭載

リクエストとレスポンス両方に同一のスクリプトが含まれる場合にブロック

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XSS フィルター / XSS Auditor

レスポンスヘッダに

の指定でフィルタを停止可能誤検知の実害が出ていない場合は指定なし

(XSS フィルタ有効 ) をおすすめWebKit の XSS Auditor は XSS を検

出してもユーザへの通知なし

X-XSS-Protection: 0

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

X-Content-Type-Options

Content-Type に従ってコンテンツを開く指定コンテンツ内の "sniff" を行わなくなるIE8+ で有効レスポンスヘッダに以下をつける

原則、全てのコンテンツにつけておくべき。

X-Content-Type-Options: nosniff

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

X-Content-Type-Options

Content-Type に従ってコンテンツを開く指定コンテンツ内の "sniff" を行わなくなるIE8+ で有効レスポンスヘッダに以下をつける

原則、全てのコンテンツにつけておくべき。

X-Content-Type-Options: nosniff

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

クリック !!

クリックジャッキング対策

クリックジャッキング標的サイトを透明に重ね、意図しないクリッ

ク等を引き起こす攻撃

透明表示の標的サイト

罠サイト

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

クリックジャッキング対策

frame および iframe での表示を禁止するIE8+ 、 Chrome 、 Safari 、 Opera 、 F

irefox の各ブラウザが対応レスポンスヘッダで指定// 全ての埋め込みを禁止

X-Frame-Options: DENY

// 同一オリジン以外からの埋め込みを禁止X-Frame-Options: SAMEORIGIN

http://www.jpcert.or.jp/ed/2009/ed090001.pdf

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Content Security Policy

Content-Security-Policy(CSP)XSS根絶の切り札指定された以外のリソースが読めない<script><img><iframe>...

インラインスクリプトが禁止される<script>alert(1)</script> … NG

eval やイベント属性が禁止される<body onload=alert(1)> … NG

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Content Security Policy

Content-Security-Policy(CSP)規格、実装が不安定レスポンスヘッダで許可するリソースを指定

<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

Content-Security-Policy: directive; // W3CX-Content-Security-Policy: directive; // FirefoxX-WebKit-CSP: directive; // Chrome

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Content Security Policy

Content-Security-Policy(CSP)許可するリソースを記述

'self' は同一ドメイン、同一ポートのみ許可

Content-Security-Policy: default-src 'self'

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

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

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

HTTPS の強制

HSTS- HTTP Strict Transport SecurityHTTP と HTTPS 、両方を提供しているサ

イトで、 HTTPS の使用を強制する機能中間者攻撃の低減に

Google Chrome 、 Firefox が対応

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

HTTPS の強制

HTTPS のレスポンスヘッダで以下を返す

これ以降の HTTPへのアクセスは HTTPS に置き換わる

max-age は有効期間を秒数で指定includeSubDomains が指定されるとサブ

ドメインも対象

Strict-Transport-Security: max-age=15768000

Strict-Transport-Security: max-age=15768000 ; includeSubDomanis

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

HTTPS の強制

HTTPS サイトのみが Strict-Transport-Security を返す

HTTP はすでに汚染されているかもしれないので

Strict-Transport-Security: max-age=15768000

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

まとめ

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

まとめ

Ajax 関連の脆弱性はブラウザ起因が多いAndroid 2.x 、 IE6-8古いブラウザは直らない!サーバ側で対策

新しいブラウザには多数の保護機能使えるものはどんどん取り込もう

よい実装を広めてほしい !!

質問タイム

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

質問

hasegawa@utf-8.jphasegawa@netagent.co.jp

@hasegawayosuke

http://utf-8.jp/

top related