(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