この情報は、米国アドビシステムズ社が提供している情報をもとにローカライズし、作成したものです。

内容 (What's Covered)

アドビは2012年6月上旬に、Windows 版 Firefox 用の Flash Player 保護モードを発表しました。この保護モードの実装により、Flash Player をいくつかの追加制限が課された低整合プロセス(low integrity process)として実行し、ランタイムが機密リソースにアクセスするのを防ぐことができます。この手法は、David LeBlanc氏の実用的なWindowsサンドボックスの設計仕様と、アドビが開発したAdobe Reader Xサンドボックスに基づき開発されています。制限の課されたプロセスとして Flash Player を実行することにより、攻撃者が単なる不具合を、実践可能な攻撃対象として悪用することを一層困難にします。このブログ記事では、上記設計仕様の技術実装の概要を解説します。

Flash(SWF)コンテンツが配置されたページに初めてアクセスすると、Flash Player に関する 3 つのプロセスが存在することが確認できます。この動作は一見、奇妙に見えるかも知れませんが、実際にはきちんとした理由があります。今回の設計趣旨のひとつは、サンドボックスをサポートするにあたり、Firefox 側で必要となる変更を最小限に抑えることでした。Flash Player と Firefox をゆるく結合することにより、リリースのタイミングを合わせるといった煩雑さなしで、それぞれのコードを変更することができます。

Firefox のインスタンスにある 1 つ目のプロセスが「plugin-container.exe」と呼ばれるものです。Firefox では以前からプラグインが独立したこのプロセス内で実行されているため、この実装方法を再考することは考えませんでした。この仕様においてプラグインコンテナ自体は、NPAPI リクエストをブラウザーに中継できるようにする、軽微なパッキン材ということになります。また、アドビはこのプロセスを、ブローカープロセスを作成するための起点としても使用しています。ブローカーを別途プロセスにすることにより、ブラウザーからの独立性を保つことができるとともに、将来的にはブローカープロセスの制限についても自由度が確保されることになります。ブローカープロセスからは、サンドボックス化されたプロセスを呼び出しています。このサンドボックス化されたプロセスには、大幅な制約が課されており、Flash Playerエンジンはサンドボックス化されたプロセス内で、Webコンテンツの処理とレンダリングを行います。

サンドボックス化されたプロセスには、Windows OS 由来のいくつかの制限が課されています。Windows Vista と Windows 7 には、プロセスを適切にサンドボックス化するためのツールが用意されています。2010 年に Adobe Reader および Acrobat にサンドボックスを実装するにあたり、アドビは同様の制御性を Windows XP でも再現するために相当の開発努力を費やしました。しかし、Windows 8 と発売を控えた今日では Windows XP の使用率が急速に減少する傾向にあり、今回 Flash Player 開発チームが開発作業を行うにあたっては、Windows XP 向けに同様の開発作業を行うのは理にかなっていませんでした。そこで、今回は Windows Vista 以降を対象としたFirefox の保護モードを実現することに集中しました。

今回の開発対象となったオペレーティングシステムにおいては、次の 3 種類の制御性を主に活用しています。

1 つ目の制御性は、サンドボックス化したプロセスを低整合で実行することです。デフォルトの場合、ユーザーの指示で起動したプロセスは中整合で実行されますが、プロセスを低整合レベルで実行することによって、本来中整合レベルのアクセスが必要とされる、ユーザーの大半のローカルプロファイルやレジストリへの書き込みを防ぐことができます。また、UIPI(User Interface Privilege Isolation)も利用できるようになるため、低整合プロセス(low integrity process)がより上位の整合プロセスにウィンドウメッセージを送信するのを防ぐこともできます。

サンドボックス化されたプロセスに適用される 2 つ目の制御性は、アクセストークンの機能制限です。プロセスは、ユーザーのセキュリティプロファイルに記された利用可能な SID(Security Identifiers)を継承します。これらのSID は、ユーザーが所属する OS のグループを示すものであり、アクセストークンには SID のリストと、それらの SID 用の一連の制御性が含まれています。Windows OS は、アクセストークンに含まれている SID とターゲットオブジェクト(ファイルなど)のグループ権限を比較して、アクセスの許可/非許可を判断します。なお、この比較時に SID がどのように使用されるかは、我々が定義することも可能です。

一般的に、サンドボックス化されたプロセスは、ユーザーが所有するリソースに直接アクセスできる必要があります。しかし、ほとんどのサンドボックスにおいては、グループ権限に基づいてユーザーに提供される、広範なリソース群がすべて必要になることはありません。例えば、読者の企業ネットワーク共有上に、「従業員」グループの全員に権限が与えられた連絡先リストがあったとします。たとえこのファイルがユーザーの所有するものではなかったとしても、「従業員」グループに所属している場合、当該ファイルにはアクセスすることができます。Flash Player のサンドボックスプロセスは、このようなファイルに直接アクセスする必要がありません。

Flash Player のサンドボックスプロセスがアクセスしなければならない OS リソースは、次の SID を使用するものであることと判断しました(BUILTIN\\UsersEveryone、ユーザーのLogon SIDおよびNTAUTHORITY\\INTERACTIVE)。ユーザーから継承したその他の SID については、拒否のみの属性を与えることで、当該プロセスが SID 情報のみに基づいて、リソースにアクセスすることを禁止しています。引き続きファイル共有にある連絡先リストの例で考えると、サンドボックス化されたプロセスの場合、このファイルは当該ユーザーが所有するものではないことと、「従業員」グループ SID 属性に拒否のみが付与され、このグループ権限を用いたアクセスが禁止されていることから、この連絡先リストにはアクセスできないことになります。また、プロセスの権限は、ファイルシステムの変更時に当該プロセスへの通知を必要とし、一部の API を正しく機能させるためにも必要となる、SeChangeNotifyPrivilege のみに限定されています。次の画像は、サンドボックス化されたプロセスに適用される権限を示したものです。

サンドボックス化されたプロセスに適用される 3 つ目の制御性は、ジョブ制限です。例えば、Active Processes を 1 に設定することにより、サンドボックス化されたプロセスが他のプロセスを起動することを防止できます。また、サンドボックスが他のプロセスと通信するのを防ぎたい場合は、USER Handles と Administrator Access へのアクセスを制限する方法があります。USER Handles の制限は、プロセスが当該ジョブに関連付けられていないプロセスによって作成されたユーザーハンドルにアクセスするのを防止するため、UIPIを補完するものと言えるでしょう。サンドボックスがOSに干渉できる機能については、 System ParametersDisplay SettingsExit Windows および Desktop へのアクセスを制約することで制限をかけられます。

ジョブ制限、権限の制約およびUIPIについて詳しくは、Part 2 of Inside Adobe Reader Protected Modeを参照してください。

OS に実装されている制御性の次に用意されている防御策が、Flash Playerのブローカーコントロールです。

OS ブローカープロセスは中整合で実行され、信頼されていないサンドボックスプロセスとオペレーティングシステム間の門番の役割を担っています。サンドボックスプロセスは、自らが正当に必要とする機密リソースへのアクセスを行う場合、OS ブローカープロセスに問い合わせを行う必要があります。ブローカーが管理するリソースには、ファイルシステム、カメラ、プリントおよびクリップボードへのアクセスなどが含まれます。サンドボックスには、各リソースリクエストへの対応として、どれにアクセスでき、どれにできないかを定義したポリシーが含まれています。例えば、サンドボックスプロセスは、ブローカーを通じてファイルシステムアクセスをリクエストできますが、ブローカー内のポリシーでファイルシステムへのアクセスを制限することにより、あらかじめ指定しておいたファイルシステムの特定のパスに限り、書き込みを許可するといったことが可能です。これにより、サンドボックスがファイルシステムの任意の場所に書き込むことを防止できます。また、サンドボックスは、アプリケーションを直接起動できないことも特筆に値します。例えば、Flash Player がネイティブのコントロールパネルを起動しなければならない場合、Flash Player エンジンはこのリクエストをブローカープロセスに送る必要があります。これを受け取ったブローカーは、ネイティブのコントロールパネルを安全に起動するための詳細を処理します。カメラへのアクセスなどの、その他の OS リソースへのアクセスについても、ブローカーが同様の制御を行います。このアーキテクチャーにより、サンドボックス化されたプロセスは、あらかじめブローカーによってアクセスの正当性が確認されない限り、オペレーティングシステムの大半の部分に直接アクセスできない仕組みになっています。

Flash Player のサンドボックスプロセスは、エンドユーザーにより安全な環境を提供することを目的とした、段階的な改善を経て開発されたものです。当初は Flash Player を低整合プロセス(low integrity process)で実行して書き込み機能を制限する、Internet Explorer 用の保護モードをサポートすることから着手し、その後、Google と協同で Chrome 用のサンドボックスを開発することにより、Flash Player がより堅牢なブローカーを実装するよう改善を行いました。今回リリースした Windows 版 Firefox 用の Flash Player 保護モードは、この Chrome 実装を一段と進化させたものであり、当該プロセスにジョブ制限をかけて Flash Player を実行できるように変更が加えられています。Flash Player の保護モードは Adobe Reader X のそれと同じテクノロジーに基づき開発されているので、この実装により広範な防御策が提供され、Firefox で Flash Player を使用するユーザーが攻撃対象になることを十分に緩和できるものと考えています。今後は、まもなくリリースされる Chrome Pepper 用の Flash Player などにおいて、これまでのインフラをさらに進化させるようなサンドボックスプロジェクトを手がけていく予定です。自動アップデータの促進などの施策と合わせて、これからも Flash Player がより不正攻撃対象になりにくくするための様々な対策を進めていきます。

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー