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:
-
Direktorij iz kojeg je aplikacija učitana
-
Direktorij sustava
-
16-bitni sistemski direktorij
-
Direktorij sustava Windows
-
Sadašnji radni direktorij (CWD)
-
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:
getsystemdirectoryhttp://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:
-
Ako je pogoðen ranjiv put, vidjet ćete nešto slično sljedećem:
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