Puhvri ületäitumise rünnakud ja vastumeetmed

From ICO wiki
Jump to navigationJump to search

Autor

Heidi Olesk AK31
Kasutasin oma töös põhiliselt Wikipediast võetud ingliskeelset artiklit puhvri ületäitumise kohta.

Sissejuhatus

Puhvri ületäitumist (Buffer Overflow) peetakse Interneti üheks tõsisemaks rünnakuliigiks. Taolisi rünnakuid kasutavad häkkerid sageli kasutaja andmete varastamiseks ja kogu arvuti üle kontrolli saavutamiseks. Lühidalt öeldes tekib puhvri ületäitumine olukorras, kus pahalane saadab liiga palju andmeid puhvrisse ja programm ei kontrolli selle seisundit. Enamus rakendusprogrammidel on fikseeritud suurusega puhvrid andmete hoidmiseks.

Põhimõisted

Puhver mäluosa ajutiseks infosalvestuseks. Näiteks brauser kasutab veebilehekülgede ja nende osade (piltide) ajutiseks hoidmiseks.

Pinu (stack) on andmestruktuur, millest kõigepealt võetakse viimati salvestatud andmeelement. Piltlik võrdlus mündihoidjaga, mille põhjas on vedru ning millesse saab münte lisada vaid pealtpoolt ja et pealt münt kätte saada, tuleb kõigepealt välja võtta pealmine st viimati lisatud münt. [3]

big-endian - jämedaotsaline baitide järjekord andmestringis, kus kõige suurema kaaluga bait on salvestatud kõige esimesena ja selle aadressnumber on kõige väiksem ehk arvu hakatakse lugema kõige „jämedamast“ baidist. [4]

Puhvri ületäitumise tekkepõhjused

Arvutiturbes ja programmeerimises on puhvri ületäitumine või puhvri ülejooksmine anomaalia, kus protsess salvestab andmed puhvrisse väljapool seda mälu, mida programmeerija tegelikult ette pole näinud. Lisaandmed kirjutavad üle lähedal oleva mälu, mis võib sisaldada teisi andmeid, sealhulgas programmi muutujaid ja programmi voo kontrolli andmeid. See võib põhjustada ebanormaalset programmi käitumist sisaldades mälu pöördumise vigu, vääraid tulemusi, programmi töö lõpetamist või turvasüsteemist läbumurdmist. Puhvri ületäitumine tekib siis, kui andmed on puhvrisse kirjutatud ja andmete kirjutamise piirid ei ole kontrollitud, nii rikutakse andmete väärtused külgnevates mäluosades. Põhiliselt juhtub see char stringide ühest puhvrist teise kopeerimisel. Puhvri ületäitumised võivad olla põhjustatud nendest sisenditest, mis on disainitud koodi täitma. Taolisi tegevusi peetakse põhilisteks tarkvara nõrkusteks, mida võidakse pahatahtlikult ära kasutada. Piiride kontrollimine võib ära hoida puhvri ületäitumise. Programmeerimiskeeltest seostatakse puhvri ületäitumisega just selliseid vaba süntaksiga keeli nagu C ja C++ , kuhu ei ole sisse ehitatud andmete ülekirjutamise või pöördumiste vastast kaitset ükskõik millistele mälu osadele. Üpris sageli tekib taoline olukord, kui programmeerija ei ole viitsinud teha sisendandmete kontrolli.

Näited

Järgmises näites on programmis defineeritud 2 andmeühikut, mis on mälus kõrvuti. 8-baidine stringi puhver A ja 2-baidine integer väli B. Algselt ei sisalda A midagi ja B sisaldab numbrit 1979. Characterid on 1 bait laiad

variable name A B
value [null string] 1979
hex value 00 00 00 00 00 00 00 00 07 BB

Kui programm üritab salvestada null-lõpetatud stringi „excessive“ puhvrisse A, siis ebaõnnestunud stringi pikkuse kontrollimine viib selleni, et B väärtus kirjutatakse üle, sest A väljale oli 1 baidi võrra rohkem mälu vaja kui algselt planeeritud oli.

variable name A B
value 'e' 'x' 'c' 'e' 's' 's' 'i' 'v' 25856
hex 65 78 63 65 73 73 69 76 65 00

Ehkki programmeerija ei ole kavatsenud üldse B väärtust välja vahetada, on B väärtus nüüd asendatud numbritega, millele on kuju andnud char stringi viimane osa. Selles näites on väärtus toodud big-endian (vt mõiste selgitust ülal) süsteemis, mis kasutab ASCII-d, „e“-le järgneb null byte-i, mis muutub numbriks 25856. Kui B oli ainuke väärtustatud muutuja, mis programmi poolt oli defineeritud, siis kirjutades veel pikema stringi, mis läks B lõppu, võib tekkida selline error nagu segmenteerimise viga ja seejärel protsess lõpetatakse.

Ohtlike funktsioonide näited:

strcpy(char *dest, const char *src)
dest ületäitumine

! strncpy
strcat(char *dest, const char *src)
dest ületäitumine

! strncat
getwd(char *buf)
buf ületäitumine

! getcwd
gets(char *s)
s ületäitumine

! fgets
[vf]scanf(const char *format, ...)
argumentide ületäitumine

! argumentide max pikkused mustrisse
[v]sprintf(char *str,
const char *format, ...)
str ületäitumine
! [v]snprintf

Vastumeetmed

Memory Firewall Comodo Groupilt, mis pakub laiaulatuslikke turvalahendusi arvutitele. Comodo Memory Firewall on väike, aga tõhus programm, mis nii ennetab kui ka kaitseb puhvri ületäitumise probleemi. Sisaldub Comodo Internet Security paketis, kuid kes kasutavad teiste tootjate turvalahendusi, võivad Comodo Memory Firewalli arvutile täiendavaks kaitseks tirida. Comodo firma ei ole ainult omakasu peal väljas st praktiliselt iga tasulise versiooni kõrval pakutakse ka tasuta versiooni. Proovi siit: Media:http://personalfirewall.comodo.com/

Kasutatud kirjandus:

[1] http://www.arvutiturve.wordpress.com/2009/11/01/puhvri-uletaitumine-buffer-overflow/
[2] http://math.ut.ee/~mroos/turve/2001/prog_c_4.pdf
[3] http://www.vallaste.ee/index.htm?Type=UserId&otsing=2864
[4] http://vallaste.ee/index.htm?Type=UserId&otsing=6573