Sécurité de la bibliothèque Dynamic-Link

Lorsqu’une application charge dynamiquement une bibliothèque de liens dynamiques sans spécifier de nom de chemin d’accès complet, Windows tente de localiser la DLL en recherchant un ensemble bien défini de répertoires dans un ordre particulier, comme décrit dans Ordre de recherche de bibliothèque de liens dynamiques. Si un attaquant prend le contrôle de l’un des répertoires sur le chemin de recherche de DLL, il peut placer une copie malveillante de la DLL dans ce répertoire. Il s’agit parfois d’une attaque de préchargement de DLL ou d’une attaque de plantation binaire. Si le système ne trouve pas une copie légitime de la DLL avant d’effectuer une recherche dans le répertoire compromis, il charge la DLL malveillante. Si l’application s’exécute avec des privilèges d’administrateur, l’attaquant peut réussir dans l’élévation des privilèges locaux.

Par exemple, supposons qu’une application soit conçue pour charger une DLL à partir du répertoire actuel de l’utilisateur et qu’elle échoue correctement si la DLL est introuvable. L’application appelle LoadLibrary avec uniquement le nom de la DLL, ce qui amène le système à rechercher la DLL. En supposant que le mode de recherche de DLL sécurisé est activé et que l’application n’utilise pas d’autre ordre de recherche, le système recherche les répertoires dans l’ordre suivant :

  1. Répertoire à partir duquel l’application a été chargée.
  2. Répertoire du système.
  3. Répertoire système 16 bits.
  4. Répertoire Windows.
  5. Le répertoire actif.
  6. Répertoires répertoriés dans la variable d’environnement PATH.

Pour poursuivre l’exemple, un attaquant connaissant l’application prend le contrôle du répertoire actif et place une copie malveillante de la DLL dans ce répertoire. Lorsque l’application émet l’appel LoadLibrary , le système recherche la DLL, recherche la copie malveillante de la DLL dans le répertoire actif et la charge. La copie malveillante de la DLL s’exécute ensuite dans l’application et obtient les privilèges de l’utilisateur.

Les développeurs peuvent aider à protéger leurs applications contre les attaques de préchargement de DLL en suivant ces instructions :

  • Dans la mesure du possible, spécifiez un chemin d’accès complet lors de l’utilisation des fonctions LoadLibrary, LoadLibraryEx, CreateProcess ou ShellExecute .

  • Utilisez les indicateurs LOAD_LIBRARY_SEARCH avec la fonction LoadLibraryEx , ou utilisez ces indicateurs avec la fonction SetDefaultDllDirectories pour établir un ordre de recherche de DLL pour un processus, puis utilisez les fonctions AddDllDirectory ou SetDllDirectory pour modifier la liste. Pour plus d’informations, consultez Ordre de recherche de bibliothèque de liens dynamiques.

    Windows 7, Windows Server 2008 R2, Windows Vista et Windows Server 2008 : Ces indicateurs et fonctions sont disponibles sur les systèmes où KB2533623 est installé.

  • Sur les systèmes sur utilisant KB2533623 , utilisez les indicateurs LOAD_LIBRARY_SEARCH avec la fonction LoadLibraryEx , ou utilisez ces indicateurs avec la fonction SetDefaultDllDirectories pour établir un ordre de recherche de DLL pour un processus, puis utilisez les fonctions AddDllDirectory ou SetDllDirectory pour modifier la liste. Pour plus d’informations, consultez Ordre de recherche de bibliothèque de liens dynamiques.

  • Envisagez d’utiliser la redirection de DLL ou un manifeste pour vous assurer que votre application utilise la DLL appropriée.

  • Lorsque vous utilisez l’ordre de recherche standard, assurez-vous que le mode de recherche de DLL sans échec est activé. Cela place le répertoire actuel de l’utilisateur plus tard dans l’ordre de recherche, ce qui augmente les chances que Windows trouve une copie légitime de la DLL avant une copie malveillante. Le mode de recherche de DLL sans échec est activé par défaut à partir de Windows XP avec Service Pack 2 (SP2) et est contrôlé par la valeur de RegistreHKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode . Pour plus d’informations, consultez Ordre de recherche de bibliothèque de liens dynamiques.

  • Envisagez de supprimer le répertoire actif du chemin de recherche standard en appelant SetDllDirectory avec une chaîne vide («  »). Cette opération doit être effectuée une fois au début de l’initialisation du processus, pas avant et après les appels à LoadLibrary. N’oubliez pas que SetDllDirectory affecte l’ensemble du processus et que plusieurs threads appelant SetDllDirectory avec des valeurs différentes peuvent entraîner un comportement non défini. Si votre application charge des DLL tierces, testez soigneusement pour identifier les incompatibilités.

  • N’utilisez pas la fonction SearchPath pour récupérer un chemin d’accès à une DLL pour un appel LoadLibrary suivant, sauf si le mode de recherche de processus sécurisé est activé. Lorsque le mode de recherche de processus sécurisé n’est pas activé, la fonction SearchPath utilise un ordre de recherche différent de celui de LoadLibrary et est susceptible de rechercher d’abord la DLL spécifiée dans le répertoire actif de l’utilisateur. Pour activer le mode de recherche de processus sécurisé pour la fonction SearchPath , utilisez la fonction SetSearchPathMode avec BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE. Cela déplace le répertoire actif à la fin de la liste de recherche SearchPath pour la durée de vie du processus. Notez que le répertoire actif n’est pas supprimé du chemin de recherche. Par conséquent, si le système ne trouve pas de copie légitime de la DLL avant qu’elle n’atteigne le répertoire actif, l’application est toujours vulnérable. Comme avec SetDllDirectory, l’appel de SetSearchPathMode doit être effectué au début de l’initialisation du processus et affecte l’ensemble du processus. Si votre application charge des DLL tierces, testez soigneusement pour identifier les incompatibilités.

  • N’effectuez pas d’hypothèses sur la version du système d’exploitation basée sur un appel LoadLibrary qui recherche une DLL. Si l’application s’exécute dans un environnement où la DLL n’est légitimement pas présente, mais qu’une copie malveillante de la DLL se trouve dans le chemin de recherche, la copie malveillante de la DLL peut être chargée. Utilisez plutôt les techniques recommandées décrites dans Obtention de la version du système.

L’outil Moniteur de processus peut être utilisé pour identifier les opérations de chargement de DLL qui peuvent être vulnérables. L’outil Process Monitor peut être téléchargé à partir de https://technet.microsoft.com/sysinternals/bb896645.aspx.

La procédure suivante décrit comment utiliser Process Monitor pour examiner les opérations de chargement de DLL dans votre application.

Pour utiliser Process Monitor pour examiner les opérations de chargement de DLL dans votre application

  1. Démarrez Process Monitor.
  2. Dans Process Monitor, incluez les filtres suivants :
    • L’opération est CreateFile
    • L’opération est LoadImage
    • Path contient .cpl
    • Path contient .dll
    • Path contient .drv
    • Path contient .exe
    • Path contient .ocx
    • Path contient .scr
    • Path contient .sys
  3. Excluez les filtres suivants :
    • Le nom du processus est procmon.exe
    • Le nom du processus est Procmon64.exe
    • Le nom du processus est Système
    • L’opération commence par IRP_MJ_
    • L’opération commence par FASTIO_
    • Le résultat est SUCCESS
    • Le chemin se termine par pagefile.sys
  4. Essayez de démarrer votre application avec le répertoire actif défini sur un répertoire spécifique. Par exemple, double-cliquez sur un fichier avec une extension dont le gestionnaire de fichiers est affecté à votre application.
  5. Vérifiez la sortie du moniteur de processus pour les chemins d’accès qui semblent suspects, tels qu’un appel au répertoire actif pour charger une DLL. Ce type d’appel peut indiquer une vulnérabilité dans votre application.