Dynamic Link Library
Une Dynamic Link Library (en français, bibliothèque de liens dynamiques[1] - [2] - [3]) est une bibliothèque logicielle dont les fonctions sont chargées en mémoire par un programme, au besoin, lors de son exécution, par opposition aux bibliothèques logicielles statiques ou partagées dont les fonctions sont chargées en mémoire avant le début de l'exécution du programme.
.dll est une extension de nom de fichier[4] utilisée par des fichiers contenant une Dynamic Link Library.
Ces bibliothèques logicielles ont été inventées dans Multics en 1964 et existent dans Windows depuis 1985[5] - [6]. Elles constituent une des fondations des systèmes d'exploitation Windows et sont utilisées pour les interfaces de programmation, les pilotes, les widgets et les polices de caractères.
Fonctionnement
Un programme informatique est construit à partir d'un ensemble de fichiers source contenant des fonctions[6]. Les bibliothèques logicielles sont des lots de fonctions stockées dans des fichiers. Une bibliothèque logicielle contient généralement un ensemble de fonctions autour du même sujet[7]. Par cette technique, une modification subséquente d'une des fonctions de la bibliothèque nécessite de la re-créer, sans qu'il soit nécessaire de re-créer la totalité de l'application[6].
Cette technique nécessite de charger en mémoire les fichiers de bibliothèque en même temps que le programme qui les utilise[8], ensuite de quoi un programme — l'éditeur de liens — rend l'application opérationnelle en tissant des liens entre les différents fichiers[8].
Les bibliothèques logicielles peuvent être :
- Statiques
Une bibliothèque statique est incorporée dans un programme et l'édition de liens est effectuée pendant sa construction. Lorsqu'une bibliothèque statique est modifiée, chaque programme qui l'utilise doit être reconstruit pour incorporer les modifications[7] ;
- Partagées
Une bibliothèque partagée n'est pas incorporée dans les programmes qui l'utilisent, mais est reliée à ces programmes lors de leur chargement, c'est-à-dire immédiatement avant l'exécution du programme. Une bibliothèque partagée peut être utilisée par de nombreux programmes et une modification de la bibliothèque ne nécessite pas de reconstruction des programmes, du moment que l'interface de programmation de la bibliothèque ne change pas[7] ;
- Dynamiques
Les bibliothèques dynamiques sont identiques aux bibliothèques partagées, mais sont utilisées d'une manière différente. De telles bibliothèques sont reliées à l'application lorsque celle-ci en a besoin. Les programmes qui les utilisent comportent les instructions nécessaires au chargement et à la liaison[7].
Dans la technique de la liaison dynamique utilisée par les DLL, l'opération de liaison est exécutée en deux temps : tout d'abord, au moment de la construction de l'application, l'éditeur de liens crée des connecteurs, puis au chargement — immédiatement avant l'exécution de l'application — les connecteurs sont reliés entre eux[8]. Les DLL sont au format COFF, également utilisé dans IBM AIX[9].
Dans Windows
Les DLL sont une des fondations des systèmes d'exploitation Windows. Les fonctions internes de Windows sont mises à disposition des programmes par des interfaces de programmation mises en œuvre par des fichiers DLL[10]. Les trois principales bibliothèques sont User32.dll (manipulation de l'interface utilisateur), GDI32.dll (manipulation des dispositifs d'impression et d'affichage), et Kernel32.dll (utilisation des fonctions du noyau de Windows concernant les fichiers et les processus). D'autres fichiers de Windows souvent utilisés en programmation sont comdlg32.dll, MAPI32.dll, netapi32.dll et winmm.dll[10]. Les fichiers DLL sont également utilisés pour de nombreuses extensions : pilotes, boîtes de dialogue, widgets, polices de caractères[11].
Windows offre la possibilité de détourner ou de subtiliser les fonctions des DLL. Outre des raisons légitimes, ces possibilités sont exploitées par des rootkit, qui injectent des fonctionnalités à l'insu de l'utilisateur en subtilisant les DLL du système d'exploitation[12].
Programmation
Des langages comme C, C++ ou Delphi sont aptes à créer des DLL qui peuvent être exploitées par des programmes. De nombreux outils de développement qui proposent des bibliothèques d'exécution à l'instar des Microsoft Foundation Class Library (MFC) ou de la Visual Component Library (VCL) de Borland proposent soit une liaison statique (intégration directe du code dans l'exécutable) soit une liaison dynamique (la bibliothèque est alors à distribuer sous forme de DLL).
L'utilisation de DLL permet de mettre à disposition du code et de rendre modulaire l'architecture d'une application. La mise à jour de celle-ci peut également se faire en remplaçant uniquement les DLL obsolètes. Néanmoins, l'utilisation de plusieurs versions concurrentes de DLL est problématique sous Windows et conduit à certaines incompatibilités regroupées sous le terme DLL Hell.
DLL hell (l'enfer des DLL)
La construction des DLL permet de facilement les remplacer pour y ajouter des nouvelles fonctions et améliorer les fonctions existantes. Il arrive cependant que le remplacement entraîne des modifications en profondeur des fonctions existantes, ce qui entraîne des pannes et un fonctionnement erroné des programmes qui l'utilisent. De plus, les DLL réalisées avec un compilateur tendent à être incompatibles avec les exécutables réalisés avec un autre compilateur
C'est une cause connue d'appels aux services techniques qui ont baptisé ce phénomène DLL hell, « l'enfer des DLL » en anglais[13].
Lorsqu'un fichier DLL manque sur l'ordinateur de l'utilisateur, le lancement d'un programme qui s'en sert provoquera un message DLL Not found (« DLL non trouvée ») qui n'est d'aucune utilité pour l'utilisateur. Si la DLL existe mais n'est pas valable pour le programme, alors celui-ci n'a aucun moyen de le vérifier, ce qui peut entraîner des messages DynaLink error voire un crash du programme[14]. Une des causes de tels incidents est que Windows n'offre pas de mécanisme interne de contrôle de version — mécanisme qui garantit qu'un programme sera associé avec la bibliothèque pour laquelle il a été construit[9].
Un des moyens qu'ont les programmeurs de lutter contre le DLL hell est de charger explicitement le fichier DLL : au lieu que le fichier soit automatiquement chargé au lancement du programme qui l'utilise, le programme utilise la fonction LoadLibrary
, qui charge le fichier s'il existe[14]. La principale différence entre cette méthode et la méthode classique est que l'exécutable ne connait pas à l'avance les adresses des fonctions dont il aura besoin.
Un autre moyen est de copier tout ou une partie du code source de la DLL dans celui du futur exécutable afin de se passer de la dite DLL. Cela peut, cependant, être illégal (souvent à cause d'une incompatibilité des licences) ou techniquement impossible (généralement parce que le code source de la DLL n'est pas disponible) mais, même quand c'est à la fois possible et légal, cela reste généralement exclu en raison d'usages.
DLL hijacking
À cause d'une vulnérabilité appelée « DLL hijacking », « DLL spoofing », « DLL preloading », « DLL side-loading »[15] ou « binary planting », plusieurs programmes chargent et exécutent des DLL malicieuses qui se trouvent dans les mêmes dossiers que des fichiers ouverts par ces programmes[16] - [17] - [18] - [19]. Les programmes exécutés à partir de dossiers non protégés, tels que « Téléchargements » et « Tmp » qui sont en lecture/écriture, sont plus susceptibles d'être visés[20] - [21] - [22] - [23] - [24] - [25] - [26].
Cette vulnérabilité aurait été découverte en 2000 pour la première fois[27]. En août 2010, après qu'elle soit redécouverte, plusieurs médias de différents pays en discutent. Plusieurs centaines de programmes sont alors jugés vulnérables[28]. En avril 2022, il est révélé que VLC media player aurait fait l'objet d'une telle attaque pendant une quinzaine d'années[15].
Notes et références
- « DLL en Visual C++ », sur msdn, Microsoft (consulté le )
- « Glossaire DLL », sur Symantec (consulté le )
- « Tutoriel de création et d’utilisation d’une bibliothèque dynamique (dll) » [PDF], sur ISIMA (consulté le )
- « Définition DLL et fonctionnement d'un fichier DLL », sur fichier-dll.fr (consulté le )
- (en)InfoWorld, 23 mai 1988 (ISSN 0199-6649).
- (en)I. A. Dhotre - A. A. Puntambekar, Systems Programming, Technical Publications - 2008 (ISBN 9788184313925).
- (en)Sibsankar Haldar - Alex Alagarsamy Aravind, Operating Systems, Pearson Education India - 2010 (ISBN 9788131730225).
- (en)Joseph A. Fisher - Paolo Faraboschi - Clifford Young,Embedded Computing: A Vliw Approach To Architecture, Compilers And Tools, Elsevier - 2005, (ISBN 9781558607668).
- (en) John Calcote, Autotools: A Practitioner's Guide to GNU Autoconf, Automake, and Libtool, No Starch Press, (ISBN 9781593272067).
- Greg Perry, Visual Basic 6, Pearson Education France (ISBN 9782744040825).
- (en)Marco Cantu, Mastering Delphi 6, John Wiley & Sons - 2006 (ISBN 9780782152784).
- (en)Greg. Hoglund - James Butler, Rootkits: Subverting the Windows Kernel, Addison-Wesley Professional - 2006 (ISBN 9780321294319).
- (en) Kate Gregory, Microsoft Visual C++ .Net 2003: Kick Start, Sams Publishing, (ISBN 9780672326004).
- (en)Mark A. Deloura, Game Programming: Gems 2, Cengage Learning - 2001 (ISBN 9781584500544).
- (en) Ionut Ilascu, « Chinese hackers abuse VLC Media Player to launch malware loader », BleepingComputer,
- (en) DLL Spoofing in Windows (lire en ligne [PDF])
- (en) « DLL Preloading Attacks », sur msdn.com (consulté le )
- (en) « More information about the DLL Preloading remote attack vector », sur technet.com (consulté le )
- (en) « An update on the DLL-preloading remote attack vector », sur technet.com (consulté le )
- (en) Will Dormann, « Carpet Bombing and Directory Poisoning », sur SEI Blog, Carnegie Mellon UNiversity,
- (en) « Dev to Mozilla: Please dump ancient Windows install processes », sur theregister.co.uk (consulté le )
- (en) « Gpg4win - Security Advisory Gpg4win 2015-11-25 », sur www.gpg4win.org (consulté le )
- (en) « McAfee KB - McAfee Security Bulletin: Security patch for several McAfee installers and uninstallers (CVE-2015-8991, CVE-2015-8992, and CVE-2015-8993) (TS102462) », sur service.mcafee.com (consulté le )
- (en) « fsc-2015-4 - F-Secure Labs », sur f-secure.com (consulté le )
- (en) « ScanNow DLL Search Order Hijacking Vulnerability and Deprecation », sur rapid7.com, (consulté le )
- (en) VeraCrypt Team, « oss-sec: CVE-2016-1281: TrueCrypt and VeraCrypt Windows installers allow arbitrary code execution with elevation of privilege », sur seclists.org (consulté le )
- (en) « Double clicking on MS Office documents from Windows Explorer may execute arbitrary programs in some cases », sur guninski.com (consulté le )
- (en) « Binary Planting - The Official Web Site of a Forgotten Vulnerability - ACROS Security », sur binaryplanting.com (consulté le )
Voir aussi
Bibliographie
Liens externes
- dllexport, dllimport sur MSDN
- Dynamic-Link Libraries sur MSDN
- What is a DLL? sur le site de Microsoft
- Dynamic-Link Library Functions sur MSDN
- Microsoft Portable Executable and Common Object File Format Specification
- Microsoft specification for dll files