Prisijunkite prie „Microsoft“
Prisijunkite arba sukurkite paskyrą.
Sveiki,
Pasirinkti kitą paskyrą.
Turite kelias paskyras
Pasirinkite paskyrą, kurią naudodami norite prisijungti.

"Windows Vista" 1 pakeitimų paketo (SP1) palaikymas baigiasi liepos 12 d., 2011. Norėdami toliau gauti "Windows" skirtus saugos naujinimus, įsitikinkite, kad naudojate "Windows Vista" su 2 pakeitimų paketu (SP2). Daugiau informacijos ieškokite šiame "Microsoft" tinklalapyje: nutraukiamas kai kurių "Windows" versijų palaikymas.

Kai taikomoji programa dinamiškai įkelia dinaminių saitų biblioteką (DLL) nenurodant visiškai apibrėžto kelio, "Windows" bando rasti DLL ieškodama gerai apibrėžto katalogų rinkinio. Jei pažeidėjas įgyja vieno iš katalogų valdymą, jie gali priversti taikomąją programą įkelti kenkėjišką DLL, o ne norimą DLL. Šie išpuoliai vadinami "DLL iš anksto įkeltomis atakomis" ir yra įprasti visose operacinėse sistemose, kurios palaiko dinamiškai įkeltos bendrinamos DLL bibliotekas. Tokių atakų efektas galėtų būti tas, kad užpuolikas galėtų vykdyti kodą vartotojo, kuris vykdo taikomąją programą, kontekste. Kai taikomoji programa vykdoma kaip administratorius, tai gali lemti vietinį teisių suteikimo padidėjimą. Žinome apie susidomėjimą šiais išpuoliais. Norėdami apriboti šios problemos poveikį mūsų tarpusavio klientams, mes šį dokumentą pateiksime programuotojams bendruomenėje, kad įsitikintumėte, jog jie žino apie šią problemą ir turi reikiamus įrankius problemai spręsti.

Suvestinė

DLL iš anksto įkelto atakų aprašas

LoadLibrary pagrįstos atakos

Kai taikomoji programa dinamiškai įkelia DLL nenurodant visiškai apibrėžto kelio, "Windows" bando rasti šį DLL, įdėdama iešką tiksliai apibrėžtame katalogų rinkinyje, vadinamame DLL ieškos tvarka. Jei "Windows" randa DLL dll ieškos užsakyme, ji įkels tą DLL. Tačiau jei "Windows" neranda nė vieno iš katalogų dll ieškos užsakyme, ji pateiks DLL įkėlimo operaciją. Toliau pateikiamas " LoadLibrary" ir " Loadlibraryex" funkcijų, kurios naudojamos dinamiškai įkelti DLLs:

  1. Katalogas, iš kurio įkelta taikomoji programa

  2. Sistemos katalogas

  3. 16 bitų sistemos katalogas

  4. "Windows" katalogas

  5. Dabartinis darbinis katalogas (CWD)

  6. Katalogų, įtrauktų į aplinkos kintamąjį PATH



Apsvarstykite šį scenarijų:


  • Taikomoji programa įkelia DLL nenurodant visiškai kvalifikuoto kelio, kurį ji tikisi surasti programos ŠDD.

  • Taikomoji programa visiškai pasiruošusi apdoroti atvejį, kai ji neranda DLL.

  • Pažeidėjas žino šią informaciją apie taikomąją programą ir kontroliuoja CWD.

  • Pažeidėjas kopijuoja savo specialiai sukurtą DLL. Tai reiškia, kad pažeidėjas turi teisę tai daryti.

  • "Windows" ieško katalogų naudodami DLL ieškos tvarką ir randa programos "CWD" DLL.

Šiame scenarijuje specialiai paruošta DLL vykdoma taikomojoje programoje ir įgauna dabartinio vartotojo teises.

Rekomendacija

, kaip išvengti šio išpuolio, programos gali pašalinti dabartinį darbo katalogą (CWD) iš dll ieškos kelio paskambindami SetDllDirectory API naudodami tuščią eilutę (""). Jei programa priklauso nuo to, kaip įkelti DLL iš dabartinio katalogo, įsigykite dabartinį darbo katalogą ir naudokite, kad pereitumėte į visiškai apibrėžtą " LoadLibrary" kelią.



Taip pat žinome, kad kai kurie kūrėjai naudoja LoadLibrary, kad patikrintų, ar konkretus DLL yra pateikti, kad nustatytų, kurią "Windows" versiją valdo vartotojas. Turėtumėte žinoti, kad tai gali padaryti, kad programa būtų pažeidžiama. Jei paveiktoje bibliotekoje tikrai nėra "Windows" leidime, kuriame vykdoma taikomoji programa, pažeidėjas gali įvesti biblioteką tuo pačiu pavadinimu į "CWD". Mes primygtinai rekomenduojame naudoti šią techniką. Vietoj to, naudokite rekomenduojamus metodus, aprašytus MSDN straipsnyje "gauti sistemos versiją."

Taikomoji programa, kuri įkelia trečiosios šalies priedus ir kurios negali priversti priedų naudoti apibrėžtą kelią savo LoadLibrary ragina, turėtų paskambinti SetDllDirectory (""), kad pašalintumėte CWD, tada skambinkite SetDllDirectory ("plugin install location"), kad įtrauktumėte papildinio diegimo katalogą į DLL ieškos kelią.

SearchPath pagrįstos atakos

Panašus išpuolis yra, kai taikomoji programa naudoja "SearchPath" API, kad rastų DLL ir dinamiškai įkels kelią, kurį grąžina searchpath. Toliau pateiktas numatytasis ieškos užsakymas, skirtas SearchPath API:

  • Katalogas, iš kurio įkelta taikomoji programa

  • Dabartinis darbinis katalogas (CWD)

  • Sistemos katalogas

  • 16 bitų sistemos katalogas

  • "Windows" katalogas

  • Katalogų, įtrauktų į aplinkos kintamąjį PATH

Nerekomenduojame šio modelio, nes jis nėra saugus. Nerekomenduojame funkcija SearchPath kaip rasti. dll failą, jei numatyta išvesties paskirtis yra pokalbio funkcija LoadLibrary. Tai gali lemti netinkamo. dll failo buvimo vietą, nes funkcijos SearchPath ieškos tvarka skiriasi nuo ieškos tvarkos, kurią naudoja funkcija LoadLibrary. Jei reikia rasti ir įkelti. dll failą, naudokite funkciją LoadLibrary.

ShellExecute ir CreateProcess


Šių problemų variantai taip pat gali būti, kai kūrėjai iškviečia panašias funkcijas, pvz., ShellExecuteir createprocess, kad įkeltumėte išorinius vykdomąjį. Rekomenduojame, kad kūrėjai būtų atsargūs, kai jie įkelia dvejetainius failus ir nurodo visiškai apibrėžtą kelią. Kai įkeliate dvejetainį vietoj bibliotekos, tai turėtų būti mažiau sudėtinga.

Rekomenduojami programinės įrangos kūrėjams skirti veiksmai

Rekomenduojame, kad kūrėjai atliktų šiuos veiksmus:

  • Patikrinkite savo taikomąsias programas, skirtas nesaugioms bibliotekos apkrovoms (jų pavyzdžiai pateikti toliau šiame straipsnyje). Tai apima šiuos dalykus:

    • Naudodami SearchPath galite nustatyti bibliotekos ar komponento vietą.

    • LoadLibrary naudojimas norint nustatyti operacinės sistemos versiją.

  • Naudokite visiškai atitinkančius kelius, skirtus visiems iškvietimams į LoadLibrary, CreateProcess ir ShellExecute, kur galite.

  • Įgyvendinti raginimus SetDllDirectory su tuščia eilute (""), kad pašalintumėte dabartinį darbinį katalogą iš numatytojo DLL ieškos tvarkos, kur jos reikia. Turėkite omenyje, kad "SetDllDirectory" veikia visas procesas. Todėl turite atlikti vieną kartą proceso inicijavimo pradžioje, o ne prieš ir po kvietimų į LoadLibrary. Kadangi SetDllDirectory paveikia visą procesą, kelių gijų skambinimo SetDllDirectory su skirtingomis reikšmėmis gali būti neapibrėžtos elgsenos priežastimi. Be to, jei procesas skirtas įkelti trečiosios šalies DLLs, reikia atlikti tikrinimą, kad nustatytumėte, ar proceso masto nustatymas sukels nesuderinamumus. Žinoma problema yra ta, kad kai taikomoji programa priklauso nuo "Visual Basic for Applications", visos proceso parametras gali sukelti nesuderinamumus.

  • Naudokite funkciją Setsearchpathmode, kad įgalintumėte saugaus proceso ieškos režimą. Tai perkelia dabartinį darbo katalogą į paskutinę vietą "SearchPath" ieškos sąraše dėl proceso trukmės.

  • Venkite naudoti "SearchPath", kad patikrintumėte, ar yra DLL, nenurodydami visiškai kompetentingo kelio, net jei įjungtas saugos ieškos režimas, nes tai vis tiek gali sukelti DLL išankstinius atakų.

Nurodymai, kaip nustatyti nesaugias bibliotekos apkrovas

Šaltinio kode toliau pateikiami nesaugiųjų bibliotekos apkrovų pavyzdžiai:

  • Šiame kodo pavyzdyje taikomoji programa ieško "schannel.dll" naudodami mažiausią saugią ieškos kelią. Jei pažeidėjas gali įdėti schannel.dll į "CWD", jis bus įkeliamas dar iki programos ieškos "Windows" katalogų atitinkamoje bibliotekoje.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • Šiame kodo pavyzdyje taikomoji programa bando įkelti biblioteką iš įvairių taikomųjų programų ir operacinių sistemų vietų, aprašytų šio dokumento LoadLibrary () skambučiui pradžioje. Jei yra kokių nors pavojų, kad failas nekelia, taikomoji programa gali bandyti įkelti failą iš dabartinio darbinio katalogo. Šis scenarijus yra šiek tiek mažiau pavojingas nei ankstesnis pavyzdys. Tačiau ji vis dar atskleidžia programos vartotoją rizikuoti, jei aplinka nėra visiškai nuspėjama.

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




Toliau pateikiami geresnių ir saugesnių bibliotekos apkrovų pavyzdžiai:

  • Šiame kodo pavyzdyje biblioteka tiesiogiai įkeliama naudojant visiškai apibrėžtą kelią. Nėra jokio pavojaus pažeidėjui įvesti kenkėjišką kodą, nebent jis jau turi rašymo teises į taikomosios programos paskirties katalogą.

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



    Pastaba informacijos, kaip nustatyti sistemos katalogą, ieškokite šiuose šaltiniuose:

    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

  • Šiame kodo pavyzdyje Dabartinis darbinis katalogas pašalinamas iš ieškos kelio prieš skambindami LoadLibrary. Tai labai sumažina riziką, nes pažeidėjas turėtų kontroliuoti taikomųjų programų aplanką, "Windows" katalogą arba bet kokius katalogus, nurodytus vartotojo kelyje, kad būtų galima naudoti DLL įkėlimą.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Visose sistemose, kuriose įdiegtas saugos naujinimas 963027 (aprašyta MS09 – 014), toliau pateiktas kodas visam laikui perkelia į paskutinę vietą ieškos užsakyme. Bet kokie vėlesni ryšiai su funkcija SetSearchPathMode iš šio proceso viduje, kuri bando pakeisti ieškos režimą nepavyks.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Šiame kodo pavyzdyje Dabartinis darbinis katalogas pašalinamas iš ieškos kelio prieš skambindami LoadLibrary. Tai labai sumažina riziką, nes pažeidėjas turėtų kontroliuoti taikomųjų programų aplanką, "Windows" katalogą arba bet kokius katalogus, nurodytus vartotojo kelyje, kad būtų galima naudoti DLL įkėlimą.

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

Proceso monitoriaus naudojimas dinamiškai aptikti nesaugias apkrovas

"Microsoft" publikuoja įrankį, pavadintą proceso monitorius. Šis įrankis leidžia kūrėjams ir administratoriams atidžiai sekti vykdomos proceso veikimą. Proceso monitorius gali būti naudojamas dinamiškai aptikti, ar viena iš jūsų taikomųjų programų gali būti pažeidžiama tokio tipo problema.

  • Norėdami atsisiųsti proceso monitorių, apsilankykite šiame "Microsoft" tinklalapyje:

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

  • Pabandykite paleisti programą naudodami CWD rinkinį į konkretų katalogą. Pavyzdžiui, dukart spustelėkite failą, kuriame yra plėtinys, kurio failų prižiūrėtojas priskirtas jūsų taikomajai programai.

  • Nustatyti proceso monitorių su šiais filtrais:



    Alternatyvusis tekstas

  • Jei pažeidžiamas kelias yra pažeidžiamas, matysite kažką, panašų į šį: Alternatyvusis tekstas

    skambučio į nuotolinį failų bendrinimą, kad ĮKELTUMĖTE dll, rodo, kad tai yra pažeidžiama programa.

Daugiau informacijos

Daugiau informacijos rasite apsilankę šiuose "Microsoft" tinklalapiuose:

dinaminių saitų bibliotekos ieškos tvarka

http://MSDN.Microsoft.com/en-us/library/ms682586 (VS. 85). aspxMSDN dokumentai "SearchPath" funkcijoje

http://MSDN.Microsoft.com/en-us/library/aa365527 (VS. 85). aspxMSDN dokumentai funkcijoje LoadLibrary

http://MSDN.Microsoft.com/en-us/library/ms684175 (VS. 85). aspxMSDN dokumentacija funkcijoje SetDllDirectory

http://MSDN.Microsoft.com/en-us/library/ms686203 (VS. 85). aspxMSDN dokumentai funkcijoje SetSearchPathMode

http://MSDN.Microsoft.com/en-us/library/dd266735 (VS. 85). aspxInterneto dienoraščio skelbimas David LeBlanc, vyriausioji saugumo inžinierius su "Microsoft Office"

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxInterneto dienoraščio skelbimas Andrew Roths, MSRC inžinerijos komanda DLL išankstinio įkrovimo išpuolių

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

Papildomi šaltiniai

Reikia daugiau pagalbos?

Norite daugiau parinkčių?

Sužinokite apie prenumeratos pranašumus, peržiūrėkite mokymo kursus, sužinokite, kaip apsaugoti savo įrenginį ir kt.

Bendruomenės padeda užduoti klausimus ir į juos atsakyti, pateikti atsiliepimų ir išgirsti iš ekspertų, turinčių daug žinių.

Ar ši informacija buvo naudinga?

Ar esate patenkinti kalbos kokybe?
Kas turėjo įtakos jūsų įspūdžiams?
Paspaudus mygtuką Pateikti, jūsų atsiliepimai bus naudojami tobulinant „Microsoft“ produktus ir paslaugas. Jūsų IT administratorius galės rinkti šiuos duomenis. Privatumo patvirtinimas.

Dėkojame už jūsų atsiliepimą!

×