Teekide turvaline laadimine DLL-i eellaadimisrünnete vältimiseks

Windows Vista hoolduspaketi Service Pack 1 (SP1) tugi lõpeb 12. juulil 2011. Windowsi turbevärskenduste saamiseks veenduge, et teie arvutis töötaks Windows Vista hoolduspaketiga Service Pack 2 (SP2). Lisateavet leiate microsofti veebilehelt: mõne Windowsi versiooni tugi lõpeb.

Kui rakendus laadib dünaamilise lingiteegi (DLL) dünaamiliselt ilma täielikku teed määramata, proovib Windows DLL-i leidmiseks otsida täpselt määratletud kataloogide komplektist. Kui ründaja saab kontrolli mõne kataloogi üle, võivad nad sundida rakendust laadima DLL-i pahatahtlikku koopiat, mitte dll-i, mida see ootas. Neid ründeid nimetatakse DLL-i eellaadimisrünneteks ja need on levinud kõigis operatsioonisüsteemides, mis toetavad ühiskasutatavate DLL-teekide dünaamilist laadimist. Selliste rünnakute mõju võib olla see, et ründaja saab koodi käivitada kasutaja kontekstis, kes rakendust käitab. Kui rakendust käitatakse administraatorina, võib see põhjustada õiguste kohalike õiguste tõstmist. Me teame, et need rünnakud on taas huvipakkuvad. Selle probleemi mõju piiramiseks vastastikustele klientidele anname selle dokumendi välja arendajate kogukonnale, et olla kindel, et nad sellest probleemist teavad ja et neil on vajalikud tööriistad probleemi lahendamiseks nende rakendustes.

Kokkuvõte

DLL-i eellaadimisrünnete kirjeldus

LoadLibrary-põhised rünnakud

Kui rakendus laadib dünaamiliselt DLL-i ilma täielikku teed määramata, proovib Windows seda DLL-i leida lineaarselt, otsides läbi hästi määratletud kataloogide komplekti, mida nimetatakse DLL-i otsingujärjestuseks. Kui Windows leiab DLL-i otsingujärjestuses DLL-i, laadib see DLL-i. Kuid kui Windows ei leia DLL-i otsingujärjestuse kataloogidest DLL-i, tagastab see DLL-i laadimistoimingu nurjumise. Järgmine on DLL-otsingujärjestus funktsioonide LoadLibrary ja LoadLibraryEx jaoks, mida kasutatakse DLL-ide dünaamiliseks laadimiseks:

  1. Kataloog, kust rakendus laaditi
  2. Süsteemikataloog
  3. 16-bitine süsteemikataloog
  4. Windowsi kataloog
  5. Praegune töökataloog (CWD)
  6. Kaustad, mis on loetletud keskkonnamuutujas PATH

                
Vaatame järgmist näidet.

  • Rakendus laadib DLL-i, määramata täielikku teed, mida rakenduse CWD-s oodatakse.
  • Rakendus on täielikult valmis käsitlema juhtumit, kui ta ei leia DLL-i.
  • Ründaja teab seda teavet rakenduse kohta ja kontrollib CWD-t.
  • Ründaja kopeerib oma spetsiaalselt ette valmistatud DLL-i versiooni CWD-s. See eeldab, et ründajal on selleks õigus.
  • Windows otsib DLL-otsingujärjestuses kataloogide kaudu ja leiab DLL-i rakenduse CWD-st.

Selle stsenaariumi spetsiaalselt ette valmistatud DLL töötab rakenduses ja saab praeguse kasutaja õigused.

Soovitus

Selle rünnaku vältimiseks saavad rakendused praeguse töökataloogi (CWD) DLL-otsinguteelt eemaldada, kutsudes API SetDllDirectory API tühja stringi abil (""). Kui rakendus sõltub DLL-i laadimisest praegusest kataloogist, hankige praegune töökataloog ja kasutage seda, et läbida LoadLibrary täielik tee.

Teame ka, et mõned arendajad kasutavad LoadLibraryt, et kontrollida, kas konkreetne DLL on olemas, et teha kindlaks, millist Windowsi versiooni kasutaja käitab. Peaksite teadma, et see võib muuta rakenduse haavatavaks. Kui mõjutatud teeki windowsi versioonis, kus rakendus käivitatakse, pole tõepoolest olemas, võib ründaja CWD-sse sisse viia samanimelise teegi. Soovitame tungivalt selle tehnika kasutamise vastu. Selle asemel kasutage soovitatud tehnikaid, mida on kirjeldatud MSDN-i artiklis "Süsteemiversiooni hankimine".

Rakendus, mis laadib muude tootjate lisandmooduleid ja mis ei saa sundida lisandmooduleid kasutama oma LoadLibrary kutsete jaoks tingimustele vastavat teed, peaks CWD eemaldamiseks kutsuma nime SetDllDirectory(""), ja kutsuma seejärel setDllDirectory("lisandmooduli installimise asukoht"), et lisada lisandmooduli installikataloog DLL-otsinguteesse.

SearchPathi-põhised rünnakud

Sarnane rünnak ilmneb siis, kui rakendus kasutab SearchPathi API-t DLL-i leidmiseks ja laadib dünaamiliselt SearchPathi tagastatud tee. SearchPathi API vaikeotsingujärjestus on järgmine:

  • Kataloog, kust rakendus laaditi
  • Praegune töökataloog (CWD)
  • Süsteemikataloog
  • 16-bitine süsteemikataloog
  • Windowsi kataloog
  • Kaustad, mis on loetletud keskkonnamuutujas PATH

Me ei soovita seda mustrit, kuna see pole turvaline. Kui väljundi soovitud kasutus on funktsiooni LoadLibrary kutsumisel, ei soovita me .dll faili otsimiseks SearchPathi. See võib põhjustada vale .dll faili leidmise, kuna funktsiooni SearchPath otsingujärjestus erineb funktsiooni LoadLibrary otsingujärjestusest. Kui peate .dll faili üles otsima ja laadima, kasutage funktsiooni LoadLibrary.

ShellExecute ja CreateProcess

Nende probleemide variatsioonid võivad ilmneda ka siis, kui arendajad kutsuvad väliste täitmisfailide laadimiseks sarnaseid funktsioone (nt ShellExecute ja CreateProcess ). Soovitame arendajatel kahendfailide laadimisel olla ettevaatlik ja määrata täielik tee. See peaks teegi asemel binaarfaili laadimisel olema vähem keerukas.

Soovitame arendajatel teha järgmist.

  • Valideerige nende rakendused ebaturvaliste teegikoormuste korral (nende näited on toodud selles artiklis allpool). Nende hulka kuuluvad järgmised failid.

    • SearchPathi kasutamine teegi või komponendi asukoha tuvastamiseks.
    • LoadLibrary kasutamine operatsioonisüsteemi versiooni tuvastamiseks.
  • Kasutage kõiki tingimustele vastavaid teid kõigi loadLibrary, CreateProcessi ja ShellExecute'i kõnede jaoks, kus saate seda teha.

  • Juurutage setDllDirectory kutsed tühja stringiga (""), et eemaldada praegune töökaust DLL-otsingu vaikejärjestusest, kus see on nõutav. Pidage meeles, et SetDllDirectory mõjutab kogu protsessi. Seetõttu peaksite seda tegema üks kord varem protsessi lähtestamisel, mitte enne ja pärast loadLibrary kutseid. Kuna SetDllDirectory mõjutab kogu protsessi, võib mitme erineva väärtusega SetDllDirectory kutsuv lõim põhjustada määratlemata käitumist. Kui protsess on ette nähtud muude tootjate DLL-ide laadimiseks, on vaja testida, et teha kindlaks, kas kogu protsessi hõlmava sätte loomine põhjustab ühilduvust. Teadaolev probleem on see, et kui rakendus sõltub rakendusest Visual Basic for Applications, võib kogu protsessi hõlmav säte põhjustada ühilduvust.

  • Kasutage funktsiooni SetSearchPathMode protsessi jaoks turvalise protsessiotsingu režiimi lubamiseks. See teisaldab praeguse töökausta SearchPathi otsinguloendi viimasesse kohta kogu protsessi jooksul.

  • Vältige SearchPathi kasutamist DLL-i olemasolu kontrollimiseks ilma täielikku teed määramata, isegi kui turvaline otsingurežiim on lubatud, kuna see võib siiski põhjustada DLL-i eellaadimise rünnakuid.

Juhised ebaturvaline teegi koormuse tuvastamiseks

Lähtekoodis on ebaturvaliste teekide laadimise näited järgmised.

  • Järgmises näites otsib rakendus "schannel.dll" vähima turvalise otsingutee abil. Kui ründaja saab paigutada schannel.dll CWD-sse, laaditakse see isegi enne, kui rakendus otsib Windowsi kataloogidest sobiva teegi.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
    
  • Järgmises koodinäites proovib rakendus laadida teeki erinevatest rakenduse ja operatsioonisüsteemi asukohtadest, mida on kirjeldatud selle dokumendi alguses kutse LoadLibrary() jaoks. Kui on oht, et faili pole, võib rakendus proovida laadida faili praegusest töökataloogist. See stsenaarium on eelmisest näitest pisut vähem ohtlik. Siiski seab see rakenduse kasutajale ohtu, kui keskkond ei ole täiesti etteaimatav.

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

                
                
Järgnevalt on toodud näited teegi parematest ja turvalisematest laadimistest.

  • Järgmises näites laaditakse teek otse, kasutades täielikku teed. Ründajal pole ohtu pahatahtlikku koodi kasutusele võtta, kui tal pole juba rakenduse sihtkataloogi kirjutamisõigusi.

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

    Märkus. Süsteemikataloogi määratlemise kohta leiate teavet järgmistest ressurssidest.

    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.aspx

  • Järgmises näites eemaldatakse praegune töökaust enne LoadLibrary kutsumist otsinguteelt. See vähendab märkimisväärselt ohtu, kuna ründaja peaks DLL-i eellaadimisrünnete kasutamiseks kontrollima kas rakendusekataloogi, Windowsi kataloogi või mis tahes kataloogi, mis on määratud kasutaja teel.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
    
  • Kõigis süsteemides, kuhu on installitud turbevärskendus 963027 (kirjeldatud versioonis MS09-014), teisaldaks järgmine kood CWD jäädavalt otsingujärjekorra viimasesse kohta. Kõik selle protsessi käigus funktsiooni SetSearchPathMode kutsumised, mis proovivad otsingurežiimi muuta, nurjuvad.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
    
    
  • Järgmises näites eemaldatakse praegune töökaust enne LoadLibrary kutsumist otsinguteelt. See vähendab märkimisväärselt riski, kuna ründaja peaks DLL-i eellaadimisrünnete kasutamiseks kontrollima kas rakendusekataloogi, Windowsi kataloogi või kasutaja teel määratud katalooge.

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

Protsessimonitori kasutamine ebaturvalise koormuse dünaamiliseks tuvastamiseks

Microsoft avaldab tööriista nimega Protsessimonitor. See tööriist võimaldab arendajatel ja administraatoritel jooksva protsessi käitumist tähelepanelikult jälgida. Protsessimonitori abil saab dünaamiliselt tuvastada, kas mõni teie rakendus võib olla sellisele probleemile haavatav.

  • Protsessimonitori allalaadimiseks külastage järgmist Microsofti veebilehte:
    http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

  • Proovige käivitada rakendus, kasutades CWD määratud kindlat kataloogi. Näiteks topeltklõpsake faili, millel on laiend, mille failiohjur on teie rakendusele määratud.

  • Protsessimonitori häälestamine järgmiste filtritega.

    371495f2-14de-f99c-c55a-f75d31fe9ca8

  • Kui tabab haavatav tee, näete midagi, mis sarnaneb järgmisega: 9acdd1ae-29b9-e499-9de9-8bc665b95e76

     Kaugfailiketta kutsumine DLL-faili laadimiseks näitab, et see on haavatav programm.

Veel teavet

Lisateabe saamiseks külastage järgmisi Microsofti veebilehti:

Dünaamilise lingiteegi otsingujärjestus

http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx MsDN-i dokumentatsioon SearchPathi funktsiooni kohta

http://msdn.microsoft.com/en-us/library/aa365527(VS.85).aspx MSDN-i dokumentatsioon funktsiooni LoadLibrary kohta

http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx MSDN-i dokumentatsioon funktsiooni SetDllDirectory kohta

http://msdn.microsoft.com/en-us/library/ms686203(VS.85).aspx MSDN-i dokumentatsioon funktsiooni SetSearchPathMode kohta

http://msdn.microsoft.com/en-us/library/dd266735(VS.85).aspx Microsoft Office'i peadirektori David Leblanci ajaveebipostitus

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspx MSRC Engineeringi meeskonna Andrew Rothsi ajaveebipostitus DLL-i eellaadimisrünnete kohta

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

Lisaressursid