2

私のアプリケーションでは、LoadLibrary WIN32 で DLL をロードできるとします。その DLL のコードがわからないので、悪意がある可能性があります。私の質問は、ウィンドウにそのDLLにいくつかの制限を適用するように指示する方法があります(たとえば、ディスクアクセス、パスワードの読み取り、またはその他の潜在的な危険なデータの読み取り/書き込みアクセス)?

そうすれば、DLL コードがディスクにアクセスしようとするたびに、例外が生成されるか、呼び出されたメソッドが何らかのエラーを返します。コンパイル済みでリンク済みで効率的なコードの代わりに、javascript やその他のスクリプトで解釈されたコードを使用しないようにすると便利です。

私が使用できる同様のメカニズムはありますか?

ex1 : RestrictAccess( GetProcAdress( ... ), size ); // コードメモリアクセスによる

ex2 : thread1.loadLibrary( ファイル ); RestrictAccess(スレッド1); // スレッド アクセスによる

等...

4

4 に答える 4

1

プロセスまたはスレッドを制限するために呼び出すことができる 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 を読み込む代わりに、何らかの中間形式にコンパイルされたコードを読み込み、それを解釈します。これにより、インタープリターはプログラムが実行できることを完全に制御できます。これも実装が難しく、パフォーマンスが大幅に低下します。

これらは、信頼できないコードを実行する場合に経験しなければならない極端な例です。

于 2011-03-20T16:35:56.270 に答える
1

典型的な解決策は、サンドボックス化できるインタープリター言語またはコンパイルされたバイト コード (Lua など) のプラグインのみを許可することです。一部のオペレーティング システム (iOS や Android など) ではこのような制限が設けられていますが、ネイティブの Windows DLL をロードするときにそのような機能が見つかるとは思えません。

于 2011-03-20T16:37:21.343 に答える
1

DLL ファイルから名前を読み取ることができます。このようにして、リンクされている他の DLL と、それが使用する外部関数 (Windows API など) を確認できます。ホワイトリストを作成して、関数がその DLL からのみ呼び出されるようにすることができます。この方法では、プラグインが合法的にアクセスできるすべてのものに対してラッパー関数を作成する必要があります。

于 2011-03-20T16:41:12.380 に答える
1

特権は、偽装を使用してスレッドごとに増やすことができますが、減らすことはできません (信頼されていないコードは常に行うことができるためRevertToSelf)。

下位権限の最小単位はプロセスです。はい、そのための API があります: CreateProcessAsUser. パイプを使用して、信頼できないプロセスとの間でデータを転送できます。

または、DCOM を使用して、DLL 内のオブジェクトのメソッドを呼び出すことができます。資格情報を指定すると、OS がそれらの資格情報を使用してヘルパー プロセスをセットアップし、データをマーシャリングしてやり取りします。

于 2011-03-20T16:40:29.437 に答える