Compartilhar via


CA5392: Usar o atributo DefaultDllImportSearchPaths para P/Invokes

Property Valor
ID da regra CA5392
Título Usar o atributo DefaultDllImportSearchPaths para P/Invokes
Categoria Segurança
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Não

Causa

A função DefaultDllImportSearchPathsAttribute não é especificada para uma função de invocação de plataforma (P/Invoke).

Descrição da regra

Por padrão, as funções P/Invoke que usam DllImportAttribute investigam vários diretórios, incluindo o diretório de trabalho atual da biblioteca a ser carregada. Isso pode ser um problema de segurança para determinados aplicativos, levando ao sequestro de DLL.

Por exemplo, se uma DLL mal-intencionada com o mesmo nome que a importada for colocada no diretório de trabalho atual, que será pesquisado primeiro por padrão, a DLL mal-intencionada poderá ser carregada.

Para obter mais informações, consulte Carregar biblioteca com segurança.

Como corrigir violações

Use DefaultDllImportSearchPathsAttribute para especificar o caminho de pesquisa de DLL explicitamente para o assembly ou o método.

Quando suprimir avisos

É seguro suprimir esta regra se:

  • Você tem certeza de que o assembly carregado é o que você deseja. Por exemplo, seu aplicativo é executado em um servidor confiável e você confia completamente nos arquivos.
  • O assembly importado é um assembly de sistema comumente usado, como user32.dll, e a estratégia de caminho de pesquisa segue o mecanismo de DLLs conhecidas.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

#pragma warning disable CA5392
// The code that's violating the rule is on this line.
#pragma warning restore CA5392

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA5392.severity = none

Para obter mais informações, confira Como suprimir avisos de análise de código.

Exemplos de pseudocódigo

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

Solução

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: Não usar o valor DllImportSearchPath não seguro