CA5392: DefaultDllImportSearchPaths-Attribut für P/Invokes verwenden.

Eigenschaft Wert
Regel-ID CA5392
Titel DefaultDllImportSearchPaths-Attribut für P/Invokes verwenden.
Kategorie Security
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Nein

Ursache

Der DefaultDllImportSearchPathsAttribute ist für eine Funktion zum Plattformaufruf (P/Invoke) nicht angegeben.

Regelbeschreibung

Standardmäßig testen P/Invoke-Funktionen mit DllImportAttribute eine Reihe von Verzeichnissen, einschließlich des aktuellen Arbeitsverzeichnisses für die zu ladende Bibliothek. Dies kann bei einigen Anwendungen ein Sicherheitsproblem darstellen und zu DLL-Hijacking führen.

Wenn z. b. eine böswillige DLL mit dem gleichen Namen wie die importierte mit dem aktuellen Arbeitsverzeichnis platziert wird, das zuerst standardmäßig durchsucht wird, könnte die schädliche DLL geladen werden.

Weitere Informationen finden Sie unter sicheres Laden der Bibliothek.

Behandeln von Verstößen

Verwenden Sie DefaultDllImportSearchPathsAttribute, um den DLL-Suchpfad für die Assembly oder die Methode explizit anzugeben.

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, diese Regel zu unterdrücken, wenn Folgendes gilt:

  • Sie sind sicher, dass die geladene Assembly die gewünschte ist. Beispielsweise wird Ihre Anwendung auf einem vertrauenswürdigen Server ausgeführt, und Sie vertrauen den Dateien vollständig.
  • Die importierte Assembly ist eine häufig verwendete System-Assembly, wie z. b. user32.dll, und die Suchpfad-Strategie folgt dem bekannten DLLs-Mechanismus.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Pseudocodebeispiele

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

Lösung

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: Keinen unsicheren DllImportSearchPath-Wert verwenden.