Prisiprašėt, šį kartą įrašas bus sudėtingas, bet bandysiu kuo paprasčiau. Tam tikromis programavimo kalbomis (kuriose galima dirbti tiesiogiai su kompiuterio atmintimi, pvz. C/C++) parašytose programose, dėl naudojamų nesaugių programavimo metodų, galima įvykdyti buferio perpildymo pažeidžiamumą. Šio pažeidžiamumo įvykdymo metu, programa priverčiama perrašyti EIP pointerio (jis nurodo procesoriui kokius veiksmus jam atlikti toliau) reikšmę ir nukreipti procesorių į visiškai kitą atminties vietą, kur jau laukia paruoštas žalingas kodas. Procesorius nieko neįtardamas jį įvykdo, nes jam taip rodo EIP pointeris. Štai ir viskas. Aprašiau visą esmę vos keliais sakiniais. Surasti pažeidžiamumą ir parašyti jam exploit‘ą užtrunka kiek ilgiau. Bet buferio perpildymo laikai baigėsi. Atsirado tiek į operacines sistemas įsiūtų apsaugos priemonių, tiek ir programavimo kalbos pasikeitė. Pastarosios, priskiriamos aukšto lygio programavimo kalboms, neleidžia programuotojui su atmintimi dirbti tiesiogiai. Todėl jis nebepalieka tokių klaidų ir buferio perpildymo pažeidžiamumų. Tokios programos veikia tarsi tam tikrame apvalkale ar virtualioje mašinoje. Pvz. JavaScript’as, C# su visu dotNET’u, Java su savo JVM, Flash’as ir t.t. Tokio tipo programų kodas netgi turi savo pavadinimą - "Managed Code", kurį į lietuvių kalbą dar negreitai išvers kalbininkai. Žodžiu, jos tiesiogiai nedirba nei su procesoriumi, nei su kompiuterio atmintimi, nes tarp jų ir procesoriaus yra tarpininkas, tas kiautas, kuris ir sutvarko programuotojų paliktus apsaugos trūkumus.
Atrodytų viskas gražu, bet šį mėnesį išlindo toks bičas iš IBM’o ir sako, kad jis rado būdą kaip perrašyti atmintį ir pakeisti EIP pointerio reikšmę iš "managed" kodo. T.y. priversti pvz. JavaScript’ą pakeisti sekančią instrukciją procesoriui. Ir visa tai jis daro per "NULL dereference" klaidą, kuri iki šiol reikšdavo tik nekorektišką programos veikimą, po kurios ji nulūždavo. Neabejoju, kad esate susidūrę su tokiomis klaidomis, kur viskas ką parodydavo pranešimas, būdavo kas nors panašaus į "null object reference" ir daug nuliukų bei vienas kitas skaičiukas. Programuotojui tai tarsi ženklas, kad jis gauna per didelę algą, dėl ko jis tokias klaidas puola iš karto taisyti (aha, taisiau ir aš, ir ne vieną kartą), kad niekas nespėtų pamatyti.
Ir vis tiek jų lieka. Daug tokių klaidų išlenda, kai ką nors tyčia darai kaip nereikėtų. Atrodo, nulūžo programa ir tuo viskas baigėsi. Bet taip buvo tik iki šiol. Tai va, tas IBM bičas, benagrinėdamas Flash’ą ir jo ActionScript‘ą, surado būdą kaip atliekant tam tikrus veiksmus, perrašyti EIP pointerio reikšmę. Viską jis gražiai aprašė savo dokumente "Application-Specific Attacks: Leveraging the ActionScript Virtual Machine". Kam įdomu ir pasirodys įkandama, tai paskaitysit ir panagrinėsit daugiau patys. Metodas nėra paprastas, ne visuomet išnaudojamas, bet teikia daug vilčių.
Jei parašyti buferio perpildymo exploit’ą yra pakankamai paprasta, tai parašyti exploit’ą tokiam pažeidžiamumui būtų tas pats, kas pereiti išprotėjusią Super Mario Brothers versiją. Bet dažniausiai sunku būna tik pirmą kartą. Antrą jau paprasčiau, o po trijų jau ir visai greitai gaunasi. Kodėl dabar čia tokias kažkokias nesamones rašau? Ogi todėl, kad buferio perpildymo pažeidžiamumas (ir visokios jo atmainos) buvo tikra rakštis s**inėj. Ypač praėjusiam dešimtmetyje. Jeigu dabar išlįs kažkas panašaus, tegu ir sudėtingesnio, tai bus daug "džiaugsmo" visiems. Nespės gamintojai atnaujinimų leisti. Kol kas viso to tik pradžia, pirmas blynas, bet security bendruomenė subruzdusi, apie tai daug šneka ir nagrinėja. Tuoj pradės mokintis aptikti tokio tipo pažeidžiamumus kitur, o tuomet… Na bet čia jau pagyvensim ir pamatysim. Beje, skaitydami tą dokumentą, suprasite kodėl Flash’as ir jo pažeidžiamumai yra blogis.
» Temos: Apie viską
» Žymėtis:
kaip.tik.ten
::
topix.lt
::
del.icio.us

RSS
