(delsi) buffer overflow - prunik
Jaroslav Gratz
xgratz01 na stud.fee.vutbr.cz
Pondělí Srpen 7 20:32:49 CEST 2000
On Mon, 7 Aug 2000, Pavel Kankovsky wrote:
> Dejme tomu, ze mam kod:
>
> void f(char *a) { strcpy(a, "....neco hodne dlouheho..."); }
> void g(char a) { f(&a); }
>
> Zabranite prepsani navratove adresy? Pokud ano, jak to prelozite?
Hmm, tak to mně nenapadlo. Tady tomu nezabráním.
> > To máte pravdu, tady by to nepomohlo. Ale přepsání zásobníku a
> > překrývající se segmenty jsou mnohem nebezpečnější, protože dávají
> > útočníkovi možnost spustit jeho vlastní kód.
>
> Varianty 2 a 3 (ktere jste rafinovane vymazal) ano.
Vzhledem k tomu, že jsem navrhoval oddělit navzájem instrukční, datový a
stack segment, tak ne.
2.
char b[...]; int (*x)() = &y;
/* nebezpecna manipulace s b[] */
(*x)();
Tady sice útočník může přepsat ukazatel na funkci, ale ten musí ukazovat
někam do instrukčního segmentu, kam zase nedostane svůj kód. A datový
segment a segment zásobníku (kam by ten kód dát mohl) nejsou spustitelné.
Takže může spustit "jenom" už existující kód, nikoliv jeho. Samozřejmě i
tohle je zneužitelné.
3.
char b[...]; int *x = &y;
/* nebezpecna manipulace s b[] */
*x = 1;
Tady opravdu nevím, jak to rozumně zneužít. K čemu mi bude, že přepíšu x a
někam do paměti uložím 1? Tím přece přímo nemůžu spustit nějaký kód.
> Nicmene Vami navrhovane reseni bude vzdycky polovicate.
> A polovicatych
> (nikoli v hanlivem smyslu) reseni uz nekolik funkcnich mame: Openwall,
> StackGuard, takze znovuvynalezate kolo.
Asi ano. A vzhledem k tomu, že snad brzo bude na světě Merced (nebo jak se
teď ten 64-bitový procesor vyvíjený v Intelu jmenuje), kde bude zase
všechno jinak, tak se tím teď opravdu asi už nemá význam zabývat.
Jaroslav Gratz
Další informace o konferenci Linux