多層防御: HTML5 Sandbox によるマッシュアップのロックダウン

本記事は、マイクロソフト本社の IE チームのブログ から記事を抜粋し、翻訳したものです。 

【元記事】Defense in Depth: Locking Down Mash-Ups with HTML5 Sandbox (2011/7/15 1:14 AM)

開発者がサイトでより安全なエクスペリエンスを構築できるようになれば、Web の品質が向上します。マイクロソフトはこれまで、Internet Explorer のリリースごとに、安全セキュリティ保護されたブラウジング環境の実現に向けて、ブラウザーの機能を強化 (「Internet Explorer 9 のセキュリティ」パート 1 ( 英語)パート 2 ( 英語)パート 3 ( 英語)パート 4 を参照) してきました。Internet Explorer 10 Platform Preview 2 では、HTML5 Sandbox テクノロジーが完全にサポートされており、開発者はサイトのマッシュアップ コンテンツをより厳密にロックダウンできるようになります。

HTML5 Sandbox を使用すると、開発者はサイトの各部分の権限に、さらに制限を加えることができます。この機能を有効にする手順は、iframe 要素に “sandbox” 属性を追加するだけです。

<iframe src="untrusted.html" sandbox></iframe>

 

sandbox 属性を追加すると、フレーム化されたコンテンツで次のアクションが許可されなくなります。

  • プラグインのインスタンス化

  • スクリプトの実行

  • ポップアップ ウィンドウを開く

  • フォームの送信

  • ストレージ (HTML5 localStorage、sessionStorage、cookie など) へのアクセス

  • XMLHttpRequests の送信

  • 親ウィンドウの DOM へのアクセス

  • HTC、バイナリ ビヘイビアー、データ バインドの使用

これらの制限により、フレーム化されたコンテンツの機能は大幅に縮小されます。サイトにとってこれらの制限が過剰である場合は、この属性値のトークンを使用して、特定の機能をコンテンツに戻すことを指定できます。たとえば、次のマークアップでは、上の制限を適用していますが、フォームの送信とスクリプトの実行のみ許可しています。

<iframe src="untrusted.html" sandbox="allow-forms allow-scripts"></iframe>

 

HTML5 Sandbox Test Drive のデモで、すべての許可トークンを実際に試してみてください。サンドボックス化された iframe 内でブロックされるアクションの詳細については、Internet Explorer 10 の開発者ガイド ( 英語) を参照してください。

Web 開発において、マッシュアップ コンテンツのセキュリティは、新しい問題ではありません。開発者は長年にわたって、サイト上で広告、ウィジェット、フォーラム、コメントの投稿などのコンテンツを安全にホストするために苦心してきました。このようなコンテンツは、クロスサイト スクリプティング攻撃 (XSS)、情報の漏えい、ユーザー エクスペリエンスのハイジャックなどの媒介手段となり、ホスティング サイトに危険をもたらす可能性があります。各サイトでは、リスクを緩和するため、次のようなさまざまな対策を講じています。

  • サーバー側とクライアント側でのコンテンツの検証、フィルタリング、エンコーディング

  • 望ましくない API へのアクセスをオーバーライドする JavaScript ライブラリ

  • 既存のクロスオリジン ポリシーを利用した別ドメインからのコンテンツのホスティング

  • Internet Explorer の従来の防御策である security="restricted" 属性の使用

サンドボックスに対するサポートの検出

マイクロソフトでは、開発者がサイトで Internet Explorer 10 標準モードの環境をターゲットにすることを推奨しています。ただし、ユーザーが [互換表示] ボタンをクリックすることでサンドボックスが削除されてしまうといったケースを防ぐため、IE10 では、すべてのドキュメント モードでこの属性をサポートしています。

サンドボックスをサポートしているブラウザーでのみコンテンツが表示されるようにしたい場合、おなじみのフィーチャー ディテクション (機能検出) を使用することをお勧めします。HTML5 Sandbox は、次の JavaScript を使用して検出できます。

if ("sandbox" in document.createElement("iframe")) {

window.alert("HTML5 Sandbox is supported!");

}

適切でセキュアなフォールバック

HTML5 Sandbox をサポートしていないブラウザーでは、この属性は無視されます。これは、追加のセキュリティ制限が適用されることなく、コンテンツが表示されることを意味します。HTML5 Sandbox は多層防御テクノロジーであるため、既に説明した他のマッシュアップのセキュリティ手法と組み合わせて使用するようにしてください。

標準の改良

この機能を実装するにあたり、私たちは、仕様のいくつかの領域を強化する必要があると認識しました。

まず、ブラウザーは既定でサンドボックス内のポップアップをブロックします。しかし、これを許可することが望ましい場合もあります。たとえば、sandbox Test Drive デモでは、サンドボックス化された iframe 内に Bing Maps ウィジェットを配置しますが、ポップアップを許可することにより、拡大した地図、案内、概観図を示すポップアップ リンクに対応しています。IE10 では、このような適切なケースのポップアップを、”ms-allow-popups” トークンによって許可しています。マイクロソフトでは、HTML Working Group に対してこの問題に関するフィードバックを提出済みです。この仕様が更新され、安定化され次第、マイクロソフトはベンダー プレフィックスを削除します。

次に、サーバーがコンテンツをサンドボックス化できることも重要です。“sandbox” 属性は、コンテンツが iframe 内にある場合にのみコンテンツを制限します。サンドボックス化されたコンテンツで、そのコンテンツを直接表示するようにユーザーを誘導している場合、信頼できないコンテンツもサンドボックス化された iframe の外部で表示され、セキュリティ上の制限が一切適用されなくなります。

まだ実装しているブラウザーはありませんが、HTML5 では text/html-sandboxed MIME タイプを使用して、サーバーが信頼できないコンテンツを送信できるようにすることを提案しています。このアプローチには多くの問題があります。特に、MIME タイプでは必要な許可トークンを指定できないという点は大きな問題です。HTML5 からこれを削除する提案について議論が行われた結果、X-Content-Security-Policy HTTP ヘッダーの sandbox ディレクティブの後に配置して、このタイプをサポートすることとなりました。よって、以下のようなヘッダーを送信することで、コンテンツをサンドボックス化しながら、フォームの送信とスクリプトの実行を許可できます。

X-Content-Security-Policy: sandbox allow-forms allow-scripts;

最後に、マイクロソフトでは HTML5 Sandbox 用に 26 のテスト ケースを作成しており、これらを W3C に提出する予定です。

IE10 の HTML5 Sandbox に関する皆様のフィードバックをお待ちしております。ぜひ IE10 Platform Preview 2 をダウンロードしてみてください。バグを発見した場合は、Connect からご報告をお願いいたします。

—Jacob Rossi、Internet Explorer プログラム マネージャー

2011 年 8 月 1 日: X-Content-Security-Policy HTTP ヘッダーの例について、誤記を修正。—Ed.