106
HTML5 時時時 Web 時時時時時時 Jul 21 2012 Yosuke HASEGAWA

HTML5 時代の Web セキュリティ

  • Upload
    woods

  • View
    642

  • Download
    5

Embed Size (px)

DESCRIPTION

HTML5 時代の Web セキュリティ. Jul 21 2012 Yosuke HASEGAWA. 自己紹介. はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ・テクノロジー 技術顧問 Microsoft MVP for Consumer Security Oct 2005 - http://utf-8.jp/ セキュリティキャンプ Web セキュリティクラス講師. これまでに調べた脆弱性. Web ブラウザ、 Web アプリケーションを中心にいろいろ … CVE-2007-0995 XSS of Mozilla Firefox - PowerPoint PPT Presentation

Citation preview

HTML5 時代のWeb セキュリティ

Jul 21 2012Yosuke HASEGAWA

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

自己紹介

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

Microsoft MVP for Consumer Security Oct 2005 -

http://utf-8.jp/セキュリティキャンプ Web セキュリティクラス講師

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

これまでに調べた脆弱性

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/security-mikan techtalk #5

Web 技術、好きですか ?

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

or攻撃者

HTML5 時代の Web アプリ

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

HTML5 時代の Web アプリ

次々とリリースされるブラウザ多数の新しい要素と属性

canvas, video, audio, input…多数の新しい API

Web Sockets, Web Storage, XHR Lv.2…最適化された JavaScript エンジン高速化された描画エンジン

どのブラウザにどの機能が実装されているのか把握できない

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

次々とリリースされるブラウザ

6 7 8

2001 2001 2003 2004 2006 2007 2008 2009

1 3 4

5 9 10

3.5 3.63.01.5 2.0

6 7 8

2

41 2 3

20102005

1.0

Ajax 5

2011 2012

9 10

15

23

5

11 12

6

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

HTML5 の新機能

マルチメディアのサポート<video> <audio> <canvas>...

文書構造を表す要素<section> <header> <footer> ...

フォームの拡張<input type="email"> ...

JavaScript APIWeb Workers, WebSocket, File...

その他…

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

HTML5 時代の Web アプリ

HTML5 時代のブラウザ高速化、高機能化

実行コードのブラウザ上へのシフトネイティブアプリから Web アプリへサーバ側で実行されていた処理がブラウザの

JavaScript 上へ攻撃もクライアントサイドへシフト

JavaScript 上の問題点の増加XSS や CSRF などの比重が増加

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

HTML5 時代の Web アプリ

攻撃もクライアントサイドへシフトJavaScript を通じた攻撃の比重が増加XSS のリスクも増加

多くの点から見て、 XSS 脆弱性の危険性はバッファ オーバーフローに匹敵します。 ”

“セキュリティに関するブリーフィング : Web に対する SDL の適用http://msdn.microsoft.com/ja-jp/magazine/cc794277.aspx

そもそも XSS って ?→ 簡単におさらい

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS おさらい

対象動的に HTML を生成する Web アプリ

問題攻撃者が用意したスクリプトが HTML 内に

挿入される対策

HTML を生成する時点でエスケープ

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS おさらいhttp://shop.example.com/?item="><script>...

GET /?item="><script>...

<input type="text" value=""><script>...

HTML を生成するときのエスケープ漏れ

被害者

攻撃者

オンラインショップなど

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS おさらい

被害者

攻撃者

オンラインショップなど

http://shop.example.com/?item="><script>...

<input type="text" value=""><script>...

反射型 XSSユーザの送信内容をそのまま表示する

GET /?item="><script>...

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS おさらい

Subject: test mail

<html><script>...

HTML を生成するときのエスケープ漏れ

被害者

攻撃者

Web メールなど

Subject: test mail

<html><script>...

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS おさらい

HTML を生成するときのエスケープ漏れ

被害者

攻撃者

Web メールなど

Subject: test mail

<html><script>...

Subject: test mail

<html><script>...

持続型 / 蓄積型 XSS 攻撃者のスクリプトはサーバ内で保持されている

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS おさらい

対象動的に HTML を生成する Web アプリ

問題攻撃者が用意したスクリプトが HTML 内に

挿入される対策

HTML を生成する時点でエスケープ

大原則HTML を生成する時点で

エスケープ

って何だっけ ?→ おさらい

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

HTML を生成する時点でエスケープ !

XSS おさらい

<html>&lt;&gt;

1101100110010001000111011010000101001100101011011110

< → &lt;> → &gt;" → &quot;' → &#39;& → &amp;

データ 処理 ユーザHTML 生成

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

エスケープの例外

href 、 src 等の URL の動的生成

http 以外のスキームに注意JavaScript 内の動的生成

JS 内の文字列リテラルは HTML とは異なるエスケープ

<a href="javascript:alert(1)"><iframe src="data:text/html;base64, PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">

<script>var s="</script><script>alert(1)//";</script>

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS おさらい

HTML を生成する時点でエスケープコンテキスト ( 文脈 ) に応じたエスケープコンテキストが入れ子になっているときはエ

スケープも入れ子に。<div onclick="foo('\u0022><script>…');">

URL の動的生成href 、 src 等は http,https 限定とする

やってはいけないXSS 対策

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

入力時のサニタイズ

やってはいけない XSS 対策

<html>&lt;&gt;

処理 ユーザHTML 生成

1101100110010001000111011010000101001100101011011110

データ

< → &lt;> → &gt;" → &quot;' → &#39;& → &amp;

サニタイズ

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

やってはいけない:入力時のサニタイズ

入力時点でのデータの加工はプログラム規模が大きくなると破綻する

「サニタイズ」という語が本来の意味を失って意味不明になっている続きは Web で

サニタイズ言うな 検索

XSS の種類

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS の種類反射型 XSS / Type-1

ユーザからの送信内容をそのまま表示XSS フィルタ等である程度防御お問い合わせフォーム、サイト内検索

持続型 XSS / Type-2攻撃者のスクリプトがサーバ内で保持掲示板、 Web メール

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS の種類反射型 XSS / Type-1

ユーザからの送信内容をそのまま表示XSS フィルタ等である程度防御お問い合わせフォーム、サイト内検索

持続型 XSS / Type-2攻撃者のスクリプトがサーバ内で保持掲示板、 Web メール

GET /?item="><script>...

<input type="text" value=""><script>...

※GET だけでなく POST もあり得る

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS の種類

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS の種類

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS の種類

XSS フィルターはリクエストとレスポンス両方に同じスクリプトが含まれると反応

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS の種類反射型 XSS / Type-1

ユーザからの送信内容をそのまま表示XSS フィルタ等である程度防御お問い合わせフォーム、サイト内検索

持続型 XSS / Type-2攻撃者のスクリプトがサーバ内で保持掲示板、 Web メール

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS の種類反射型 XSS / Type-1

ユーザからの送信内容をそのまま表示XSS フィルタ等である程度防御お問い合わせフォーム、サイト内検索

持続型 XSS / Type-2攻撃者のスクリプトがサーバ内で保持掲示板、 Web メール

Subject: test

<script>...

Subject: test

<script>...

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS の種類

持続型 XSS / Type-22006年 6月 mixi 「こんにちはこんにち

は」2007年 8月 Twitter 「こんにちはこんにちは」

2010年 9月 Twitter

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS の種類反射型 XSS / Type-1

ユーザからの送信内容をそのまま表示XSS フィルタ等である程度防御お問い合わせフォーム、サイト内検索

持続型 XSS / Type-2攻撃者のスクリプトがサーバ内で保持掲示板、 Web メール

DOM based XSS / Type-0JavaScript が引き起こすサーバ側の HTML 生成には問題なし

//http://example.jp/#<script>alert(1)</script>div.innerHTML = location.hash;

DOM based XSS

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

DOM based XSS

JavaScript が引き起こす XSSサーバ側の HTML 生成時には問題なし

JavaScript による HTML レンダリング時の問題

JavaScript の利用に合わせて増加

//http://example.jp/#<script>alert(1)</script>div.innerHTML = location.hash;

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

DOM based XSS

location.hash を使った XSS の場合、サーバ側に攻撃の詳細が残らない

ここまで XSS の復習です!

HTML5 が生む脆弱性

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

HTML5 が生む脆弱性

Cross-Site Scripting(XSS)要素、属性、イベントが増えている

Cross-Document Messaging(XDM)クロスドメインでのドキュメント間通信

XMLHttpRequest(XHR) Lv.2クロスドメインでの読み込み

Ajax データを利用した攻撃XSS 、データの盗み見

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

HTML5 が生む脆弱性

Cross-Site Scripting(XSS)要素、属性、イベントが増えている

Cross-Document Messaging(XDM)クロスドメインでのドキュメント間通信

XMLHttpRequest(XHR) Lv.2クロスドメインでの読み込み

Ajax データを利用した攻撃XSS 、データの盗み見

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS

これまでの間違った XSS 対策危険そうな要素を検出<script> <object> <iframe>

onXXX 、 href などの名称の属性を検出<div onmouseover=alert(1)><img src=# onerror=alert(1)><a href="javascript:alert(1)>

これまで仮にこの方法で網羅できていたとしても…

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS

HTML5 で多数の要素、属性、イベントが導入<input autofocus pattern="..."><video onplay="...">

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS

いわゆる「ブラックリスト」での対応に漏れ

そもそもブラックリスト方式は無理がある「 HTML 生成時にエスケープ」の原則

HTML5 と関係なく XSS を防げる

<form> <button formaction="javascript:alert(1)">X </button>//http://html5sec.org/#72

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

DOM based XSS

DOM based XSS は増えているJavaScript の大規模化に伴い増加

サーバ側での対策と原則は同じHTML 生成時にエスケープURL 生成時は http(s) のみbackgroundImage への代入やイベント

ハンドラの動的生成は避ける

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

DOM based XSS

HTML 生成時にエスケープ

むしろ textNode を使おう !

div.innerHTML = s.replace( /&/g, "&amp;" ) .replace( /</g, "&lt;" ) .replace( />/g, "&gt;" ) .replace( /"/g, "&quot;" ) .replace( /'/g, "&#x27;" );

div.appendChild( document.createTextElement( s ) );

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

DOM based XSS

if( url.match( /^https?:\/\// ) ){ var elm = docuement.createElement( "a" ); elm.appendChild( document.createTextNode( url ) ); elm.setAttribute( "href", url ); div.appendChild( elm ); }

// bad codediv.innerHTML = '<a href="' + url + '">' + url + '</a>';

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

HTML5 が生む脆弱性

Cross-Site Scripting(XSS)要素、属性、イベントが増えている

Cross-Document Messaging(XDM)クロスドメインでのドキュメント間通信

XMLHttpRequest(XHR) Lv.2クロスドメインでの読み込み

Ajax データを利用した攻撃XSS 、データの盗み見

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XDM

Cross-Document Messagingブラウザの window/iframe間で相互に通

信http://example.com/

http://example.jp/<iframe id="iframe1">

window.onmessage=function( ){}

iframe1.contentWindow.postMessage( "..." );

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XDM

Cross-Document Messaging// メッセージ送信側iframe1.contentWindow.postMessage( " メッセージ " )

// メッセージ受信側 (iframe 内に表示 )window.onmessage = function( e ){ if( e.origin == "http://example.jp/" ){ alert( e.data ); }}

正規の相手以外と通信しないように origin を必ず確認する

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

HTML5 が生む脆弱性

Cross-Site Scripting(XSS)要素、属性、イベントが増えている

Cross-Document Messaging(XDM)クロスドメインでのドキュメント間通信

XMLHttpRequest(XHR) Lv.2クロスドメインでの読み込み

Ajax データを利用した攻撃XSS 、データの盗み見

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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/security-mikan techtalk #5

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/security-mikan techtalk #5

XHR Lv.2

XHR を利用する側は、任意ドメインからのデータを読まないようにチェック// 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/#http://evil.example.jp/  などの指定で任意コンテンツを挿入可能

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XHR Lv.2

XHR を利用する側は、任意ドメインからのデータを読まないようにチェック// 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/#http://evil.example.jp/  などの指定で任意コンテンツを挿入可能

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XHR Lv.2

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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/security-mikan techtalk #5

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/security-mikan techtalk #5

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/security-mikan techtalk #5

HTML5 が生む脆弱性

Cross-Site Scripting(XSS)要素、属性、イベントが増えている

Cross-Document Messaging(XDM)クロスドメインでのドキュメント間通信

XMLHttpRequest(XHR) Lv.2クロスドメインでの読み込み

Ajax データを利用した攻撃XSS 、データの盗み見

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

Ajax データを利用した攻撃

Ajax での利用増加HTML5 とは直接は関係ない

Ajax データを利用した XSSAjax でやり取りされるデータ (JSON,text,

csv etc..) を直接ブラウザ上で開いたときに XSS

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

より攻撃者が盗み見る

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

Ajax データを利用した攻撃

Ajax での利用増加HTML5 とは直接は関係ない

Ajax データを利用した XSSAjax でやり取りされるデータ (JSON,text,

csv etc..) を直接ブラウザ上で開いたときに XSS

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

より攻撃者が盗み見る

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

Ajax データを利用した XSS

IE の Content-Type無視HTML ではないものが HTML に昇格し

て XSS例えば text/plain

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

Ajax データを利用した XSS

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

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

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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/security-mikan techtalk #5

Ajax データを利用した XSS

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

いのでは

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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/security-mikan techtalk #5

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

Ajax データを利用した XSS

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

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

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

対策の話はあとで。

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

Ajax データを利用した攻撃

Ajax での利用増加HTML5 とは直接は関係ない

Ajax データを利用した XSSAjax でやり取りされるデータ (JSON,text,

csv etc..) を直接ブラウザ上で開いたときに XSS

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

より攻撃者が盗み見る

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

Ajax データの盗み見

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

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

{"from" : "[email protected]"}

JSON

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

Ajax データの盗み見

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

JSON 以外にも CSV などは狙いやすい

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

Ajax データの盗み見

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

JSON 以外にも CSV などは狙いやすい

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

Array Hijacking for Android

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

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

Array Hijacking for Android[ { "name" : "alice", "mail" : "[email protected]" }, { "name" : "bob", "mail" : "[email protected]" },]

<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/security-mikan techtalk #5

Ajax データの盗み見

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

JSON 以外にも CSV などは狙いやすい

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

JSON Hijacking for IE

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

JSON Hijacking for IE

[ { "name" : "abc"}];var t=[{"":"", "mail" : "[email protected]" }, { "name" : "John Smith", "mail" : "[email protected]" }]

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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" : "[email protected]" }, { "name" : "John Smith", "mail" : "[email protected]" }]

ターゲットとなる JSON http://example.com/newmail.json[ { "name" : "abc"}];var t=[{"":"", "mail" : "[email protected]" }, { "name" : "John Smith", "mail" : "[email protected]" }]

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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" : "[email protected]" }, { "name" : "John Smith", "mail" : "[email protected]" }]

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

JSON Hijacking for IE

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

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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

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

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

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

ども次善策として…

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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

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

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

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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/security-mikan techtalk #5

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/security-mikan techtalk #5

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

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

IE8 以降で HTML扱いされることがなくなる

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

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

HTML5 が生む脆弱性:まとめ

Cross-Site Scripting(XSS)これまで通りの対策の徹底

Cross-Document Messaging(XDM)origin による通信相手の確認

XMLHttpRequest(XHR) Lv.2クライアント / サーバ側とも通信相手を確認

Ajax データを利用した攻撃XMLHttpRequest からの要求のみに限定X-Content-Type-Options:nosniff ヘッダの付与

新しい防御機構

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

新しい防御機構

様々な防御機構がブラウザに追加XSS フィルター / XSS Auditor X-Content-Type-Options クリックジャッキング対策Content Security Policy

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

XSS フィルター / XSS Auditor

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

レスポンスヘッダに

の指定でフィルタを停止可能

X-XSS-Protection: 0

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

X-Content-Type-Options

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

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

X-Content-Type-Options: nosniff

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

クリック !!

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

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

ク等を引き起こす攻撃

透明表示の標的サイト

罠サイト

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

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

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/security-mikan techtalk #5

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

質問タイム

NetAgent http://www.netagent.co.jp/security-mikan techtalk #5

質問

[email protected]@netagent.co.jp

@hasegawayosuke

http://utf-8.jp/