プロセスまたはスレッドを制限するために呼び出すことができる API などの簡単な解決策はありません。
プロテクト モード (Vista および Windows 7) で IE が行うことは、プラグインを低い整合性レベルで別のプロセスにロードすることです。低整合性モードで実行されているプロセスは、システム リソースへのアクセスが少なくなり、整合性レベルが高いプロセスからより分離されます。また、整合性の低いプロセスがアクセスできるかどうかを制御するファイル システム オブジェクトやレジストリ キーなどに ACL を設定することもできます。これにより、彼らが与えることができるダメージの量が制限されます。これは、サンドボックス化または (厳密に定義する方法に応じて) 仮想化の形式です。
それを正しくするのは大変な作業です。整合性の低いプロセスは非常に制限されているため、何をするにも助けが必要です。IE がプロテクト モード プロセスを起動すると、メインの IE プロセスと通信するためのチャネルが与えられます。プラグインは、このチャネルを介して要求を行い、レジストリの変更やファイル システムへの書き込みなどを行うことができます。IE はリクエストを検討し、それを許可する必要があると判断した場合、IE プロセスがプラグインに代わってそれを行います。
別のアプローチ (サンドボックス化を補完するために使用できます) は、DLL が有効な証明書で署名されることを要求することです。証明書が責任者を特定するため、署名によって DLL をもう少し信頼することができます。また、この署名により、だれも DLL を改ざんしていないことが保証されます。
さらに別のアプローチは、制限したいすべての OS API 呼び出しをフックすることです。これにはライブラリがありますが、この手法は、更新時に壊れる可能性のある OS ハッカーに依存しています。アイデアは、制限する各 API のフックを設定するコードの一部を使用してプロセスを作成し、信頼できないコードをロードして実行することです。DLL がフックされた API (例: CreateFile
) を呼び出す場合、代わりにコードが呼び出され、エラーを返すか、呼び出しを実際の OS API に渡すかを決定できます。フックする必要がある API の数が膨大になる可能性があるため、これは困難です。また、DLL がこれが使用されている手法であることを認識している場合、それを覆すために実行できることがあります。
最後に、ネイティブ コードをまったく実行しないことで、真のサンドボックス化を行うことができます。信頼されていない DLL を読み込む代わりに、何らかの中間形式にコンパイルされたコードを読み込み、それを解釈します。これにより、インタープリターはプログラムが実行できることを完全に制御できます。これも実装が難しく、パフォーマンスが大幅に低下します。
これらは、信頼できないコードを実行する場合に経験しなければならない極端な例です。