Sdílet prostřednictvím


Zabezpečení knihovny Dynamic-Link

Když aplikace dynamicky načte dynamickou knihovnu bez zadání plně kvalifikovaného názvu cesty, Windows se pokusí vyhledat knihovnu DLL vyhledáváním dobře definované sady adresářů v určitém pořadí, jak je popsáno v Dynamic-Link pořadí hledání knihovny. Pokud útočník získá kontrolu nad jednou z adresářů v cestě hledání knihovny DLL, může do tohoto adresáře umístit škodlivou kopii knihovny DLL. To se někdy označuje jako dll před načtením útoku nebo binárního útoku. Pokud systém před hledáním ohroženého adresáře nenajde legitimní kopii knihovny DLL, načte škodlivou knihovnu DLL. Pokud je aplikace spuštěná s oprávněními správce, může útočník úspěšně zvýšit oprávnění místního oprávnění.

Předpokládejme například, že aplikace je navržená tak, aby načetla knihovnu DLL z aktuálního adresáře uživatele a řádně selhala, pokud knihovna DLL nebyla nalezena. Aplikace volá LoadLibrary pouze s názvem knihovny DLL, což způsobí, že systém vyhledá knihovnu DLL. Za předpokladu, že je povolený bezpečný režim vyhledávání dll a aplikace nepoužívá alternativní pořadí vyhledávání, systém prohledává adresáře v následujícím pořadí:

  1. Adresář, ze kterého se aplikace načetla.
  2. Systémový adresář.
  3. 16bitový systémový adresář.
  4. Adresář Systému Windows.
  5. Aktuální adresář.
  6. Adresáře, které jsou uvedeny v proměnné prostředí PATH.

Když budeme pokračovat v příkladu, útočník se znalostmi aplikace získá kontrolu nad aktuálním adresářem a umístí do tohoto adresáře škodlivou kopii knihovny DLL. Když aplikace vydá LoadLibrary volání, systém vyhledá knihovnu DLL, vyhledá škodlivou kopii knihovny DLL v aktuálním adresáři a načte ji. Škodlivá kopie knihovny DLL se pak spustí v aplikaci a získá oprávnění uživatele.

Vývojáři můžou pomoct chránit své aplikace před načtením knihoven DLL podle těchto pokynů:

  • Kdykoli je to možné, zadejte plně kvalifikovanou cestu při použití LoadLibrary, LoadLibraryEx, CreateProcessnebo ShellExecute funkcí.

  • Použijte příznaky LOAD_LIBRARY_SEARCH s funkcí LoadLibraryEx nebo použijte tyto příznaky s funkcí SetDefaultDllDirectories k vytvoření pořadí hledání knihovny DLL pro proces a následné použití AddDllDirectory nebo Funkce SetDllDirectory upravit seznam. Další informace naleznete v tématu Dynamic-Link Pořadí hledání knihovny.

    Windows 7, Windows Server 2008 R2, Windows Vista a Windows Server 2008: Tyto příznaky a funkce jsou k dispozici v systémech s nainstalovanými KB2533623.

  • V systémech s nainstalovanými KB2533623 použijte LOAD_LIBRARY_SEARCH příznaky s funkcí LoadLibraryEx nebo použijte tyto příznaky s funkcí SetDefaultDllDirectories k vytvoření pořadí hledání knihovny DLL pro proces a potom použijte AddDllDirectory nebo SetDllDirectory funkce k úpravě seznamu. Další informace naleznete v tématu Dynamic-Link Pořadí hledání knihovny.

  • Zvažte použití přesměrování knihovny DLL nebo manifestu k zajištění, že vaše aplikace používá správnou knihovnu DLL.

  • Při použití standardního pořadí vyhledávání se ujistěte, že je povolený bezpečný režim vyhledávání dll. Tím se aktuální adresář uživatele umístí později do pořadí hledání, což zvyšuje pravděpodobnost, že Systém Windows najde legitimní kopii knihovny DLL před škodlivou kopií. Režim bezpečného vyhledávání dll je ve výchozím nastavení povolen od systému Windows XP s aktualizací Service Pack 2 (SP2) a je řízen HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode hodnotu registru. Další informace naleznete v tématu Dynamic-Link Pořadí hledání knihovny.

  • Zvažte odebrání aktuálního adresáře ze standardní cesty hledání voláním SetDllDirectory s prázdným řetězcem (""). To by mělo být provedeno jednou dříve v inicializaci procesu, ne před a po volání LoadLibrary. Mějte na paměti, že SetDllDirectory ovlivňuje celý proces a že více vláken volajících SetDllDirectory s různými hodnotami může způsobit nedefinované chování. Pokud vaše aplikace načítá knihovny DLL třetích stran, pečlivě otestujte případné nekompatibility.

  • Nepoužívejte funkci SearchPath k načtení cesty k knihovně DLL pro následné LoadLibrary volání, pokud není povolený režim bezpečného vyhledávání procesů. Pokud není povolený režim bezpečného vyhledávání procesů, funkce SearchPath používá jiné pořadí vyhledávání než LoadLibrary a pravděpodobně nejprve prohledá aktuální adresář uživatele pro zadanou knihovnu DLL. Chcete-li povolit režim bezpečného vyhledávání procesů pro funkci SearchPath, použijte funkci SetSearchPathMode s BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE. Tím se aktuální adresář přesune na konec SearchPathu seznam hledání pro dobu životnosti procesu. Všimněte si, že aktuální adresář není odebrán z cesty hledání, takže pokud systém nenajde legitimní kopii knihovny DLL před dosažením aktuálního adresáře, aplikace je stále zranitelná. Stejně jako u SetDllDirectory, volání SetSearchPathMode by mělo být provedeno v rané fázi inicializace procesu a má vliv na celý proces. Pokud vaše aplikace načítá knihovny DLL třetích stran, pečlivě otestujte případné nekompatibility.

  • Nepředpokládávejte předpoklady o verzi operačního systému na základě LoadLibrary volání, které hledá knihovnu DLL. Pokud aplikace běží v prostředí, kde knihovna DLL není legitimní, ale škodlivá kopie knihovny DLL je ve vyhledávací cestě, může být načtena škodlivá kopie knihovny DLL. Místo toho použijte doporučené techniky popsané v Získání systémové verze.

Nástroj Sledování procesů lze použít k identifikaci operací načítání knihoven DLL, které mohou být ohroženy. Nástroj Sledování procesů lze stáhnout z https://technet.microsoft.com/sysinternals/bb896645.aspx.

Následující postup popisuje, jak pomocí sledování procesů zkoumat operace načítání knihovny DLL ve vaší aplikaci.

Použití nástroje Process Monitor ke kontrole operací načítání knihoven DLL v aplikaci

  1. Spusťte monitorování procesů.
  2. V nástroji Process Monitor zahrňte následující filtry:
    • Operace je CreateFile.
    • Operace je LoadImage
    • Cesta obsahuje .cpl
    • Cesta obsahuje .dll
    • Cesta obsahuje .drv
    • Cesta obsahuje .exe
    • Cesta obsahuje soubor .ocx.
    • Cesta obsahuje .scr
    • Cesta obsahuje .sys
  3. Vylučte následující filtry:
    • Název procesu je procmon.exe
    • Název procesu je Procmon64.exe
    • Název procesu je systém
    • Operace začíná IRP_MJ_
    • Operace začíná FASTIO_
    • Výsledek je ÚSPĚCH.
    • Cesta končí pagefile.sys
  4. Pokuste se spustit aplikaci s aktuálním adresářem nastaveným na konkrétní adresář. Poklikejte například na soubor s příponou, jejíž obslužná rutina souboru je přiřazena vaší aplikaci.
  5. Zkontrolujte výstup sledování procesů pro cesty, které vypadají podezřele, například volání aktuálního adresáře pro načtení knihovny DLL. Tento typ volání může znamenat ohrožení zabezpečení ve vaší aplikaci.