CA5392 : Utiliser l’attribut DefaultDllImportSearchPaths pour les P/Invokes

Propriété Value
Identificateur de la règle CA5392
Titre Utiliser l’attribut DefaultDllImportSearchPaths pour les P/Invokes
Catégorie Sécurité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

DefaultDllImportSearchPathsAttribute n’est pas spécifié pour une fonction de type appel de code non managé (PInvoke).

Description de la règle

Par défaut, les fonctions P/Invoke à l’aide de DllImportAttribute sondent un certain nombre de répertoires, y compris le répertoire de travail actuel que la bibliothèque doit charger. Il peut s’agir d’un problème de sécurité pour certaines applications, entraînant un détournement de DLL.

Par exemple, si une DLL malveillante portant le même nom que celle importée est placée sous le répertoire de travail actif (qui par défaut sera parcouru en premier), la DLL malveillante risque d’être chargée.

Pour plus d’informations, consultez Chargement de la bibliothèque en toute sécurité.

Comment corriger les violations

Utilisez DefaultDllImportSearchPathsAttribute afin de spécifier explicitement le chemin de recherche de la DLL pour l’assembly ou la méthode.

Quand supprimer les avertissements

Vous pouvez sans risque supprimer cette règle dans les situations suivantes :

  • Vous avez la certitude que l’assembly chargé correspond à ce que vous voulez. Par exemple, votre application s’exécute sur un serveur approuvé, et vous faites entièrement confiance aux fichiers.
  • L’assembly importé est un assembly système couramment utilisé (par exemple user32.dll), et la stratégie de chemin de recherche suit le mécanisme des DLL connues.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Exemples de pseudo-code

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

Solution

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 : Ne pas utiliser de valeur DllImportSearchPath non sécurisée