私は、一般的なアンマネージ DLL ファイルを機能の一部として使用する C# .NET アプリケーションを作成しました。DLL は、System.Runtime.InteropServices から標準の DllImport を使用してインポートされます。
ただし、残念ながら、私のアプリケーション (DllImport を使用するほとんどの .NET アプリケーションと同様) は、DLL ハイジャックに対して脆弱です。つまり、攻撃者は、インポートされた DLL の悪意のあるコピーを、アプリケーションによって開かれたファイルと同じディレクトリに置くことができます。これにより、攻撃者はユーザーのマシンを完全に制御できるようになる可能性があります。
この脆弱性を軽減するために、インポートする前に DLL ファイルが (デフォルトの Authenticode で) 適切に署名されていることを確認したいと思います。sigcheck.exe などのツールを使用して署名を検証できることは知っていますが、C# コード内から実行する必要があるため、これは実行可能なソリューションではありません。
私の質問は単純です: DLL をロードする前に、マネージ C# コード内から DLL に有効な Authenticode 署名があることを確認するにはどうすればよいですか?
制限:
- インポートされた DLL は私が開発したものではなく、外部の会社からのものです。
- DLL はアプリケーションと共に配布されません。アプリケーションを実行する前に、DLL が既にインストールされているはずです。
- インポートされた DLL にはさまざまなバージョンが存在するため (さらに多くのバージョンが追加される予定です)、 インポートする前にDLL の MD5 チェックサムを単純に検証することはできません。
失敗したアプローチ:
- Microsoft は「DLL プリロード攻撃」の防止に関する優れた記事を書いていますが、この情報は .NET の DllImport には当てはまりません。
- Wintrust.dll のアンマネージ関数 WinVerifyTrust の使用を提案している人を見たことがあります。もちろん、これはばかげた解決策です。代わりに、アプリケーションが Wintrust.dll を介した DLL インジェクションに対して脆弱になるからです。