CA5393: 安全でない DllImportSearchPath 値を使用しないでください
プロパティ | 値 |
---|---|
ルール ID | CA5393 |
Title | 安全でない DllImportSearchPath 値を使用しないでください |
[カテゴリ] | Security |
修正が中断か中断なしであるか | なし |
.NET 8 では既定で有効 | いいえ |
原因
<xref:System.Runtime.InteropServices.DllImportSearchPath?displayProperty=fullName で次のいずれかの安全でない値を使用しています。
AssemblyDirectory
UseDllDirectoryForDependencies
ApplicationDirectory
LegacyBehavior
規則の説明
既定の DLL 検索ディレクトリとアセンブリ ディレクトリに悪意のある DLL が存在する可能性があります。 または、アプリケーションが実行されている場所に応じて、アプリケーションのディレクトリに悪意のある DLL が存在する可能性があります。
詳細については、ライブラリの安全な読み込みに関するページを参照してください。
違反の修正方法
代わりに DllImportSearchPath の値を使用して明示的な検索パスを指定します。
SafeDirectories
System32
UserDirectories
どのようなときに警告を抑制するか
次の場合は、この規則を抑制できます。
- 読み込まれたアセンブリが必要なものだとわかっている。
- インポートされたアセンブリが、user32.dll のような一般的に使用されるシステム アセンブリであり、検索パス戦略が Known DLLs メカニズムに従っている。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA5393
// The code that's violating the rule is on this line.
#pragma warning restore CA5393
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA5393.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
分析するコードを構成する
次のオプションを使用して、コードベースのどの部分に対してこの規則を実行するか構成します。
このオプションを構成できる対象は、この規則だけ、それを適用できるすべての規則、それを適用できるこのカテゴリ (セキュリティ) のすべての規則です。 詳細については、「コード品質規則の構成オプション」を参照してください。
安全でない DllImportSearchPath ビット
DllImportSearchPath のどの値が分析に対して安全でないかを構成できます。 たとえば、コードで AssemblyDirectory
、UseDllDirectoryForDependencies
、または ApplicationDirectory
を使用しないことを指定するには、次のキーと値のペアをプロジェクト内の .editorconfig ファイルに追加します。
dotnet_code_quality.CA5393.unsafe_DllImportSearchPath_bits = 770
列挙型の値のビットごとの組み合わせの整数値を指定する必要があります。
疑似コードの例
using System;
using System.Runtime.InteropServices;
class ExampleClass
{
[DllImport("The3rdAssembly.dll")]
[DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)]
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);
}
}
関連規則
.NET