CA5392: P/Invoke に対して DefaultDllImportSearchPaths 属性を使用します
プロパティ | 値 |
---|---|
ルール ID | CA5392 |
Title | P/Invoke に対して DefaultDllImportSearchPaths 属性を使用します |
[カテゴリ] | Security |
修正が中断か中断なしであるか | なし |
.NET 8 では既定で有効 | いいえ |
原因
DefaultDllImportSearchPathsAttribute が プラットフォーム呼び出し (P/Invoke) 関数に対して指定されていません。
規則の説明
既定では、DllImportAttribute を使用している P/Invoke 関数では、ライブラリが読み込むための現在の作業ディレクトリを含むいくつかのディレクトリを精査します。 これは特定のアプリケーションでセキュリティ上の問題を引き起こし、DLL のハイジャックにつながる可能性があります。
たとえば、インポートされた DLL と同じ名前の悪意のある DLL が、既定で最初に検索される現在の作業ディレクトリの下に置かれている場合、悪意のある DLL が読み込まれる可能性があります。
詳細については、ライブラリの安全な読み込みに関するページを参照してください。
違反の修正方法
DefaultDllImportSearchPathsAttribute を使用して、アセンブリまたはメソッドに対して DLL 検索パスを明示的に指定します。
どのようなときに警告を抑制するか
次の場合は、この規則を抑制できます。
- 読み込まれたアセンブリが必要なものだとわかっている。 アプリケーションが信頼できるサーバーで実行され、ファイルを完全に信頼できる場合など。
- インポートされたアセンブリが、user32.dll のような一般的に使用されるシステム アセンブリであり、検索パス戦略が Known DLLs メカニズムに従っている。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA5392
// The code that's violating the rule is on this line.
#pragma warning restore CA5392
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA5392.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
疑似コードの例
using System;
using System.Runtime.InteropServices;
class ExampleClass
{
[DllImport("The3rdAssembly.dll")]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
public void ExampleMethod()
{
MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
}
}
解決策
using System;
using System.Runtime.InteropServices;
class ExampleClass
{
[DllImport("The3rdAssembly.dll")]
[DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
public void ExampleMethod()
{
MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
}
}
関連規則
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET