Prihláste sa s kontom Microsoft
Prihláste sa alebo si vytvorte konto.
Dobrý deň,
Vyberte iné konto.
Máte viacero kont
Vyberte konto, s ktorým sa chcete prihlásiť.

Podpora pre Windows Vista Service Pack 1 (SP1) končí 12. júla 2011. Ak chcete pokračovať v prijímaní aktualizácií zabezpečenia pre Windows, skontrolujte, či používate Windows Vista s balíkom Service Pack 2 (SP2). Ďalšie informácie nájdete v téme Táto webová stránka spoločnosti Microsoft: končí sa podpora pre niektoré verzie Windowsu.

Keď aplikácia dynamicky načíta knižnicu DLL (Dynamic Link Library) bez toho, aby špecifikovala úplnú kvalifikovanú cestu, Windows sa pokúsi vyhľadať knižnicu DLL prehľadávaním presne definovanej množiny adresárov. Ak útočník získa kontrolu nad jedným z adresárov, môže vynútiť uplatnenie na načítanie škodlivej kópie knižnice DLL namiesto knižnice DLL, ktorú očakával. Tieto útoky sa označujú ako útoky na prednačítanie knižníc DLL a sú spoločné pre všetky operačné systémy, ktoré podporujú dynamicky načítavanie zdieľaných knižníc DLL. Výsledkom týchto útokov môže byť to, že útočník môže spustiť kód v kontexte používateľa, ktorý aplikáciu spustil. Keď sa aplikácia spustí ako správca, môže to viesť k lokálnemu zvýšeniu privilégií. Vieme o obnovených záujmoch týchto útokov. Ak chcete obmedziť vplyv tohto problému na našich zákazníkov, vydávame tento dokument komunite vývojárov, aby ste sa uistili, že o tomto probléme vedia a ktoré majú potrebné nástroje na vyriešenie problému vo svojich aplikáciách.

Súhrn

Popis predinštalovaných útokov knižnice DLL

Útoky založené na LoadLibrary

Keď aplikácia dynamicky načíta knižnicu DLL bez toho, aby špecifikovala úplnú kvalifikovanú cestu, Windows sa pokúsi vyhľadať túto knižnicu DLL lineárnym vyhľadávaním prostredníctvom presne definovanej množiny adresárov, ktorá sa označuje ako poradie vyhľadávania v knižnici DLL. Ak systém Windows vyhľadá knižnicu DLL v rámci príkazu na vyhľadávanie v knižnici DLL, načíta túto knižnicu DLL. Ak však Windows nenájde knižnicu DLL v niektorom z adresárov v poradí vyhľadávania knižnice DLL, vráti zlyhanie operácie načítania knižnice DLL. Toto je poradie vyhľadávania DLL pre funkcie LoadLibrarya LoadLibraryEx, ktoré sa používajú na dynamické načítanie knižníc DLL:

  1. Adresár, z ktorého sa načítala aplikácia

  2. Systémový adresár

  3. 16-bitový systémový adresár

  4. Adresár systému Windows

  5. Aktuálny pracovný adresár (CWD)

  6. Adresáre, ktoré sú uvedené v premennej prostredia PATH



Zoberme si nasledujúcu situáciu:


  • Aplikácia načíta knižnicu DLL bez toho, aby špecifikovala úplnú kvalifikovanú cestu, ktorú očakáva, že sa bude nachádzať v CWD aplikácie.

  • Aplikácia je plne pripravená na spracovanie prípadu, keď nenájde knižnicu DLL.

  • Útočník pozná tieto informácie o aplikácii a riadi CWD.

  • Útočník skopíruje svoju vlastnú špeciálne vyhotovenú verziu knižnice DLL v CWD. Predpokladá sa, že útočník má povolenie na tento postup.

  • Windows vyhľadáva v adresároch v poradí vyhľadávania knižnice DLL a vyhľadá knižnicu DLL v CWD aplikácie.

V tomto scenári sa v rámci aplikácie spustí špeciálne vytvorené knižnice DLL a získajú sa privilégiá aktuálneho používateľa.

Odporúčame

, aby ste zabránili tomuto útoku, aplikácie môžu odstrániť aktuálny pracovný adresár (CWD) z cesty vyhľadávania knižnice DLL volaním rozhrania API SetDllDirectory pomocou prázdneho reťazca (""). Ak aplikácia závisí od načítania knižnice DLL z aktuálneho adresára, získate aktuálny pracovný adresár a použijete ho na úplnú cestu funkcie LoadLibrary.



Sme si tiež vedomí toho, že niektorí vývojári používajú funkcie LoadLibrary na overenie, či je určitá knižnica DLL prítomná na určenie, ktorú verziu systému Windows spustil používateľ. Mali by ste si byť vedomí toho, že by to mohlo spôsobiť zraniteľnosť aplikácie. Ak dotknutá knižnica skutočne neexistuje vo vydaní Windowsu, v ktorej je aplikácia spustená, útočník mohol do CWD vložiť knižnicu s rovnakým názvom. Dôrazne odporúčame použiť túto techniku. Namiesto toho použite Odporúčané postupy, ktoré sú popísané v článku MSDN, "získanie verzie systému"

. Aplikácia, ktorá načíta zásuvné moduly tretích strán a ktoré nemôžu vynútiť pluginy na používanie kvalifikovanej cesty pre svoje hovory LoadLibrary, by mali zavolať SetDllDirectory (""), odstrániť CWD a potom zavolať SetDllDirectory ("plugin Inštalácia Location"), ak chcete pridať adresár inštalácie pluginu do vyhľadávacieho priečinka DLL.

Útoky založené na SearchPath

Podobný útok existuje, keď aplikácia používa rozhranie API SearchPath na vyhľadanie knižnice DLL a dynamicky načíta cestu, ktorú vráti SearchPath. Toto je predvolené poradie vyhľadávania pre rozhranie API SearchPath:

  • Adresár, z ktorého sa načítala aplikácia

  • Aktuálny pracovný adresár (CWD)

  • Systémový adresár

  • 16-bitový systémový adresár

  • Adresár systému Windows

  • Adresáre, ktoré sú uvedené v premennej prostredia PATH

Tento model sa neodporúča, pretože nie je zabezpečený. Funkciu SearchPath neodporúčame ako spôsob lokalizácie súboru. dll, ak je plánované použitie výstupu v hovore na funkciu LoadLibrary. Môže to mať za následok vyhľadanie nesprávneho súboru. dll, pretože poradie vyhľadávania funkcie SearchPath sa líši od poradia vyhľadávania používaného funkciou LoadLibrary. Ak chcete vyhľadať a načítať súbor. dll, použite funkciu LoadLibrary.

ShellExecute a funkcia CreateProcess


Variácie týchto problémov môžu existovať aj vtedy, keď vývojári zavolajú podobné funkcie, ako je napríklad ShellExecutea CreateProcess, na načítanie externých spustiteľných súborov. Odporúčame, aby vývojári pri načítavaní binárnych súborov boli opatrní a určili úplnú cestu. Pri načítavaní binárneho namiesto knižnice by to malo predstavovať menej zložitosti.

Odporúčané kroky pre vývojárov softvéru

Odporúčame vývojárom vykonávať nasledujúce činnosti:

  • Overenie aplikácií pre inštancie nezabezpečenej knižnice bremien (príklady jednotlivých prípadov sú uvedené ďalej v tomto článku). Tieto zahŕňajú nasledovné:

    • Použitie SearchPath na identifikáciu umiestnenia knižnice alebo súčasti.

    • Použitie funkcie LoadLibrary na identifikáciu verzie operačného systému.

  • Používajte plne kvalifikované cesty pre všetky hovory na LoadLibrary, CreateProcess a ShellExecute, kde môžete.

  • Implementovať hovory na SetDllDirectory s prázdnym reťazcom (""), ak chcete odstrániť aktuálny pracovný adresár z predvolenej poradia vyhľadávania knižnice DLL, kde sa vyžaduje. Uvedomte si, že SetDllDirectory ovplyvňuje celý proces. Preto by ste mali postupovať raz na začiatku procesu inicializácie, nie pred a za hovory na LoadLibrary. Keďže SetDllDirectory ovplyvňuje celý proces, viacero vlákien, ktoré volajú SetDllDirectory s rôznymi hodnotami, môže spôsobiť nedefinované správanie. Okrem toho, ak je proces navrhnutý na načítanie knižníc DLL tretích strán, bude potrebné vykonať testovanie na určenie, či sa nastavenie celého procesu bude spôsobovať nekompatibility. Známy problém je, že keď aplikácia závisí od jazyka Visual Basic for Applications, môže nastavenie celého procesu spôsobovať nezlučiteľnosť.

  • Použite funkciu SetSearchPathModena povolenie režimu vyhľadávania bezpečných procesov pre daný proces. Aktuálny pracovný adresár sa presunie na posledné miesto v zozname vyhľadávania SearchPath počas celého trvania procesu.

  • Nepoužívajte SearchPath na kontrolu existencie knižnice DLL bez zadania plne kvalifikovanej cesty, a to aj v prípade, ak je zapnutý režim bezpečného vyhľadávania, pretože to môže viesť k útokom na prednačítanie knižnice DLL.

Usmernenie na identifikáciu nezabezpečených bremien v knižnici

V zdrojovom kóde sú uvedené príklady nezabezpečenej knižnice:

  • V nasledujúcom príklade kódu aplikácia vyhľadá "schannel.dll" pomocou najmenšieho zabezpečeného vyhľadávania. Ak útočník môže v CWD umiestniť schannel.dll, načíta sa ešte pred vyhľadaním adresárov Windowsu pre príslušnú knižnicu.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • V nasledujúcom príklade kódu sa aplikácia pokúsi načítať knižnicu z rôznych umiestnení aplikácií a operačného systému, ktoré sú popísané na začiatku tohto dokumentu pre hovor LoadLibrary (). Ak existuje riziko, že súbor nie je k dispozícii, aplikácia sa môže pokúsiť načítať súbor z aktuálneho pracovného adresára. Tento scenár je o niečo menej nebezpečný než v predchádzajúcom príklade. Avšak stále vystavuje používateľovi aplikácie riziko v prípade, že prostredie nie je úplne predvídateľné.

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




Nižšie sú uvedené príklady lepšej a bezpečnej knižnice:

  • V nasledujúcom príklade kódu je knižnica načítaná priamo pomocou plne kvalifikovanej cesty. Neexistuje žiadne riziko, že útočník zavedie škodlivý kód, pokiaľ už nemá povolenia na zápis do cieľového adresára aplikácie.

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



    Poznámka: informácie o tom, ako určiť systémový adresár, nájdete v týchto zdrojoch informácií:

    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 nasledujúcom príklade kódu sa aktuálny pracovný adresár odstráni z cesty vyhľadávania pred volaním LoadLibrary. Tým sa výrazne zníži riziko, pretože útočník bude musieť ovládať adresár aplikácie, adresár Windowsu alebo ľubovoľný adresár, ktorý je zadaný v ceste používateľa, aby mohol používať nahrávací útok knižnice DLL.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Vo všetkých systémoch s nainštalovanou aktualizáciou zabezpečenia 963027 (opísanej v MS09-014) sa nasledujúci kód natrvalo presunie CWD na posledné miesto v objednávke vyhľadávania. Akékoľvek neskoršie hovory na funkciu SetSearchPathMode zvnútra tohto procesu, ktoré sa pokúšajú zmeniť režim vyhľadávania, zlyhajú.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • V nasledujúcom príklade kódu sa aktuálny pracovný adresár odstráni z cesty vyhľadávania pred volaním LoadLibrary. Tým sa výrazne zníži riziko, pretože útočník bude musieť ovládať adresár aplikácie, adresár Windowsu alebo ľubovoľný adresár, ktorý je zadaný v ceste používateľa, aby mohol používať nahrávací útok knižnice DLL.

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

Používanie funkcie Sledovanie procesov na dynamické zisťovanie nezabezpečených bremien

Spoločnosť Microsoft publikuje nástroj s názvom monitor procesov. Tento nástroj umožňuje vývojárom a správcom pozorne sledovať správanie spusteného procesu. Monitor procesov sa môže použiť na dynamickú identifikáciu toho, či niektoré aplikácie môžu byť zraniteľné voči tomuto problému.

  • Ak chcete stiahnuť Process Monitor, navštívte nasledujúcu webovú stránku Microsoft:

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

  • Skúste spustiť aplikáciu pomocou CWD nastavenej v konkrétnom adresári. Dvakrát kliknite na súbor s príponou, ktorej popisovač súboru je priradený k vašej aplikácii.

  • Nastavte monitor procesov s nasledujúcimi filtrami:



    Alternatívny text

  • Ak je zraniteľná cesta zasiahnutá, zobrazí sa niečo podobné nasledujúcemu: Alternatívny text

    hovoru na vzdialený súbor zdieľať na načítanie knižnice DLL označuje, že ide o zraniteľný program.

Ďalšie informácie

Ďalšie informácie nájdete na týchto webových stránkach spoločnosti Microsoft:

poradie vyhľadávania v knižnici dynamických prepojení

http://MSDN.Microsoft.com/en-us/library/ms682586 (VS. 85). aspxDokumentácia služby MSDN v SearchPath (funkcia)

http://MSDN.Microsoft.com/en-us/library/aa365527 (VS. 85). aspxDokumentácia služby MSDN v rámci funkcie LoadLibrary

http://MSDN.Microsoft.com/en-us/library/ms684175 (VS. 85). aspxDokumentácia služby MSDN v SetDllDirectory (funkcia)

http://MSDN.Microsoft.com/en-us/library/ms686203 (VS. 85). aspxDokumentácia služby MSDN v SetSearchPathMode (funkcia)

http://MSDN.Microsoft.com/en-us/library/dd266735 (VS. 85). aspxBlogový príspevok od Davida LeBlanc, hlavného bezpečnostného inžiniera s balíkom Microsoft Office

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxBlogový príspevok od Andrew Roths, MSRC inžinierstva Team na útoky na prednačítanie knižnice DLL

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

Ďalšie zdroje

Potrebujete ďalšiu pomoc?

Chcete ďalšie možnosti?

Môžete preskúmať výhody predplatného, prehľadávať školiace kurzy, naučiť sa zabezpečiť svoje zariadenie a ešte oveľa viac.

Komunity pomôžu s kladením otázok a odpovedaním na ne, s poskytovaním pripomienok a so získavaním informácií od odborníkov s bohatými znalosťami.

Boli tieto informácie užitočné?

Aká je podľa vás jazyková kvalita textu?
Čo sa vám páčilo, prípadne čo nie?
Stlačením tlačidla Odoslať sa vaše pripomienky použijú na zlepšenie produktov a služieb spoločnosti Microsoft. Váš správca IT bude môcť tieto údaje zhromažďovať. Vyhlásenie o ochrane osobných údajov.

Ďakujeme za vaše pripomienky!

×