(delsi) buffer overflow - prunik

Gratz Jaroslav xgratz01 na stud.fee.vutbr.cz
Pátek Srpen 4 11:58:24 CEST 2000


On 3 Aug 2000 uhlar na fantomas.sk wrote:

> Solar designerov patch (http://www.openwall.com/linux/) urobi taku srandu ze
> stranky v pamati na ktorych je zasobnik (teda tie kam sa vacsinou dzubne ten
> vami zadany kod) oznaci ako nespustitelne a procesor pri pokuse o spustenie
> vyvola vynimku. davno som nekukal architekturu 386 a ktosi vravel ze sa to
> robi cez nejaku srandu, zevraj ochrana tohoto nie je v x86 celkom cista a da
> sa obist, v kazdom pripade to odstranuje vacsinu (velku vacsinu) exploitov.

Problem neni v procesoru, ale v prekladaci. x86 nabizi segmentovou ochranu
pameti a u kazdeho segmentu lze nastavit, jestli ma byt citelny,
zapisovatelny a spustitelny (nejdou myslim vsechny kombinace, ale to je
vedlejsi). Jenomze gcc a obecne asi vsechny C prekladace prekladaji
nektere konstrukce tak, ze v prubehu provadeni programu vygeneruji nejaky
kod na zasobnik a ten spusti. Neni to prilis caste, nicmene obcas tak neco
prelozi. Proto musi mit Cckove programy nastaven stack segment jako
executable (nebo se musi stack a instrukcni segment prekryvat).
Resenim by bylo predelat prekladac tak, aby takovy kod negeneroval a potom
by mohl byt stack a datovy segment nespustitelny. To by zabranilo temer
vsem buffer overflow exploitum, ale ne uplne vsem, protoze se porad
prekryvaji datovy a stack segment (kvuli predavani parametru) a pokud by v
programu bylo neco jako

if (podminka) execl("/bin/sh");

dal by se buffer overflowem prepsat zasobnik tak, aby navratova adresa
ukazovala na exec(). A ani by tam nemuselo byt to exec, stacil by nekde v
pameti retezec "/bin/sh" a potom se da stack modifikovat tak, aby se pri
navratu z podprogramu zavolalo exec s parametrem ukazujicim na string
"/bin/sh".

Uplne odstraneni buffer overflow exploitu by slo udelat tak, ze by se
zcela oddelily instrukci, datovy a stack segmenty a pro ucel predavani
parametru by se stack prekryl datovym segmentem pouze pro cteni. Tady je
ale problem v tom, ze zasobnik se pouziva i pro vraceni vysledku pri
navratu z funkce a musel by se tedy pouzit oddeleny datovy prostor pro
predavani parametru z a do funkci.

Tohle vsechno nezpusobuje prakticky zadnou ztratu vykonu, protoze limity
segmentu hlida procesor a pri jejich prekroceni generuje tusim vyjimku GPF
a program u ktereho by se nekdo pokusil o exploit by hned obdrzel SIGKILL.

Result: ochrana proti buffer overflow exploitum by udelat sla, ale musely
by se dost radikalne predelat prekladace, vsechno znovu prelozit a stare
binarky by samozrejme nemusely fungovat. Do toho se nikomu nechce.

Jaroslav Gratz



Další informace o konferenci Linux