Access-Control-Allow
Download
Report
Transcript Access-Control-Allow
クロスドメインモデルの
理解
Peleus Uhley
PacSec 2008
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
概要
導入
クロスドメイン通信の歴史
HTMLにおけるクロスドメイン
プラグインにおけるクロスドメイン
比較表
クロスドメイン実装のベストプラクティス
結論
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
同一元ポリシー
ウェブサイトのコンテンツが、他のウェブサイトのコンテンツから読み出しや変
更できるのは望ましくない
ブラウザセキュリティの基本構成要素
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
GETとPOST
ドメイン間の情報送信は常に許可されてきた
レスポンスの読み取りは同一元ポリシーによって制限されていた
クロスサイトリクエストフォージェリ
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
他のトリック
JSON-P
別ドメインへ情報を渡すために、scriptタグとJSONデータ+コールバック関数を利用
Not inline with the intention of the JSON format(※未訳)
Document.domainの書き換え
www.example.org を example.org に短縮するために利用できる
インポート読み込み
scriptタグはリクエストに応じて動的なJavaScriptを返すCGIを指定することができる
プラグインは他のドメインからSWFをインポートすることができる
HTTPの代替物
ソケット、ローカルコネクション、他のプロトコルなど
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
これらのソリューションによって何ができるのか?
開発者は、クロスサイトリクエストフォージェリの危険がない、クロスドメイン通
信の手法を必要としている
2つのドメインが同じ開発グループによってコントロールされているか、承認さ
れたAPIがあるならば、クロスドメインに危険性はない
www.example.org と data.example.org
できるだけ多くの人に利用してもらうために、明示的にウェブに情報を公開す
る場合がある
毎日の株価情報
選挙の結果
天気予報
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
HTML での規格
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
Microsoft XDR
IE 8 Beta 1にて導入
マイクロソフトのインタネットゾーンに基づいたセキュリティ
プロトコルが一致していなければならない(file:// <-> file://)
クッキー: クッキーは送らない
HTTPメソッド: GETとPOSTのみを許可
改良点: URI毎
Beta2 では W3 Access-ControlのAccess-Control-Allow-Originヘッダを
サポートするよう改訂された
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
XDR サンプルコード
if (window.XDomainRequest) {
xdr = new XDomainRequest();
if (xdr) {
//Assign handlers to xdr {not shown}
xdr.open(“POST", “http://www.example.org/xdr.cgi”);
xdr.send(“HTTP_VAR=hello%20World”);
}
function readdata() {
var dRes = document.getElementById('dResponse');
dRes.innerText = xdr.responseText;
alert("Content-type: " + xdr.contentType);
alert("Length: " + xdr.responseText.length);
}
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
W3C Access Control
クロスドメインXML HTTP リクエスト(XHR)を許可
最近MicorosoftとMozillaが承認
まだ開発中段階
クロスドメインの認可情報をヘッダで送信
レスポンスはフルURI単位
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
Pre-Flight リクエスト
Pre-flightリクエストは、以下のようなカスタマイズされたリクエストが行われる
場合に実行される:
GET, POST, HEAD 以外のメソッドを利用
カスタムヘッダを利用
Content-typeヘッダがapplication/x-www-form-urlencoded, multipart/form-data,
text/plain以外
Pre-flightリクエストでは、OPTIONSメソッドが使われる
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
Pre-Flight リクエストヘッダ
Origin リクエストヘッダ
Access-Control-Request-Method リクエストヘッダ
リクエスト元を指定
GETやPOST以外の利用したいHTTPメソッドを指定
Access-Control-Request-Headers リクエストヘッダ
XHRが含む予定の追加ヘッダを指定
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
W3C Access Control レスポンスヘッダ
Access-Control-Allow-Origin レスポンスヘッダ
クロスドメイン通信が許可されているリクエスト送信元
“*”はどこからでもアクセスを許可
Access-Control-Max-Age レスポンスヘッダ
Access-Control-Allow-Credentials レスポンスヘッダ
クッキー、HTTP 認証ヘッダや他の認証情報が必要かどうかを示す
Access-Control-Allow-Methods レスポンスヘッダ
pre-flightリクエストの結果をキャッシュする期間
リクエストを許可するHTTPメソッド一覧
Access-Control-Allow-Headers レスポンスヘッダ
リクエストに含むことを許可するヘッダ一覧
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
XHR Requestの例
new client = new XMLHttpRequest();
client.open(“CUSTOM", "http://www.example.com/hello")
client.onreadystatechange = function() { /* do something */ }
client.send()
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
Pre-Flight リクエスト(hello-word -> www)
リクエスト
OPTIONS /hello HTTP /1.1
Origin: http://hello-world.example.org
Access-Control-Request-Method: CUSTOM
レスポンス
Access-Control-Allow-Origin: http://hello-world.example.org
Access-Control-Max-Age: 3628800
Access-Control-Allow-Methods: CUSTOM
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
実際のリクエスト (hello-world -> www)
リクエスト
CUSTOM /hello HTTP /1.1
HOST: www.example.org
ORIGIN: hello-world.example.org
….
レスポンス
Access-Control-Allow-Origin: http://hello-world.example.org
Hello World!
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
他の利点
ORIGINヘッダの導入
暫定的な提案では、クロスサイトリクエストフォージェリからの保護のため、
XML HTTP Request以外でOriginヘッダを利用
プライバシーの問題もなく、REFERERよりも一貫している
現在策定中
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
postMessage / クロスドキュメントメッセージング
HTML5 Spec内で定義
Used to send strings of data between frames as GET VARs(※未訳)
Firefox 3, IE8, WebKit ナイトリー, Opera 9.5 で対応
メッセージに”To”アドレスを含めることによってセキュリティコントロール
“To”はワイルドカードの場合もある
改良点: ドメイン単位
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
data.example.comでのサンプルコード
<iframe src="http://www.example.org/message/"
id="iframe"></iframe>
<form id="form">
<input type="text" id="msg" value="Message to send"/>
<input type="submit"/>
</form>
<script>
window.onload = function(){
var win = document.getElementById("iframe").contentWindow;
document.getElementById("form").onsubmit = function(e){
win.postMessage(
document.getElementById("msg").value,
"http://www.example.org"
);
e.preventDefault();
};
};
</script>
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
受信
<b>This iframe is located on www.example.org</b>
<div id="test">Send me a message!</div>
<script>
window.addEventListener("message", function(e){
if ( e.origin !== "http://data.example.com" )
return;
document.getElementById("test").textContent = e.origin + " said: "
+ e.data;
}, false);
</script>
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
Post processing
IE 8 Beta 2 ではリターンされた文字列を後処理するeval()以外のメソッドが
導入される
toStaticHTML -- HTMLからJavaScriptを取り除く
JSON.stringify -- スクリプトオブジェクトをJSONストリングに変換
JSON.parse -- JSONストリングをJavaScriptオブジェクトに変換
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
Plugin での規格
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
Adobe クロスドメインの歴史
2005年にAdobeによって開発
最初の公式なクロスドメインモデル
現在Adobe Flash PlayerとAdobe Readerで使われている
JavaFX, Reader, SilverLightでのさまざまなサポート
メタポリシーとヘッダのための最近のいくつかのアップデート
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
Adobe クロスドメイン
2005年にAdobeによって開発
HTTPレスポンスボディの読み込み許可
ヘッダデータへのアクセスは許可しない
GETリクエストとファイルアップロードを制御
認証情報を送信
HTTPSからHTTPSへの通信は許可
HTTPからHTTPSへの通信はデフォルトで許可しない
ソケット用の異なるポリシーメカニズムが存在
ディレクトリ毎のパーミッション
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
3タイプのコントロール
データを共有したいドメイン
ウェブサイトから受け取りたいカスタムヘッダ
サーバ上に他のクロスドメインポリシーファイルが存在するかどうか
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
クロスドメインポリシーファイルの例
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-access-from domain=“example.com“ secure=“true”/>
<allow-access-from domain=“*.example.com“ secure=“true”/>
<allow-http-request-headers-from domain="www.example.com" headers="SOAPAction"
secure=“true"/>
</cross-domain-policy>
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
JavaFX
Adobeのcross-domain.xmlファイルのシンプルバージョンをサポート
基本的には”*”のみサポート
Java Web StartとJava Plug-In技術のために、Java SE 6 update 10で導入
Java SE 6 update 10は現在リリース候補
クッキー: 利用
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
Microsoft SilverLight
Adobeの cross-domain ファイルフォーマットのシンプルバージョンをサポー
ト(headersとallow-domain)
独自のファイルフォーマットをサポート(clientaccesspolicy.xml)
クッキー: 利用
改良点: ドメイン単位 & ディレクトリ単位
HTTPSからHTTPSのクロスドメイン通信は禁止
HTTPからHTTPSへも禁止
ソケットパーミッションも同様に定義
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
ClientAccessPolicy ファイルのサンプル
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from>
<domain uri=“http://www.adobe.com:80"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
他のクロスドメインコントロール
Flash Player AllowScriptAccess OBJECT タグパラメータ
SWFからHTML DOMへの通信を許可
クロスドメイン通信を許可しない”sameDomain”がデフォルト
HTMLからSWFへの通信のためには、SWF内の関数が明示的に登録される必要がある
SilverLight
EnabaleHtmlAccessパラメータはSilverLightからHTMLへのクロスドメイン通信を許可
ExternalCallersFromCrossDomainはHTMLからSilverLightへのクロスドメイン通信を許可
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
比較
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
ブレークダウン(※もっといい訳を考える)
クッキー/認証
ヘッダの送信
許可されるメソ
ッド
Adobe
Crossdomain
Access
Control
XDR
PostMessage
/XDM
ClientAccessPolicy
はい
オプショ
ン
いいえ
はい *
はい
オプション
オプショ
ン
いいえ
N/A
オプション
Any
GET/
POST
N/A
GET/POST
はい
None
GET/POST
ワイルドカード
ドメイン
はい
はい
ワイルドカ
ードのみ
クロスプロトコ
ル
オプション
はい
いいえ
はい
None
スコープ
ディレクトリ単
位
ファイル
単位
ファイル単
位
ファイル単位
ディレクトリ単位
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
脅威
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
ヘッダへのアクセス
すべてのモデルはHTTPヘッダへのアクセスを制限しようとしている
これはサーバの以下のような危険な振舞いを防ぐことができる可能性があ
る:
TRACEメソッドの許可
レスポンスボディ中のセッションIDをURLの一部として返す
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
クロスサイトスクリプティング
クロスサイトスクリプティングフィルタは新しいJavaScriptでは準備されないか
もしれない
JSONのように、開発者はクロスドキュメントメッセージングのデータがどのよ
うに扱われるのか、注意する必要があるだろう
伝統的なクロスサイトスクリプティング攻撃は依然として存在し続けるだろう
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
クロスサイトリクエストフォージェリ
クロスサイトリクエストフォージェリ攻撃はレスポンスデータにアクセスできる
かもしれない
過度に寛容なクロスドメイン実装はこのような攻撃を許してしまう可能性があ
る
ORIGINヘッダがこのような攻撃を減らす役に立つかもしれない
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
センシティブな情報のリーク
攻撃者はセンシティブな情報を含むレスポンスボディにアクセスできる
これは最少特権の原理に従わない場合に起こりえる:
ドメインの大本のクロスドメインポリシーでワイルドカードが指定されている
クロスドメインポリシーが特定のサブドメインやファイルに制限されていない
あるモデルでは、サーバが権限を決めるために必要なすべての情報を持っ
ていることを確かめるために、クッキーを送信する(※自信なし)
またあるモデルでは、サーバによる間違いというリスクを避けるために、クッ
キーを送らない(※自信なし)
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
ベストプラクティス
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
“*” は本質的にevilか?
適切に適用されない場合、危険となり得る
センシティブではないウェブサイト上の、本当にパブリックな情報であればOK
天気予報
選挙結果
株式市場情報
ローカルファイルシステムのコンテンツには必要かもしれない
露出を最小限にするため、ウェブサイトのサブディレクトリに対して適用する
べき
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
ドメインのスコープを理解する
コントロールはプロトコルに基づいて制限される?
コントロールはポートに基づいて制限される?
コントロールはフルURIに基づいて制限される?
リモートドメインはユーザによってアップロードされたコンテンツを許可してい
る?
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
“信頼されたコンテンツ”を慎重に定義する
開発者は、クロスドメインデータを処理するコードを、自分で作成しているの
で、信頼する傾向にある
しかし、コードは信頼できるとしても、信頼できないデータをパースしている
開発者はクロスドメインコードを信頼できるドメインにホストするか、コードを
別のドメインに移動することによるsame-origin protectionを活用することを
考慮すべき
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
クロスドメインリクエストされる側
ユーザは、あなたが彼らの情報を外部に公開することはないと信頼してい
る、ということを肝に銘じる
ワイルドカードは避ける
可能であればパスやURIの制限を活用する
必要なヘッダ以外は許可しない
必要であればW3C Access Controlによる認証リクエストを行う
センシティブなページではXDMを許可しない
XDMリクエストではtoStaticHTMLやJSON parsingといった安全なデータハ
ンドリングを活用する
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
クロスドメインリクエストする側
ユーザはあなたが彼らの情報を外部に送ることはないと信頼している
リモートサイトは彼らが持つ情報を、あなたを信頼して預けている
誰かがネットワーク上でリクエスト元ドメインをスプーフィングするかもしれな
い
センシティブなデータを含むページに対するXDMを許可しない
データバリデーションを行う
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
クロスドメインを許可しないことを考慮する
HTTP/HTTPSが混在したクロスドメイン通信
プロキシによってリレーするのがより適切
センシティブな情報をホストするサイトには、クロスドメインは適さないかもし
れない
インターナルなウェブサーバでは、ワイルドカードパーミッションが必要
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
結論
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
Good or Evil?
Evil?
開発者はセキュリティに関する決定でミスをするかも
情報共有に関する決定にユーザは関わらない
より大きな機能は新しいリスクを生み出す
Good?
形式化されたモデルは危険なソリューションに対してより安全な代替案を提供する
コントロール方法が形式化されていると、クロスドメインによる情報漏えいの発見や監視が
容易になる
古くて危険なソリューションは、時間をかけて強化されていく、または捨てられる
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
結論
Appropriate for sharing between sites owned by common entities(※未
訳)
開発者は、彼らが利用しているものをコントロールすることについて教育され
る必要がある
設計されたクロスドメイン通信は、アドホックなソリューションよりベターだ
さまざまなソリューションは開発者に選択権を与える
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
クロスドメイン通信関連記事
Cross-domain 101
Updates for AJAX in IE8 Beta 2
http://www.adobe.com/devnet/flashplayer/articles/cross_domain_policy.html
http://blogs.msdn.com/ie/archive/2008/10/06/updates-for-ajax-in-ie8-beta-2.aspx
PostMessage API Changes
http://ejohn.org/blog/postmessage-api-changes/
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
テクニカルリファレンス
Adobe Cross-domain
Overview: http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html
Schema: http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html
Access Control Spec
SilverLight Information
http://msdn.microsoft.com/en-us/library/cc197955(VS.95).aspx
Java
http://dev.w3.org/2006/waf/access-control/
https://jdk6.dev.java.net/plugin2/#CROSSDOMAINXML
Cross-document messaging/PostMessage
Mozilla: https://developer.mozilla.org/En/DOM:window.postMessage
Microsoft: http://msdn.microsoft.com/en-us/library/cc197057(VS.85).aspx
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.
Questions?
®
Copyright 2008 Adobe Systems Incorporated. All rights reserved.