Dela via


Dynamic-Link Bibliotekssäkerhet

När ett program dynamiskt läser in ett dynamiskt länkbibliotek utan att ange ett fullständigt kvalificerat sökvägsnamn försöker Windows hitta DLL:n genom att söka i en väldefinierad uppsättning kataloger i en viss ordning, enligt beskrivningen i Dynamic-Link Bibliotekssökningsordning. Om en angripare får kontroll över en av katalogerna på sökvägen för DLL kan den placera en skadlig kopia av DLL:n i katalogen. Detta kallas ibland för en DLL-förinläsningsattack eller en binär planteringsattack. Om systemet inte hittar en legitim kopia av DLL:en innan den söker i den komprometterade katalogen läses den skadliga DLL:en in. Om programmet körs med administratörsbehörighet kan angriparen lyckas med lokal behörighetshöjning.

Anta till exempel att ett program är utformat för att läsa in en DLL från användarens aktuella katalog och misslyckas korrekt om DLL-filen inte hittas. Programmet anropar LoadLibrary med bara namnet på DLL:en, vilket gör att systemet söker efter DLL:en. Förutsatt att säkert DLL-sökläge är aktiverat och programmet inte använder en alternativ sökordning söker systemet igenom kataloger i följande ordning:

  1. Katalogen som programmet lästes in från.
  2. Systemkatalogen.
  3. 16-bitars systemkatalogen.
  4. Windows-katalogen.
  5. Den aktuella katalogen.
  6. De kataloger som visas i PATH-miljövariabeln.

Om du fortsätter med exemplet får en angripare med kunskap om programmet kontroll över den aktuella katalogen och placerar en skadlig kopia av DLL:en i den katalogen. När programmet utfärdar LoadLibrary- anrop söker systemet efter DLL:en, hittar den skadliga kopian av DLL:en i den aktuella katalogen och läser in den. Den skadliga kopian av DLL:en körs sedan i programmet och får användarens behörighet.

Utvecklare kan hjälpa till att skydda sina program mot DLL-förinläsningsattacker genom att följa dessa riktlinjer:

  • Ange där det är möjligt en fullständigt kvalificerad sökväg när du använder funktionerna LoadLibrary, LoadLibraryEx, CreateProcesseller ShellExecute.

  • Använd LOAD_LIBRARY_SEARCH-flaggorna med funktionen LoadLibraryEx eller använd dessa flaggor med funktionen SetDefaultDllDirectories för att upprätta en DLL-sökordning för en process och sedan använda funktionen AddDllDirectory eller SetDllDirectory för att ändra listan. Mer information finns i Dynamic-Link sökordning för bibliotek.

    Windows 7, Windows Server 2008 R2, Windows Vista och Windows Server 2008: Dessa flaggor och funktioner är tillgängliga på system med KB2533623 installerade.

  • På system med KB2533623 installerade använder du LOAD_LIBRARY_SEARCH-flaggorna med funktionen LoadLibraryEx eller använder dessa flaggor med funktionen SetDefaultDllDirectories för att upprätta en DLL-sökordning för en process och sedan använda funktionen AddDllDirectory eller SetDllDirectory för att ändra listan. Mer information finns i Dynamic-Link sökordning för bibliotek.

  • Överväg att använda DLL-omdirigering eller ett manifest för att säkerställa att programmet använder rätt DLL.

  • När du använder standardsökordningen kontrollerar du att säkert DLL-sökläge är aktiverat. Detta placerar användarens aktuella katalog senare i sökordningen, vilket ökar risken för att Windows hittar en legitim kopia av DLL:en före en skadlig kopia. Säkert DLL-sökläge är aktiverat som standard från och med Windows XP med Service Pack 2 (SP2) och styrs av HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode registervärde. Mer information finns i Dynamic-Link sökordning för bibliotek.

  • Överväg att ta bort den aktuella katalogen från standardsökvägen genom att anropa SetDllDirectory med en tom sträng (""). Detta bör göras en gång tidigt i processen, inte före och efter anrop till LoadLibrary. Tänk på att SetDllDirectory påverkar hela processen och att flera trådar som anropar SetDllDirectory med olika värden kan orsaka odefinierat beteende. Om ditt program läser in DLL:er från tredje part testar du noggrant för att identifiera eventuella inkompatibiliteter.

  • Använd inte funktionen SearchPath för att hämta en sökväg till en DLL för ett efterföljande LoadLibrary--anrop om inte felsäkert processsökningsläge är aktiverat. När läget för säker processsökning inte är aktiverat använder funktionen SearchPath en annan sökordning än LoadLibrary- och söker troligen först i användarens aktuella katalog efter den angivna DLL:en. Om du vill aktivera sökläge för säker process för funktionen SearchPath använder du funktionen SetSearchPathMode med BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE. Detta flyttar den aktuella katalogen till slutet av SearchPath söklista för hela processen. Observera att den aktuella katalogen inte tas bort från sökvägen, så om systemet inte hittar en legitim kopia av DLL:en innan den når den aktuella katalogen är programmet fortfarande sårbart. Precis som med SetDllDirectorybör anrop av SetSearchPathMode göras tidigt i processens initiering och det påverkar hela processen. Om ditt program läser in DLL:er från tredje part testar du noggrant för att identifiera eventuella inkompatibiliteter.

  • Gör inte antaganden om operativsystemversionen baserat på ett LoadLibrary--anrop som söker efter en DLL. Om programmet körs i en miljö där DLL:en inte finns, men en skadlig kopia av DLL:en finns i sökvägen, kan den skadliga kopian av DLL läsas in. Använd i stället de rekommenderade teknikerna som beskrivs i Hämta systemversionen.

Verktyget Processövervakare kan användas för att identifiera DLL-inläsningsåtgärder som kan vara sårbara. Verktyget Processövervakare kan laddas ned från https://technet.microsoft.com/sysinternals/bb896645.aspx.

Följande procedur beskriver hur du använder Process Monitor för att undersöka DLL-inläsningsåtgärder i ditt program.

Om du vill använda processövervakaren för att undersöka DLL-inläsningsåtgärder i ditt program

  1. Starta processövervakaren.
  2. I Processövervakaren innehåller du följande filter:
    • Åtgärden är CreateFile
    • Åtgärden är LoadImage
    • Sökvägen innehåller .cpl
    • Sökvägen innehåller .dll
    • Sökvägen innehåller .drv
    • Sökvägen innehåller .exe
    • Sökvägen innehåller .ocx
    • Sökvägen innehåller .scr
    • Sökvägen innehåller .sys
  3. Undanta följande filter:
    • Processnamn är procmon.exe
    • Processnamn är Procmon64.exe
    • Processnamn är system
    • Åtgärden börjar med IRP_MJ_
    • Åtgärden börjar med FASTIO_
    • Resultatet är LYCKAT
    • Sökvägen slutar med pagefile.sys
  4. Försök att starta programmet med den aktuella katalogen inställd på en specifik katalog. Dubbelklicka till exempel på en fil med ett tillägg vars filhanterare har tilldelats till ditt program.
  5. Kontrollera processövervakarens utdata för sökvägar som ser misstänkta ut, till exempel ett anrop till den aktuella katalogen för att läsa in en DLL. Den här typen av anrop kan tyda på en säkerhetsrisk i ditt program.