次の方法で共有


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);
    }
}

CA5393: 安全でない DllImportSearchPath 値を使用しないでください