番外編第1回 Flashとポリシーファイルの密接なカンケイ

杉山 俊春
三井物産セキュアディレクション株式会社
テクニカルサービス事業部
コンサルタント
2007/1/30
(Illustrated by はるぷ)

 Flashとポリシーファイルの関係

 Flashでは、「ポリシーファイル」と呼ばれる設定ファイルをサーバ上に設置することで、外部サイトとの連携を行うことが可能になる。このポリシーファイルは、コンテンツを“提供する側”のWebサーバに設置する必要がある。通常は(デフォルトでは)、ドキュメントルートの直下に配置される「crossdomain.xml」というファイルが利用されることとなる。ポリシーファイルでは、読み込みを許可する外部サーバを「domain属性」および「to-ports属性」の2つで制御することとなる。

 以下に、ポリシーファイルの例を示す。

<cross-domain-policy>
<allow-access-from domain="www.example1.co.jp" to-ports="80" />
</cross-domain-policy>

 このポリシーファイルをサーバ上に設置した場合、「www.example1.co.jp上に設置されたFlashからの、80番ポートへのアクセスを許可する」という設定になる。

 このポリシーファイルがドキュメントルートに配置されている場合、Flash側のActionScriptでは、ポリシーファイルを特に意識することなく記述することができる。以下にコンテンツのソースをそのまま取得する例を示す。

var send_lv = new LoadVars();
var load_lv = new LoadVars();
load_lv.onData = function (str) {
result = str;
};
send_lv.sendAndLoad('http://www.example2.co.jp/test/test.html', load_lv, "GET");
ActionScriptで外部コンテンツのソースをそのまま取得する例

 実際に、Flashから外部サイトのコンテンツを読み込む際には、以下の手順で処理が行われる。ここでは、Flashが設置されているサーバをwww.example1.co.jp、コンテンツを読み込まれる側をwww.example2.co.jpとする。

  1. ユーザーがブラウザからwwww.example1.co.jp上のFlashを閲覧する
  2. ブラウザに表示されたFlashは自動的に、「http://www.example2.co.jp/crossdomain.xml」を読み込む
GET /crossdomain.xml HTTP/1.0
Accept: */*
x-flash-version: 9,0,28,0
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.example2.co.jp
Connection: Keep-Alive
実際に送信されるリクエストの例
  1. 読み込まれたcrossdomain.xmlの中身を検証する
  2. 検証の結果、www.example1.co.jpが許可されている場合のみ、コンテンツを取得することが可能になる
Flashから外部サイトのコンテンツを読み込む手順

赤坂さん 「なるほどねぇ……。そんな仕組みになってるんだ。Flashとか全然縁がなかったから考えたこともなかった」
星野君 「結構面白いですよ、Flashって。フリーのソフトでも作れるし」

 赤坂さんは、得意気な星野君を見て、少し不愉快だったのでテスト用のWebサーバの環境を用意し、早速検証をしてみることにした。プログラミングの経験がある赤坂さんにとっては、簡単なActionScriptを組むだけであれば、あまり苦もなく作成することができた。

赤坂さん (なるほど……。ポリシーファイルがない場合は読み込めないのか)

 いろいろと検証しているうちに、赤坂さんはあることに気が付いた。

 ポリシーファイルが情報漏えいのきっかけになる?!


赤坂さん 「ねえねえ、ちょっと教えて」
星野君 「何ですか?」
赤坂さん 「さっき教えてもらったポリシーファイルなんだけど、これって大丈夫なの?」
星野君 「どれですか?」

 赤坂さんの会社の公開されているWebサーバのポリシーファイルには以下のような記述がなされていた。

<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
すべてのサイトからの読み込みを許可するポリシーファイル

 このような記述の場合、domain属性にワイルドカードが指定されているため、外部サイト上に設置されているすべてのFlashから読み込むことが可能になってしまう。また、to-ports属性がないため、XMLSocketによる1024番ポート以上のポートへの接続(プロトコルによらない)を許してしまうことになり、ユーザーのブラウザ上からポートスキャンを行わせることができてしまうという弊害も存在する。

星野君 「んー。あまり好ましくないけど、不特定多数からのアクセスを想定しているようなサイトの場合、そういう設定になってることも多いですよ」
赤坂さん 「ふむ……。これ、うちの会社のWebサーバ上にあるんだけど」
星野君 「え。それってダメじゃないですかね。取引先からのこっち側へのテスト用に置いたんですかねぇ」
赤坂さん 「うちって一部特定のお客さんに向けて個人情報扱うWebアプリ動いてた気がするけど、それ、読み込まれちゃったりしないの?」

 Flashから外部サイトへ読み込みを行う際には、通常のブラウザからのアクセスと同様に、Cookie情報も送信される仕組みになっている。そのため、同一サイト上にCookie情報を利用して認証状態を管理しているWebアプリケーションが設置されている場合、認証状態に対応したコンテンツを返してしまうことになる。該当Webアプリケーション上で個人情報を扱っている場合、個人情報の漏えいにつながる危険性がある。

GET /test.jsp HTTP/1.0
Accept: */*
Referer: http://www.example1.co.jp/crossdomain.swf
x-flash-version: 9,0,28,0
Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.example2.co.jp
Cookie: JSESSIONID=B6B786C92D96E7853ADE44E62D04B68F
Cookie情報を含んだリクエストの例
(www.example1.co.jpの上のFlashからwww.example2.co.jpのコンテンツを取得)

星野君 「うーん。これだと個人情報の漏えいにつながっちゃうかもしれないですね。domain属性を見直してもらうようにいっておきますね」
赤坂さん 「だねー。……って、あれ? それでもダメじゃない? 取引先からも読み込めちゃダメだし、向こうのサーバが乗っ取られたりしたら巻き添えになるよねぇ」
星野君 「あれ……。ホントだ、ダメですね。どうすればいいんだろう」
赤坂さん 「どうするんだろうね……。ちょっと調べてみる」

 赤坂さんは、ポリシーファイルの設定について調べたが、あまり踏み込んだ情報になかなかたどり着くことができなかった。

赤坂さん (うーん。これは分かんないなぁ……)

2/3

Index
Flashとポリシーファイルの密接なカンケイ
  Page1
Flashで外部サイトとの連携は簡単?
Page2
Flashとポリシーファイルの関係
ポリシーファイルが情報漏えいのきっかけになる?!
  Page3
ポリシーファイルの影響を個別ディレクトリに限定する


星野君のWebアプリほのぼの改造計画 連載インデックス


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間