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ée par défaut dans .NET 9 | 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);
}
}
Règles associées
CA5393 : Ne pas utiliser de valeur DllImportSearchPath non sécurisée