Přihlásit se pomocí účtu Microsoft
Přihlaste se nebo si vytvořte účet.
Dobrý den,
Vyberte jiný účet.
Máte více účtů.
Zvolte účet, pomocí kterého se chcete přihlásit.

Podpora pro systém Windows Vista Service Pack 1 (SP1) končí 12. července 2011. Pokud chcete dál dostávat aktualizace zabezpečení pro Windows, ujistěte se, že používáte Windows Vista s Service Pack 2 (SP2). Další informace najdete na této webové stránce Microsoftu: Ukončení podpory některých verzí Windows.

Když aplikace dynamicky načte dynamickou knihovnu (DLL) bez zadání plně kvalifikované cesty, systém Windows se pokusí najít knihovnu DLL prohledáváním dobře definované sady adresářů. Pokud by záložník získal kontrolu nad jedním z adresářů, může vynutit načtení škodlivé kopie knihovny DLL místo knihovny DLL, kterou očekávala. Tyto útoky se označuje jako útoky před zavedením knihovny DLL a jsou běžné pro všechny operační systémy, které podporují dynamické načítání sdílených knihoven DLL. Takové útoky mohou mít následující vliv na to, že by zatočí za uživatele, který aplikaci spouští, mohl spustit kód. Když aplikaci spustíte jako správce, může to vést k místnímu převýšení oprávnění. Víme o obnovených zájmech o těchto útocích. Pokud chcete omezit dopad tohoto problému na naše vzájemné zákazníky, tento dokument vydáváme vývojářské komunitě, aby se ujistili, že o tomto problému ví a měli nástroje potřebné k řešení problému ve svých aplikacích.

Shrnutí

Popis útoků dll s předběžnou načtením

Útoky založené na LoadLibrary

Při dynamickém načtení knihovny DLL bez zadání plně kvalifikované cesty se systém Windows pokusí najít tuto knihovnu DLL lineárním hledáním pomocí dobře definované sady adresářů známé jako Pořadí vyhledávání knihovny DLL. Pokud systém Windows najde knihovnu DLL v rámci pořadí vyhledávání knihovny DLL, načte se tato knihovna DLL. Pokud však systém Windows nenajde knihovnu DLL v žádném z adresářů v pořadí vyhledávání knihovny DLL, vrátí operaci načtení knihovny DLL s chybou. Toto je pořadí hledání knihovny DLL pro funkce LoadLibrarya LoadLibraryEx,které se používají k dynamickému načtení knihoven DLL:

  1. Adresář, ze kterého se aplikace načetl

  2. Systémový adresář

  3. 16bitový adresář systému

  4. Adresář Windows

  5. Aktuální pracovní adresář (CWD)

  6. The directories that are listed in the PATH environment variable



Vezměte v úvahu následující scénář:


  • Aplikace načte knihovnu DLL bez zadání plně kvalifikované cesty, kterou očekává v CWD aplikace.

  • Aplikace je plně připravená na zpracování případu, kdy knihovnu DLL nenajde.

  • Ten pak o aplikaci ví a řídí CWD.

  • Záložník si kopíruje vlastní speciálně vytvořenou verzi knihovny DLL v jazyce CWD. Předpokládá se, že to může udělat správce.

  • Windows prohledá adresáře v pořadí vyhledávání dll a najde knihovnu DLL v jazyce CWD aplikace.

V tomto scénáři běží speciálně vytvořená knihovna DLL v aplikaci a získá oprávnění aktuálního uživatele.

Doporučujeme zabránit tomuto útoku. Aplikace mohou z cesty hledání v knihovně DLL odebrat aktuální pracovní adresář (CWD) voláním rozhraní
API služby SetDllDirectory s prázdným řetězcem
(""). Pokud aplikace závisí na načtení knihovny DLL z aktuálního adresáře, získejte aktuální pracovní adresář a použijte ho k předání plně kvalifikované cesty LoadLibrary.



Víme také, že někteří vývojáři používají Funkci LoadLibrary k ověření přítomnosti konkrétní knihovny DLL, aby bylo možné určit, kterou verzi Windows uživatel používá. Měli byste vědět, že to může aplikaci přimět k ohrožení zabezpečení. Pokud knihovna skutečně ve Verzi pro Windows, na které se aplikace spustí, neexistuje, může správce knihovny se stejným jménem zavést do CWD knihovnu se stejným názvem. Důrazně doporučujeme, abyste tuto techniku nedoporučujeme používat. Místo toho použijte doporučené postupy popsané v článku msdn "Získání verze systému".

Aplikace, která načítá moduly plug-in třetích stran a která nemůže vynutit, aby moduly plug-iny používají kvalifikovanou cestu pro hovory LoadLibrary, by měla zavolat SetDllDirectory("") pro odebrání CWD a potom zavolat SetDllDirectory("umístění instalace modulu plug-in") a přidat adresář instalace modulu plug-in do cesty vyhledávání DLL.

Útoky založené na vyhledávacím výrazu

Podobný útok existuje, pokud aplikace pomocí rozhraní API SearchPathu vyhledá knihovnu DLL a dynamicky načte cestu vrácenou funkcí SearchPath. Toto je výchozí pořadí vyhledávání pro rozhraní SearchPath API:

  • Adresář, ze kterého se aplikace načetl

  • Aktuální pracovní adresář (CWD)

  • Systémový adresář

  • 16bitový adresář systému

  • Adresář Windows

  • The directories that are listed in the PATH environment variable

Tento vzor nedoporučujeme, protože není zabezpečený. Funkci SearchPath nedoporučujeme jako způsob vyhledání souboru .dll, pokud je zamýšlené použití výstupu při volání funkce LoadLibrary. Výsledkem může být vyhledání nesprávného souboru .dll, protože pořadí hledání funkce SearchPath se liší od pořadí hledání používaného funkcí LoadLibrary. Pokud potřebujete vyhledat a načíst soubor .dll, použijte funkci LoadLibrary.

ShellExecute a CreateProcess


Varianty těchto problémů mohou také existovat, když vývojáři říkají podobným funkcím, jako jsou ShellExecutea CreateProcess,aby se načítaly externí spustitelné soubory. Doporučujeme, aby vývojáři byli opatrní při načítání binárních souborů a specifikují plně kvalifikovanou cestu. Když načítáte binární soubor (místo knihovny), mělo by to být méně složité.

Doporučené kroky pro vývojáře softwaru

Doporučujeme, aby vývojáři postupují takto:

  • Ověřte, zda aplikace načítaly nezabezpečenou knihovnu (příklady z nich jsou uvedeny dále v tomto článku). Patří mezi ně například tyto:

    • Použití SearchPathu k identifikaci umístění knihovny nebo součásti.

    • Použití LoadLibrary k identifikaci verze operačního systému.

  • Používejte plně kvalifikované cesty pro všechna volání do LoadLibrary, CreateProcess a ShellExecute, kde je to možné.

  • Implementujte hovory do setdlldirectory s prázdným řetězcem (""), který odebere aktuální pracovní adresář z výchozího pořadí hledání knihovny DLL, ve kterém je požadované. Je třeba vědět, že SetDllDirectory ovlivní celý proces. Měli byste to tedy udělat jednou dříve při inicializaci procesu, ne před a po volání funkce LoadLibrary. Vzhledem k tomu, že nastavení SetDllDirectory ovlivňuje celý proces, může více vláken volat na SetDllDirectory s různými hodnotami nedefinované chování. Pokud je navíc proces navržen tak, aby načítá knihovny DLL třetích stran, bude testování nutné k určení toho, zda nastavení celého procesu způsobí nekompatibilitu. Známý problém v případě, že aplikace závisí na jazyku Visual Basic for Applications, může nastavení celého procesu způsobit nekompatibilitu.

  • Pomocí funkce SetSearchPathModepovolte pro proces režim bezpečného hledání procesu. Tím se aktuální pracovní adresář přesune na poslední místo v seznamu hledání SearchPathu po celou dobu trvání procesu.

  • Vyhněte se použití funkce SearchPath ke kontrole existence knihovny DLL bez zadání plně kvalifikované cesty, a to i v případě, že je povolen režim bezpečného vyhledávání, protože to může stále vést k útokům na předběžné načítání knihoven DLL.

Pokyny k identifikaci načtení nezabezpečující knihovny

Ve zdrojovém kódu jsou načten následující příklady nezabezpečených knihoven:

  • V následujícím příkladu kódu hledá aplikace "schannel.dll" pomocí nejméně bezpečné cesty pro hledání. Pokud by pak schannel.dll do CWD, načte se ještě předtím, než aplikace prohledá odpovídající knihovnu v adresářích Windows.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • V následujícím příkladu kódu se aplikace pokusí načíst knihovnu z různých umístění aplikací a operačního systému popsaných na začátku tohoto dokumentu pro volání LoadLibrary(). Pokud existuje nějaké riziko, že soubor není k dispozici, aplikace se může pokusit soubor načíst z aktuálního pracovního adresáře. Tento scénář je mírně méně nebezpečný než předchozí příklad. Aplikace ale uživatele aplikace vystaví riziku, pokud prostředí není zcela předvídatelné.

    HMODULE handle = LoadLibrary("schannel.dll");




Tady jsou příklady lepšího a bezpečnějšího načtení knihovny:

  • V následujícím příkladu kódu se knihovna načítá přímo pomocí plně kvalifikované cesty. Neexistuje žádné riziko, že by ho mohl zavádět škodlivý kód, pokud už nemá oprávnění k zápisu do cílového adresáře aplikace.

    HMODULE handle = LoadLibrary("c:\\windows\\system32\\schannel.dll");



    Poznámka: Informace o tom, jak určit systémový adresář, najdete v těchto materiálech:

    GetSystemDirectory

    http://msdn.microsoft.com/en-us/library/ms724373%28VS.85%29.aspxSHGetKnownFolderPath

    http://msdn.microsoft.com/en-us/library/bb762188%28v=VS.85%29.aspx

  • V následujícím příkladu kódu je před voláním funkce LoadLibrary z cesty pro hledání odebrán aktuální pracovní adresář. Značně se tím sníží riziko, protože by chtěl mít kontrolu nad adresářem aplikace, adresářem Windows nebo libovolnými adresáři zadanými v cestě uživatele, aby bylo možné použít útok pomocí knihovny DLL.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Ve všech systémech, které mají nainstalovanou aktualizaci zabezpečení 963027 (popsanou v MS09-014),se následující kód trvale přesune CWD na poslední místo v pořadí hledání. Jakákoli pozdější volání funkce SetSearchPathMode z tohoto procesu, který se pokusí změnit režim vyhledávání, se nezdaří.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • V následujícím příkladu kódu je před voláním funkce LoadLibrary z cesty pro hledání odebrán aktuální pracovní adresář. Značně se tím sníží riziko, protože by chtěl mít kontrolu nad adresářem aplikace, adresářem Windows nebo libovolnými adresáři zadanými v cestě uživatele, aby bylo možné použít útok pomocí knihovny DLL.

    SetSearchPathMode (BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT );
    HMODULE handle = LoadLibrary("schannel.dll");

Using Process Monitor to dynamically detect nonsecure loads

Microsoft publikuje nástroj s názvem Monitor procesu. Tento nástroj umožňuje vývojářům a správcům sledovat chování spuštěného procesu úzce. Pomocí monitoru procesu můžete dynamicky zjistit, jestli může být jedna z vašich aplikací vystavená tomuto druhu problému.

  • Pokud si chcete stáhnout sledování procesu, navštivte následující webovou stránku Microsoftu:

    http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

  • Zkuste spustit aplikaci pomocí CWD nastaveného na konkrétní adresář. Poklikejte například na soubor s příponou, která má přiřazenou obslužnou rutinu souboru pro vaši aplikaci.

  • Nastavte monitor procesu pomocí následujících filtrů:



    alternativní text

  • Pokud dojde k ohrožení zabezpečení, zobrazí se zpráva podobná této: alternativní textVolání do vzdálené sdílené složky při načítání knihovny DLL znamená, že jde o program, který je

    zranitelný.

Další informace

Další informace najdete na následujících webových stránkách Microsoftu: Pořadí vyhledávání

v dynamické knihovně

http://msdn.microsoft.com/library/ms682586(VS.85).aspxDokumentace k webu MSDN o funkci SearchPath

http://msdn.microsoft.com/library/aa365527(VS.85).aspxDokumentace msdn o funkci LoadLibrary

http://msdn.microsoft.com/library/ms684175(VS.85).aspxDokumentace k webu MSDN o funkci SetDllDirectory

http://msdn.microsoft.com/library/ms686203(VS.85).aspxDokumentace msdn o funkci SetSearchPathMode

http://msdn.microsoft.com/library/dd266735(VS.85).aspxPříspěvek na blog od Davida Le dotm, hlavního bezpečnostního technika s Microsoft Office

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxBlogový příspěvek od Andrew Rothsa, technický tým MSRC v knihovně DLL s předběžnou načtením útoků

http://blogs.technet.com/b/srd/archive/2009/04/14/ms09-014-addressing-the-safari-carpet-bomb-vulnerability.aspx

Další zdroje informací

Potřebujete další pomoc?

Chcete další možnosti?

Prozkoumejte výhody předplatného, projděte si školicí kurzy, zjistěte, jak zabezpečit své zařízení a mnohem více.

Komunity vám pomohou klást otázky a odpovídat na ně, poskytovat zpětnou vazbu a vyslechnout odborníky s bohatými znalostmi.

Byly tyto informace užitečné?

Jak jste spokojeni s kvalitou jazyka?
Co ovlivnilo váš názor?
Po stisknutí tlačítka pro odeslání se vaše zpětná vazba použije k vylepšování produktů a služeb Microsoftu. Váš správce IT bude moci tato data shromažďovat. Prohlášení o zásadách ochrany osobních údajů.

Děkujeme vám za zpětnou vazbu.

×