(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