外部 DLL (一種のプラグイン システム) をロードするプロセスがあり、ロードされた DLL が Authenticode を使用して正しく署名されていることを確認します。WinVerifyTrustとLoadLibrary (およびその仲間)のドキュメントを熟読した後、私が重要だと思ったことの 1 つは、両方の操作がファイル パスから DLL まで機能することです。
これを悪用して、署名された DLL をプログラムに提示し、呼び出しが実行されるWinVerifyTrust()
前に署名されていないコードですぐに DLL を置き換えることで、プログラムに署名されていない DLL をロードさせることは非常に実行可能であると思われます(これはLoadLibrary()
ハードな競合状態ですが、たとえばネットワーク化されたファイル システムを使用している場合など、攻撃者がファイル システムをある程度制御できる場合は、より適切に制御できます)。
API forWinVerifyTrust()
は、開いているファイルへのハンドルで検証プロセスを実行できることを示唆しているようです。ファイルを開くことができ、開いているファイル ハンドルを確認し、同じファイル ハンドルからライブラリをロードできれば、安全です。残念ながらLoadLibraryEx()
、これを実装するための私の主な容疑者だったでしょうが、そのhFile
パラメーターを「将来の使用のために予約済み」として文書化しています。
私の次の手段は、ファイルの内容をメモリにロードしてから、メモリから DLL をロードすることでした。これを行うライブラリMemoryModuleを見つけました。これらすべてを組み合わせて、開発者が DLL を安全に検証してロードできるようにする既存の実装があるかどうか疑問に思っていました。つまり、自分で記述して保守する必要はありません。
助言がありますか?