CA5392:对 P/Invoke 使用 DefaultDllImportSearchPaths 属性

属性
规则 ID CA5392
标题 对 P/Invoke 使用 DefaultDllImportSearchPaths 属性
类别 安全性
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

没有为平台调用 (P/Invoke) 函数指定 DefaultDllImportSearchPathsAttribute

规则说明

默认情况下,使用 DllImportAttribute 的 P/Invoke 函数会探测大量目录,包括要加载的库的当前工作目录。 这对于某些应用程序来说是一个安全隐患,会导致 DLL 劫持。

例如,如果将与导入的 DLL 同名的恶意 DLL 置于当前工作目录下,由于默认情况下将首先搜索该目录,因此随后就会加载该恶意 DLL。

有关详细信息,请参阅安全加载库

如何解决冲突

使用 DefaultDllImportSearchPathsAttribute 显式指定用于程序集或方法的 DLL 搜索路径。

何时禁止显示警告

在以下情况下,可禁止显示此规则的警告:

  • 确定已加载的程序集是所需的程序集。 例如,你的应用程序在受信任的服务器上运行,并且你完全信任这些文件。
  • 导入的程序集是常用的系统程序集(如 user32.dll),并且搜索路径策略遵循已知的 DLL 机制

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#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 值