編集者の声
Internet Explorer デベロッパー センターにようこそ。IE チームのプログラム マネージャおよび IE コンテンツの戦略を担当している Dave Massy です。マイクロソフトの Internet Explorer デベロッパー センター チームのマネージャも務めています。IE チームが IE コミュニティ の中で現在注目していることについて興味のある方は、下記のチーム ブログをご覧ください。ごゆっくりとお楽しみください。
Internet Explorer 7 は、社内では CURI と呼ばれる新しい URL 処理アーキテクチャを備えています。新しく最適化された URI 関数により、URI 解析のセキュリティと整合性が強化されるため、攻撃対象を低減して悪意のある URI の脅威を軽減することができます。
IE7 のセキュリティ戦略 (英語) を構築すると、システムのセキュリティにとって IE による URI の安全な処理が不可欠になるため、悪意のある URI はリストの先頭付近に配置されます。したがって、主要なアーキテクチャの投資は IE 7 の CURI に実施されました。
IE7 の多くの新機能とは異なり、大部分のエンド ユーザーは CURI が「見えない所」でユーザーの代わりに機能していることに気付かないでしょう。ただし、CURI の詳細を知ることで、有益な情報を手に入れることができる場合もあります。
背景
URL (Uniform Resource Locator) は、Web ユーザーが使用する最も重要かつ単純に見える概念であり、ほぼすべてのユーザーが URL をブラウザが Web サイトを見つけるための文字列であると認識しています。
URI (URL のスーパーセット) は、最近、RFC3986 (英語) で正式に規定されました。これは4度目となる URI 定義の重要な改訂です。この RFC の内容を以下に示します。
URI (Uniform Resource Identifier) は、抽象的または物理的なリソースを識別するための連続する短い文字列です。
きわめて単純明快です。ただし、何に対しても言えることですが、難解な事柄は細部に存在します。
文字列とオブジェクト
URI の定義から考えると、URI を文字列であると表現するのは当然のことです。実際に、URI が最も頻繁に格納および転送される形式は単純な文字列です。たとえば、ユーザーは Web ページに移動するために、ブラウザのアドレス バーに URI の文字列を入力するか、あるいは文字列の URI 値を持つ HREF 属性を含んだ HTML アンカー タグをクリックします。
残念ながら、文字列を使用して URI を格納することにはマイナス面があります。最大の問題は、文字列は連続する文字を含むだけの単純なデータ構造であるため、データを解析するための詳細な情報やロジックを収容できないことです。URI に関するより多くの情報を収容することには、いくつかの利点がありますが、最大の利点はセキュリティ関連です。
ブラウザが URI を使用する仕組み
Web ページを訪問すると、多数の組み込みリソースが相対 URI を介して処理される場合があります。たとえば、http://search.msn.com/default.aspx (英語) を訪問すると、HTML ソースには次のイメージ タグが含まれます。
<img src="/s/hp/bluesky_logo.gif" title="MSN" alt="MSN" height="32" width="81" />
このイメージをダウンロードするには、ブラウザは最初に http://search.msn.com/default.aspx と /s/hp/bluesky_logo.gif を結合して、ダウンロードを実行できる URI を完成する必要があります (http://search.msn.com/s/hp/bluesky_logo.gif)。ベース URI と相対 URI を結合するには、ブラウザは最初にベース URI と相対 URI を解読して、それぞれのコンポーネントを取得する必要があります。
URI は複数のコンポーネントで構成されており、各コンポーネントはブラウザおよびサーバーが、要求されたファイルを取得するために役立ちます。
たとえば、次の URI について説明します : http://search.msn.com/results.aspx?q=ie7#listings
- scheme コンポーネントは http です。
- hostname コンポーネントは search.msn.com です。
- path コンポーネントは /results.aspx です。
- query コンポーネントは q=ie7 です。
- fragment コンポーネントは listings です。
したがって、イメージの完全な URI を生成するときに、IE はベース URI (http://search.msn.com) のスキームとホスト名を相対 URI (/s/hp/bluesky_logo.gif) と結合する必要があります。言うまでもなく、この解読および結合プロセスをページごとに数百回実行することは、きわめて非効率であり、不整合な解析や評価の危険性があります。
セキュリティ
すべての Web ブラウザでは、URI に基づいてセキュリティの決定を行います。多くのセキュリティ機能は、セキュリティ ゾーンから JavaScript same-origin policy (英語) まで、ブラウザが整合性を保持して URI を評価し、コンポーネントを決定して他の URI と比較できることに依存します。
悪意のある人物がブラウザを利用して、URI を不正に解読または結合できると、ユーザーのセキュリティは危険に晒されます。何年もの間、多くのブラウザ修正プログラムが発行されて、URI 解析の欠陥の悪用に対処してきました。たとえば、CAN-2005-0054 (英語) の IE の脆弱性、または Opera の旧版の %2f bug (英語) など、多くの例があります。
Internet Explorer に対する URI 解析攻撃は、一般的にセキュリティ関数 (MapURLToZone (英語) など) を欺いて、URI を不正に評価させようとします (間違ったセキュリティ ゾーンの返却など)。URI が実際よりも信頼性の高いゾーンに設定されると、その URI のコンテンツは、より高い権限を使用して実行されます。他の一般的な攻撃としては、他のドメインから Cookie を設定/盗用したり、ドメインからコンテンツを読み込み、他のドメインに送信したり、あるいは、不正な URI を表示することでユーザーをスプーフィングしたりするものがあります。
文字列ベースの URI を安全に処理する上で発生する問題の多くは、単一の URI を表記するのに無数の方法があるため、単純な文字列比較ができないことに起因します。RFC3986 (英語) では、URI の文字が %HH のフォーマットでパーセントエンコードされた文字と同じになる条件を規定しています。同じになる規則は、URI 内の文字の表示場所によって異なります。たとえば、スキームとホスト名には大文字と小文字の区別がありませんが、パスとクエリにはこの区別があります。
次の URI はすべて同じになります。
- http://www.example.com/sample/
- http://www.EXAMPLE.com/sample/#
- Http://www.ex%41mple.com/s%61mple/
- http://www.example.com/sample/arbitrary/.%2e/
URI を正しく評価するには、ブラウザのすべてのコード パスが、URI 解析規則について完全に認識している必要があります。何らかの欠陥があると、攻撃者がセキュリティ制限を免れることが可能になります。
ソリューション : CURI
CURI は、処理の負担が少ないオブジェクトであり、通常の形式では単一の URL を保有します。CURI が文字列 URI から構築される場合、その文字列 URI はオブジェクトが最初に構築されるときに 1 度だけ解読されます。構築後、呼び出し元からはオブジェクトが提供するメンバを使用して、あらゆるURI コンポーネントにアクセスできます。これによって、セキュリティおよび機能コード パスの両方を介して URI は一貫して確実に評価されます。Internet Explorer を再びプラミングして、CURI オブジェクトを内部で承認および使用します。この機能の多くはベータ1に搭載済みです。
CURI オブジェクトは、ActiveX コントロールやブラウザ ヘルパー オブジェクトなどの外部の呼び出しモジュールによる消費に対して使用可能です。マニュアルは、CURI クラスがファイナライズされるときに MSDN 上で提供されます。CURI オブジェクトからシリアル化された Unicode 文字列は一貫して正規化されて、IE の外側でも不正な解析の可能性が減少するため、CURI オブジェクトを直接消費しない外部コードにも、この変更による利点があります。
今後の方針 : 国際的な URI
CURI オブジェクトによる一元化の利点は、今後の URI 処理を強化できることです。特に、国際的な URI は、Internet Explorer 7 のキー シナリオであり、完全な Unicode CURI オブジェクトは全世界のサポートのための根本原理です。国際的な URI は、今後ますます増加する国際的なオンライン サイトおよび世界の多様な言語が表示される Web にとって不可欠です。
国際化ドメイン名 (IDN) に対する IE7 のサポートについてはまだ情報を提供する用意ができていませんが、ベータ 2 では多くの情報が入手できる予定です。特に、既存のネットワーク インフラストラクチャ内での IDN の処理の仕組み、および IE7 が Unicode ホモグラフ (同形異義語) 攻撃 (英語) の脅威を軽減する方法に関する情報を提供する予定です。
- EricLaw
2005 年 8 月 15 日 (月) 19:03:00 公開 GMT コメント (0)
|