beveiliging van Dynamic-Link-bibliotheek
Wanneer een toepassing dynamisch een bibliotheek met dynamische koppelingen laadt zonder een volledig gekwalificeerde padnaam op te geven, probeert Windows het DLL-bestand te vinden door een goed gedefinieerde set mappen in een bepaalde volgorde te doorzoeken, zoals beschreven in Dynamic-Link Bibliotheekzoekvolgorde. Als een aanvaller controle krijgt over een van de mappen in het DLL-zoekpad, kan het een kwaadwillende kopie van het DLL-bestand in die map plaatsen. Dit wordt ook wel een DLL-preloading-aanval of een binaire aanplantaanvalgenoemd. Als het systeem geen legitieme kopie van het DLL-bestand vindt voordat er wordt gezocht in de gecompromitteerde map, wordt de schadelijke DLL geladen. Als de toepassing wordt uitgevoerd met beheerdersbevoegdheden, kan de aanvaller slagen in uitbreiding van lokale bevoegdheden.
Stel dat een toepassing is ontworpen om een DLL uit de huidige map van de gebruiker te laden en probleemloos te mislukken als het DLL-bestand niet wordt gevonden. De toepassing roept LoadLibrary- aan met alleen de naam van het DLL-bestand, waardoor het systeem naar het DLL-bestand zoekt. Ervan uitgaande dat de veilige DLL-zoekmodus is ingeschakeld en de toepassing geen alternatieve zoekvolgorde gebruikt, zoekt het systeem mappen in de volgende volgorde:
- De map waaruit de toepassing is geladen.
- De systeemmap.
- De 16-bits systeemmap.
- De Windows-map.
- De huidige map.
- De mappen die worden vermeld in de omgevingsvariabele PATH.
Als u doorgaat met het voorbeeld, krijgt een aanvaller met kennis van de toepassing de controle over de huidige map en wordt er een kwaadwillende kopie van het DLL-bestand in die map opgeslagen. Wanneer de toepassing de LoadLibrary aanroep uitgeeft, zoekt het systeem naar de DLL, zoekt het schadelijke exemplaar van het DLL-bestand in de huidige map en laadt het. De schadelijke kopie van het DLL-bestand wordt vervolgens uitgevoerd in de toepassing en krijgt de bevoegdheden van de gebruiker.
Ontwikkelaars kunnen hun toepassingen beschermen tegen DLL-preloadingaanvallen door de volgende richtlijnen te volgen:
Geef waar mogelijk een volledig gekwalificeerd pad op bij het gebruik van de LoadLibrary-, LoadLibraryEx, CreateProcessof ShellExecute-functies.
Gebruik de LOAD_LIBRARY_SEARCH vlaggen met de functie LoadLibraryEx of gebruik deze vlaggen met de functie SetDefaultDllDirectories om een DLL-zoekvolgorde voor een proces tot stand te brengen en gebruik vervolgens de AddDllDirectory of SetDllDirectory functies om de lijst te wijzigen. Zie Dynamic-Link Bibliotheekzoekvolgordevoor meer informatie.
Windows 7, Windows Server 2008 R2, Windows Vista en Windows Server 2008: Deze vlaggen en functies zijn beschikbaar op systemen waarop KB2533623 geïnstalleerd.
Gebruik op systemen waarop KB2533623 geïnstalleerd, de LOAD_LIBRARY_SEARCH vlaggen met de functie LoadLibraryEx of gebruik deze vlaggen met de SetDefaultDllDirectories functie om een DLL-zoekvolgorde voor een proces tot stand te brengen en gebruik vervolgens de AddDllDirectory of SetDllDirectory functies om de lijst te wijzigen. Zie Dynamic-Link Bibliotheekzoekvolgordevoor meer informatie.
Overweeg het gebruik van DLL-omleiding of een manifest om ervoor te zorgen dat uw toepassing gebruikmaakt van de juiste DLL.
Wanneer u de standaardzoekvolgorde gebruikt, moet u ervoor zorgen dat de veilige DLL-zoekmodus is ingeschakeld. Hierdoor wordt de huidige map van de gebruiker later in de zoekvolgorde geplaatst, waardoor de kans wordt vergroot dat Windows een legitieme kopie van het DLL-bestand vindt voordat een kwaadwillende kopie wordt gekopieerd. De veilige DLL-zoekmodus is standaard ingeschakeld vanaf Windows XP met Service Pack 2 (SP2) en wordt beheerd door de HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode registerwaarde. Zie Dynamic-Link Bibliotheekzoekvolgordevoor meer informatie.
U kunt de huidige map verwijderen uit het standaardzoekpad door SetDllDirectory- aan te roepen met een lege tekenreeks (""). Dit moet eenmaal vroeg in proces initialisatie worden gedaan, niet vóór en na aanroepen naar LoadLibrary-. Houd er rekening mee dat SetDllDirectory- van invloed is op het hele proces en dat meerdere threads die SetDllDirectory- met verschillende waarden aanroepen, niet-gedefinieerd gedrag kunnen veroorzaken. Als uw toepassing DLL's van derden laadt, test u zorgvuldig om eventuele incompatibiliteit te identificeren.
Gebruik de functie SearchPath niet om een pad naar een DLL op te halen voor een volgende LoadLibrary aanroep, tenzij de veilige proceszoekmodus is ingeschakeld. Wanneer de zoekmodus voor veilig proces niet is ingeschakeld, gebruikt de functie SearchPath een andere zoekvolgorde dan LoadLibrary- en zoekt de huidige map van de gebruiker waarschijnlijk eerst naar de opgegeven DLL. Gebruik de functie SetSearchPathMode met BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE om de zoekmodus voor veilig proces in te schakelen voor de functie SearchPath. Hiermee wordt de huidige map verplaatst naar het einde van het SearchPath zoeklijst voor de levensduur van het proces. Houd er rekening mee dat de huidige map niet wordt verwijderd uit het zoekpad, dus als het systeem geen legitieme kopie van de DLL vindt voordat deze de huidige map bereikt, is de toepassing nog steeds kwetsbaar. Net als bij SetDllDirectory-moet het aanroepen van SetSearchPathMode vroeg in proces initialisatie worden uitgevoerd en dit van invloed is op het hele proces. Als uw toepassing DLL's van derden laadt, test u zorgvuldig om eventuele incompatibiliteit te identificeren.
Maak geen veronderstellingen over de versie van het besturingssysteem op basis van een LoadLibrary aanroep die zoekt naar een DLL. Als de toepassing wordt uitgevoerd in een omgeving waarin het DLL-bestand legitiem niet aanwezig is, maar een schadelijke kopie van het DLL-bestand zich in het zoekpad bevindt, kan de schadelijke kopie van het DLL-bestand worden geladen. Gebruik in plaats daarvan de aanbevolen technieken die worden beschreven in Het verkrijgen van de systeemversie.
Het hulpprogramma Procescontrole kan worden gebruikt om DLL-belastingbewerkingen te identificeren die mogelijk kwetsbaar zijn. Het hulpprogramma Procescontrole kan worden gedownload van https://technet.microsoft.com/sysinternals/bb896645.aspx.
In de volgende procedure wordt beschreven hoe u Process Monitor gebruikt om DLL-belastingsbewerkingen in uw toepassing te onderzoeken.
Om procesmonitor te gebruiken om DLL-belastingsbewerkingen in uw toepassing te onderzoeken
- Procescontrole starten.
- Neem in Procesmonitor de volgende filters op:
- Bewerking is CreateFile
- Bewerking is LoadImage
- Pad bevat .cpl
- Pad bevat .dll
- Pad bevat .drv
- Pad bevat .exe
- Pad bevat .ocx
- Pad bevat .scr
- Pad bevat .sys
- Sluit de volgende filters uit:
- Procesnaam is procmon.exe
- Procesnaam is Procmon64.exe
- Procesnaam is systeem
- De bewerking begint met IRP_MJ_
- De bewerking begint met FASTIO_
- Resultaat is GESLAAGD
- Het pad eindigt met pagefile.sys
- Probeer uw toepassing te starten met de huidige map die is ingesteld op een specifieke map. Dubbelklik bijvoorbeeld op een bestand met een extensie waarvan de bestandshandler is toegewezen aan uw toepassing.
- Controleer de uitvoer van procesmonitor op paden die verdacht lijken, zoals een aanroep naar de huidige map om een DLL te laden. Dit type aanroep kan duiden op een beveiligingsprobleem in uw toepassing.