Prijavite se pomoću Microsofta
Prijavi se ili izradi račun.
Zdravo,
Odaberite drugi račun.
Imate više računa
Odaberite račun putem kojeg se želite prijaviti.

Podrška za Windows Vista Service Pack 1 (SP1) završava na srpnju 12, 2011. Da biste nastavili primati bezbednosna ažuriranja za Windows, provjerite koristite li Windows Vista sa servisnim paketom Service Pack 2 (SP2). Dodatne informacije potražite u ovoj Microsoftovoj web-stranici: Podrška se završava za neke verzije sustava Windows.

Kada aplikacija dinamički učitava biblioteku dinamičke veze (DLL) bez navođenja potpuno kvalificiranog puta, Windows pokušava pronaći DLL tako da pretraži dobro definirani skup direktorija. Ako napadač dobije kontrolu nad jednim od direktorija, može prisiliti aplikaciju da učitaju zlonamjernu kopiju DLL-a umjesto DLL-a koji je očekivala. Ovi su napadi poznati kao "DLL prijeopterećeni napadi" te su zajednički svim operativnim sustavima koji podržavaju dinamičko učitavanje zajedničkih DLL biblioteka. Utjecaj takvih napada može biti da napadač može izvršiti kod u kontekstu korisnika koji pokreće aplikaciju. Kada se aplikacija pokreće kao administrator, to bi moglo dovesti do lokalnog povećanja privilegija. Znamo o obnovljenim interesom za ove napade. Da biste ograničili učinak koji taj problem sadrži na naše zajedničke klijente, objavljujemo ovaj dokument zajednici za razvojne inženjere da bismo bili sigurni da znaju za taj problem i imaju potrebne alate za rješavanje problema u aplikacijama.

Sažetak

Opis napada DLL primatanje

Napadi na temelju utovare u biblioteci

Kada aplikacija dinamički učitava DLL bez navođenja potpuno kvalificiranog puta, Windows pokušava pronaći taj DLL tako da linearno pretražuje pomoću dobro definiranih skupa direktorija, poznatog kao DLL redoslijed pretraživanja. Ako Windows locira DLL unutar redoslijeda pretraživanja DLL-a, ona će učitati taj DLL. No ako Windows ne pronađe DLL u bilo kojem direktorijima u redoslijedu pretraživanja DLL-a, ona će vratiti neuspjeh u operaciji učitavanja DLL-a. U nastavku se prikazuje naredba DLL za pretraživanje za funkcije LoadLibraryi Loadlibraryex, koje se koriste za dinamičko učitavanje DLL-ova:

  1. Direktorij iz kojeg je aplikacija učitana

  2. Direktorij sustava

  3. 16-bitni sistemski direktorij

  4. Direktorij sustava Windows

  5. Sadašnji radni direktorij (CWD)

  6. Direktorije koji su navedeni u varijabli putanje okruženja



Razmotrite sljedeći scenarij:


  • Aplikacija učitava DLL, a da ne određuje potpuno kvalificirani put koji očekuje da će se pronaći u CWD aplikaciji.

  • Aplikacija je u potpunosti spremna za rukovanje slučajem kada ne pronađe DLL.

  • Napadač poznaje te informacije o aplikaciji i kontrolira CWD.

  • Napadač kopira vlastitu posebno oblikovnu verziju DLL-a u CWD-u. To pretpostavlja da napadač ima dozvolu za to.

  • Windows pretražuje direktorijima u redoslijedu pretraživanja DLL-a i pronalazi DLL u CWD aplikaciji.

U ovom scenariju posebno crafted DLL izvodi se unutar aplikacije i dobija privilegije sadašnjeg korisnika.

Preporuka

za sprječavanje tog napada, aplikacije mogu ukloniti postojeći radni direktorij (CWD) iz staze za pretraživanje DLL-a NAZIVANJEM API-ja programa Setd Directory pomoću praznog niza (""). Ako aplikacija ovisi o učitavanju DLL-a iz sadašnjeg direktorija, nabavite postojeći radni direktorij i koristite ga da biste prošli kroz potpuno kvalificirani put sustava LoadLibrary.



Svjesni smo i da neki programeri pomoću servisa LoadLibrary mogu provjeriti je li određeni DLL prisutan da bi se utvrdilo koju verziju sustava Windows pokreće korisnik. Imajte na umu da bi aplikacija mogla biti ranjiva. Ako stvarna biblioteka ne postoji u izdanju sustava Windows na kojoj se aplikacija izvršava, napadač može uvesti biblioteku s tim nazivom u CWD. Preporučujemo da ne koristite ovu tehniku. Umjesto toga koristite preporučene tehnike opisane u aplikaciji MSDN, "dobivanje sistemske verzije"

. Aplikacija koja učitava dodatke trećih strana i koja ne može prisiliti dodatke da koriste kvalificirani put za pozive za utovar u biblioteku, trebali bi nazvati Setdudirectory ("") da biste uklonili CWD, a zatim nazvati Setdedirectory ("dodatak za instalaciju dodatka") da biste dodali direktorij za instaliranje dodatka na put DLL pretraživanja.

Napadi utemeljeni na programu SearchPath

Sličan napad postoji kada aplikacija koristi API SearchPath za pronalaženje DLL-a i dinamički učitavanje puta koji vraća searchpath. Sljedeće je zadana narudžba za pretraživanje u API-ju SearchPath:

  • Direktorij iz kojeg je aplikacija učitana

  • Sadašnji radni direktorij (CWD)

  • Direktorij sustava

  • 16-bitni sistemski direktorij

  • Direktorij sustava Windows

  • Direktorije koji su navedeni u varijabli putanje okruženja

Ovaj uzorak ne preporučujemo jer nije siguran. Ne preporučujemo funkciju SearchPath kao način pronalaženja. dll datoteke ako je namjenska upotreba izlaza u pozivu na funkciju LoadLibrary. To može dovesti do pronalaženja pogrešne. dll datoteke jer se redoslijed pretraživanja funkcije SearchPath razlikuje od redoslijeda pretraživanja koju koristi funkcija LoadLibrary. Ako morate pronaći i učitati. dll datoteku, koristite funkciju LoadLibrary.

Šellexocute i CreateProcess


Varijacije tih problema mogu postojati i kada programeri pozivaju slične funkcije, kao što su Shellexacutei CreateProcessza učitavanje vanjskih izvršnih datoteka. Preporučujemo da programeri budu pažljivi kada učitavaju binarne datoteke i određuju potpuno kvalificirani put. To bi trebalo predstavljati manju složenost kada koristite binarni umjesto biblioteke.

Preporučeni koraci za programere softvera

Preporučujemo da programerima učinite sljedeće:

  • Provjerite valjanost svojih aplikacija za instance nesigurnih biblioteka opterećenja (primjeri svakog daju se kasnije u ovom članku). To obuhvaća sljedeće:

    • Korištenje SearchPath za identifikaciju lokacije biblioteke ili komponente.

    • Korištenje servisa LoadLibrary za identifikaciju verzije operacijskog sustava.

  • Koristite potpuno kvalificirane putove za sve pozive na Učitavanje biblioteke, CreateProcess i Shellexacute gdje možete.

  • Implementirati pozive na SetDllDirectory s praznim nizom ("") da biste trenutno aktivni direktorij uklonili iz zadanog redoslijeda za pretraživanje DLL-a gdje je to potrebno. Imajte na umu da Setd direktorij utječe na cijeli postupak. Stoga to morate učiniti jednom početkom u pokretanju procesa, a ne prije i nakon poziva na Učitavanje biblioteke. Budući da SetDllDirectory utječe na cijeli postupak, više tema koje nazivaju SetDllDirectory s različitim vrijednostima može prouzročiti nedefinirano ponašanje. Uz to, ako je postupak dizajniran za učitavanje DLL-ova drugih proizvođača, potrebno je testirati da biste odredili hoće li postavka u širokom procesu prouzročiti nekompatibilnost. Poznato je pitanje: kada aplikacija ovisi o programu Visual Basic for Applications, postavka u širokom procesu može prouzročiti nekompatibilnost.

  • Pomoću funkcije Setsearchpathmodemožete omogućiti način pretraživanja sigurnog postupka za postupak. Time se sadašnji radni direktorij premješta na posljednje mjesto na popisu pretraživanja u pretraživanju puta za vijek trajanja postupka.

  • Izbjegavajte korištenje SearchPath za provjeru postojanja DLL-a bez navođenja potpuno kvalificiranog puta, čak i ako je omogućen siguran način pretraživanja jer to i dalje može dovesti do DLL preloading napada.

Upute za identifikaciju opterećenja biblioteke koje nisu sigurne

U izvornom kodu slijede primjeri nesigurne opterećenja biblioteke:

  • U sljedećem primjeru koda aplikacija traži "schannel.dll" pomoću najmanjeg sigurnog puta pretraživanja. Ako napadač može postaviti schannel.dll u CWD, on će se učitati čak i prije nego što aplikacija pretražuje direktorije sustava Windows za odgovarajuću biblioteku.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • U sljedećem primjeru koda aplikacija pokušava učitati biblioteku s različitih mjesta aplikacija i operacijskog sustava opisanih na početku ovog dokumenta za pozive iz biblioteke za utovar (). Ako postoji neki rizik da datoteka nije prisutna, aplikacija može pokušati učitati datoteku iz sadašnjeg radnog imenika. Ovaj je scenarij neznatno manje opasan od prethodnog primjera. No još uvijek izlaže korisnika aplikacije riziku ako okruženje nije potpuno predvidljivo.

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




Slijede primjeri boljih i sigurnija opterećenja biblioteke:

  • U sljedećem primjeru koda biblioteka se učitava izravno pomoću potpuno kvalificiranog puta. Ne postoji opasnost da napadač uvodi zlonamjerni kod, osim ako već ima dozvole za zapisivanje u ciljnom direktoriju aplikacije.

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



    Obavijest o tome kako odrediti sistemski direktorij potražite u sljedećim resursima:

    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

  • U sljedećem primjeru koda sadašnji radni direktorij uklanja se s puta pretraživanja prije nego što nazoveš utovar u biblioteku. Time se znatno smanjuje rizik, budući da bi napadač morao kontrolirati direktorij aplikacija, direktorij sustava Windows ili bilo koji direktorije koji su navedeni na putu korisnika radi korištenja DLL-a koji je pretutovario.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Na svim sustavima s instaliranim sigurnosnim ažuriranjem 963027 (opisano u programu MS09-014) sljedeći kod trajno će premjestiti CWD na posljednje mjesto u redoslijedu pretraživanja. Bilo koji kasniji pozivi u funkciju SetSearchPathMode unutar tog postupka koji pokušava promijeniti način rada za pretraživanje neće uspjeti.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • U sljedećem primjeru koda sadašnji radni direktorij uklanja se s puta pretraživanja prije nego što nazoveš utovar u biblioteku. Time se znatno smanjuje rizik, budući da bi napadač morao kontrolirati direktorij aplikacija, direktorij sustava Windows ili bilo koji direktorije koji su navedeni na putu korisnika radi korištenja DLL-a koji je pretutovario.

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

Korištenje monitora procesa za dinamičko prepoznavanje nesigurnih opterećenja

Microsoft objavljuje alat koji se zove praćenje procesa. Ovaj alat omogućuje programerima i administratorima da pomno prate ponašanje izvođenja postupka. Monitor obrade može se koristiti za dinamičko prepoznavanje je li jedan od vaših aplikacija možda ranjiv na ovu vrstu problema.

  • Da biste preuzeli nadzor procesa, posjetite sljedeću Microsoftovu web-stranicu:

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

  • Pokušajte pokrenuti aplikaciju pomoću CWD seta u određeni direktorij. Na primjer, dvokliknite datoteku koja ima ekstenziju čiji je rukovatelj datotekama dodijeljen vašoj aplikaciji.

  • Postavljanje monitora procesa pomoću sljedećih filtara:



    Zamjenski tekst

  • Ako je pogoðen ranjiv put, vidjet ćete nešto slično sljedećem: Zamjenski tekst

    poziva na daljinsku razmjenu datoteka da biste učitali DLL znači da je to ranjiv program.

Dodatne informacije

Dodatne informacije potražite na sljedećim Microsoftovim web-stranicama:

redoslijed pretraživanja biblioteke dinamičke veze

http://msdn.Microsoft.com/en-us/library/ms682586 (VS. 85). aspxMSDN dokumentacija u funkciji SearchPath

http://msdn.Microsoft.com/en-us/library/aa365527 (VS. 85). aspxMSDN dokumentacija u funkciji LoadLibrary

http://msdn.Microsoft.com/en-us/library/ms684175 (VS. 85). aspxMSDN dokumentacija u funkciji SetDllDirectory

http://msdn.Microsoft.com/en-us/library/ms686203 (VS. 85). aspxMSDN dokumentacija u funkciji SetSearchPathMode

http://msdn.Microsoft.com/en-us/library/dd266735 (VS. 85). aspxBlog post by David LeBlanc, ravnatelj sigurnosnog inženjera sa sustavom Microsoft Office

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxBlog post by Andrew Rothi, MSRC inženjering tim na DLL preloading napadi

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

Dodatni resursi

Potrebna vam je dodatna pomoć?

Želite dodatne mogućnosti?

Istražite pogodnosti pretplate, pregledajte tečajeve za obuku, saznajte kako zaštititi uređaj i još mnogo toga.

Zajednice vam pomažu da postavljate pitanja i odgovarate na njih, pošaljete povratne informacije i čujete se sa stručnjacima s bogatim znanjem.

Jesu li vam ove informacije bile korisne?

Koliko ste zadovoljni jezičnom kvalitetom?
Što je utjecalo na vaše iskustvo?
Ako pritisnete Pošalji, vaše će se povratne informacije iskoristiti za poboljšanje Microsoftovih proizvoda i usluga. Vaš će IT administrator moći prikupiti te podatke. Izjava o zaštiti privatnosti.

Hvala vam na povratnim informacijama!

×