Podpora za Windows Vista s servisnim paketom SP1 se konča 12. julija 2011. Če želite še naprej prejemati varnostne posodobitve za Windows, se prepričajte, da imate nameščen sistem Windows Vista s servisnim paketom SP2. Če želite več informacij, obiščite to Microsoftovo spletno stran: Podpora za nekatere različice sistema Windows se končuje.
Ko program dinamično naloži knjižnico dinamičnih povezav (DLL), ne da bi določil popolnoma določeno pot, Windows poskuša poiskati knjižnico DLL z iskanjem po dobro določenem naboru imenikov. Če napadalec prevzame nadzor nad enim od imenikov, lahko prisili aplikacijo, da naloži zlonamerno kopijo DLL namesto DLL, ki jo je pričakoval. Ti napadi so znani kot »napadi na prednalaganje DLL« in so skupni vsem operacijskim sistemom, ki podpirajo dinamično nalaganje knjižnic DLL v skupni rabi. Učinek takšnih napadov bi lahko bil, da lahko napadalec izvede kodo v kontekstu uporabnika, ki izvaja aplikacijo. Ko se aplikacija izvaja kot skrbnik, lahko to privede do lokalnega dviga pravic. Vemo za obnovljeno zanimanje za te napade. Da bi omejili učinek, ki ga ima ta težava na naše skupne stranke, objavljamo ta dokument skupnosti razvijalcev, da se prepričamo, da so seznanjeni s to težavo in imajo potrebna orodja za reševanje težave v svojih aplikacijah.
Povzetek
Opis napadov na prednalaganje DLL
Napadi, ki temeljijo na knjižnici LoadLibrary
Ko aplikacija dinamično naloži knjižnico DLL, ne da bi določila popolnoma kvalificirano pot, Windows poskuša najti to knjižnico DLL s linearnim iskanjem po dobro določenem naboru imenikov, znanih kot vrstni red iskanja DLL. Če Windows najde DLL v vrstnem redu iskanja DLL, bo naložil to DLL. Če pa Windows ne najde knjižnice DLL v nobenem imeniku v vrstnem redu iskanja DLL, bo operaciji nalaganja DLL vrnil napako. Sledi vrstni red iskanja DLL za funkcije LoadLibrary in LoadLibraryEx , ki se uporabljajo za dinamično nalaganje knjižnic DLL:
- Imenik, iz katerega se je naložil program
- Sistemski imenik
- 16-bitni sistemski imenik
- Imenik sistema Windows
- Trenutni delovni imenik (CWD)
- Imeniki, ki so navedeni v spremenljivki okolja PATH
Oglejte si ta scenarij:
- Program naloži knjižnico DLL, ne da bi določil popolnoma kvalificirano pot, ki jo pričakuje v CWD aplikacije.
- Aplikacija je v celoti pripravljena na obravnavo primera, ko ne najde DLL.
- Napadalec pozna te podatke o aplikaciji in nadzoruje CWD.
- Napadalec kopira svojo posebej izdelano različico DLL v CWD. To pomeni, da ima napadalec dovoljenje za to.
- Windows išče po imenikih v vrstnem redu iskanja DLL in najde DLL v CWD aplikacije.
V tem scenariju se posebej oblikovana knjižnica DLL zažene v aplikaciji in pridobi pravice trenutnega uporabnika.
Priporočilo
Da bi preprečili ta napad, lahko aplikacije odstranijo trenutni delovni imenik (CWD) iz iskalne poti DLL tako, da pokličejo API SetDllDirectory s praznim nizom (""). Če je aplikacija odvisna od nalaganja DLL iz trenutnega imenika, prosimo, pridobite trenutni delovni imenik in ga uporabite za posredovanje popolnoma kvalificirane poti LoadLibrary.
Zavedamo se tudi, da nekateri razvijalci uporabljajo LoadLibrary za preverjanje, ali je na voljo določena knjižnica DLL, da bi ugotovili, katero različico sistema Windows uporablja uporabnik. Zavedati se morate, da bi to lahko povzročilo ranljivost aplikacije. Če prizadeta knjižnica dejansko ne obstaja v izdaji sistema Windows, na kateri se izvaja aplikacija, lahko napadalec v CWD vnese knjižnico z istim imenom. Toplo priporočamo, da ne uporabljate te tehnike. Namesto tega uporabite priporočene tehnike, ki so opisane v članku MSDN »Pridobivanje različice sistema«.
Aplikacija, ki naloži vtičnike tretjih oseb in ki ne more prisiliti vtičnikov, da uporabijo kvalificirano pot za klice LoadLibrary, mora poklicati SetDllDirectory (""), da odstrani CWD, in nato poklicati SetDllDirectory ("lokacija namestitve vtičnika"), da doda namestitveni imenik vtičnikov v iskalno pot DLL.
Napadi, ki temeljijo na SearchPath
Podoben napad obstaja, ko aplikacija uporablja API SearchPath za iskanje DLL in dinamično nalaganje poti, ki jo vrne SearchPath. Sledi privzeti vrstni red iskanja za API SearchPath:
- Imenik, iz katerega se je naložil program
- Trenutni delovni imenik (CWD)
- Sistemski imenik
- 16-bitni sistemski imenik
- Imenik sistema Windows
- Imeniki, ki so navedeni v spremenljivki okolja PATH
Tega vzorca ne priporočamo, ker ni varen. Funkcije SearchPath ne priporočamo kot načina iskanja .dll datoteke, če je predvidena uporaba izhoda v klicu funkcije LoadLibrary. To lahko povzroči, da poiščete napačno .dll datoteko, ker se vrstni red iskanja funkcije SearchPath razlikuje od vrstnega reda iskanja, ki ga uporablja funkcija LoadLibrary. Če morate poiskati in naložiti datoteko .dll, uporabite funkcijo LoadLibrary.
ShellExecute in CreateProcess
Različice teh težav lahko obstajajo tudi, ko razvijalci pokličejo podobne funkcije, kot sta ShellExecute in CreateProcess , za nalaganje zunanjih izvedljivih datotek. Priporočamo, da bodo razvijalci previdni pri nalaganju dvojiških datotek in določijo popolnoma kvalificirano pot. To bi moralo predstavljati manj zapletenosti, ko nalagate binarno datoteko namesto knjižnice.
Priporočeni koraki za razvijalce programske opreme
Razvijalcem priporočamo, da naredijo to:
Preverite njihove aplikacije za primere nevarnih obremenitev knjižnic (primeri vsakega so navedeni v nadaljevanju tega članka). Med te sodijo:
- Uporaba funkcije SearchPath za prepoznavanje lokacije knjižnice ali komponente.
- Uporaba LoadLibrary za prepoznavanje različice operacijskega sistema.
Uporabite popolnoma kvalificirane poti za vse klice LoadLibrary, CreateProcess in ShellExecute, kjer je to mogoče.
Izvedite klice SetDllDirectory s praznim nizom (""), da odstranite trenutni delovni imenik iz privzetega vrstnega reda iskanja DLL, kjer je potreben. Zavedajte se, da SetDllDirectory vpliva na celoten proces. Zato morate to storiti enkrat na začetku inicializacije procesa, ne pred in po klicih LoadLibrary. Ker SetDllDirectory vpliva na celoten proces, lahko več niti, ki kličejo SetDllDirectory z različnimi vrednostmi, povzroči nedoločeno vedenje. Poleg tega, če je postopek zasnovan za nalaganje DLL tretjih oseb, bo potrebno testiranje, da se ugotovi, ali bo nastavitev celotnega procesa povzročila nezdružljivosti. Znana težava je, da če je program odvisen od jezika Visual Basic for VBA, lahko nastavitev celotnega procesa povzroči nezdružljivost.
S funkcijo SetSearchPathMode omogočite varen način iskanja procesa za proces. S tem premaknete trenutni delovni imenik na zadnje mesto na iskalnem seznamu SearchPath za celotno življenjsko dobo procesa.
Izogibajte se uporabi SearchPath za preverjanje obstoja knjižnice DLL, ne da bi določili popolnoma kvalificirano pot, tudi če je omogočen varni način iskanja, ker lahko to še vedno povzroči napade s prednalaganjem knjižnice DLL.
Navodila za prepoznavanje nevarnih obremenitev knjižnic
V izvorni kodi so navedeni primeri nevarnih nalaganj knjižnic:
V tem primeru kode program poišče »schannel.dll« z najmanj varno iskalno potjo. Če lahko napadalec postavi schannel.dll v CWD, se bo naložil, še preden aplikacija poišče ustrezno knjižnico v imenikih Windows.
DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); HMODULE handle = LoadLibrary(result);V naslednjem primeru kode program poskuša naložiti knjižnico z različnih lokacij aplikacij in operacijskih sistemov, opisanih na začetku tega dokumenta, za klic LoadLibrary(). Če obstaja tveganje, da datoteka ni prisotna, lahko program poskusi naložiti datoteko iz trenutnega delovnega imenika. Ta scenarij je nekoliko manj nevaren kot prejšnji primer. Vendar pa uporabnika aplikacije še vedno izpostavlja tveganju, če okolje ni popolnoma predvidljivo.
HMODULE handle = LoadLibrary("schannel.dll");
Spodaj so navedeni primeri boljših in varnejših nalaganj knjižnic:
V tem primeru kode se knjižnica naloži neposredno s popolnoma kvalificirano potjo. Ni nevarnosti, da bi napadalec vnesel zlonamerno kodo, razen če že ima dovoljenja za pisanje v ciljni imenik aplikacije.
HMODULE handle = LoadLibrary("c:\\windows\\system32\\schannel.dll");Opomba Če želite več informacij o določanju sistemskega imenika, glejte te vire:
GetSystemDirectory
http://msdn.microsoft.com/en-us/library/ms724373%28VS.85%29.aspx SHGetKnownFolderPath
http://msdn.microsoft.com/en-us/library/bb762188%28v=VS.85%29.aspxV naslednjem primeru kode je trenutni delovni imenik odstranjen iz iskalne poti, preden pokličete LoadLibrary. To znatno zmanjša tveganje, saj bi moral napadalec nadzorovati imenik aplikacij, imenik Windows ali vse imenike, ki so določeni na poti uporabnika, da bi lahko uporabil napad na prednalaganje DLL.
SetDllDirectory (""); HMODULE handle = LoadLibrary("schannel.dll");V vseh sistemih, v katerih je nameščen 963027 varnostnih posodobitev (opisan v MS09-014), bi ta koda trajno premaknila CWD na zadnje mesto v vrstnem redu iskanja. Vsi poznejši klici funkcije SetSearchPathMode iz tega procesa, ki poskušajo spremeniti način iskanja, ne bodo uspeli.
SetDllDirectory (""); HMODULE handle = LoadLibrary("schannel.dll");V naslednjem primeru kode je trenutni delovni imenik odstranjen iz iskalne poti, preden pokličete LoadLibrary. To znatno zmanjša tveganje, saj bi moral napadalec nadzorovati imenik aplikacije, imenik Windows ali vse imenike, ki so določeni na uporabniški poti, da bi lahko uporabil napad na prednalaganje DLL.
SetSearchPathMode (BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT ); HMODULE handle = LoadLibrary("schannel.dll");
Uporaba nadzornika procesov za dinamično zaznavanje nezavarovanih obremenitev
Microsoft objavi orodje z imenom Process Monitor. To orodje razvijalcem in skrbnikom omogoča, da natančno spremljajo delovanje tekočega procesa. Process Monitor se lahko uporablja za dinamično zaznavanje, ali je katera od aplikacij ranljiva za tovrstno težavo.
Če želite prenesti Process Monitor, obiščite to Microsoftovo spletno stran:
http://technet.microsoft.com/en-us/sysinternals/bb896645.aspxPoskusite zagnati aplikacijo tako, da uporabite CWD, nastavljen na določen imenik. Dvokliknite na primer datoteko s pripono, katere rutina za obravnavo datotek je dodeljena programu.
Nastavite nadzornika procesov s temi filtri:
Če je prizadeta ranljiva pot, boste videli nekaj, kar je podobno temu:
Klic oddaljene skupne rabe datotek za nalaganje knjižnice DLL označuje, da je to ranljiv program.
Več informacij
Če želite več informacij, obiščite te Microsoftove spletne strani:
Dinamično povezovalni vrstni red iskanja po knjižnici
http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx Dokumentacija MSDN o funkciji SearchPath
http://msdn.microsoft.com/en-us/library/aa365527(VS.85).aspx Dokumentacija MSDN o funkciji LoadLibrary
http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx Dokumentacija MSDN o funkciji SetDllDirectory
http://msdn.microsoft.com/en-us/library/ms686203(VS.85).aspx Dokumentacija MSDN o funkciji SetSearchPathMode
http://msdn.microsoft.com/en-us/library/dd266735(VS.85).aspx Objava v spletnem dnevniku Davida Leblanca, glavnega varnostnega inženirja pri Microsoft Officeu
http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspx Objava v spletnem dnevniku Andrewa Rothsa, inženirske ekipe MSRC o napadih na prednalaganje DLL-ja