Fwd: OpenSSH Buffer Management Bug Advisory
Jirka Kosina
jikos na jikos.cz
Středa Září 17 00:27:38 CEST 2003
On Tue, 16 Sep 2003, Martin `MJ' Mares wrote:
> Ve zkratce: v OpenSSH je pomerne zavazny bug v buffer managementu.
> Exploit jsem jeste nevidel, ale je dost mozne, ze se brzy objevi.
> Debian i RH uz maji opravene package, ostatni distribuce jsem zatim
> nesledoval.
Zatim jsem tomu tedy prilis dusevniho usili nevenoval, ale premyslel jste
nekdo nad tim, jak by pripadny exploit mel fungovat? Problem je evidentni:
buffer.c::buffer_appaned_spaces() :
buffer->alloc += len + 32768;
if (buffer->alloc > 0xa00000)
fatal("buffer_append_space: alloc %u not supported",
buffer->alloc);
buffer->buf = xrealloc(buffer->buf, buffer->alloc);
V pripade, ze je podminka v if pravdiva, a spadne to do volani fatal(),
zacnou se dit divy - je pravdepodobne, ze se nekde drive (zalezi na
kontextu, ve kterem byla funkce buffer_append_spaces() volana)
zaregistrovala nejaka callbackova funkce (pomoci fatal_add_cleanup()),
ktera ma slouzit k uklizeni pameti a datovych struktur pri volani fatal()
(ponechme stranou, jestli je toto reseni stastne nebo neni).
Tato uklidova funkce velmi pravdepodobne (existuji v kodu takove cesty)
zavola pro 'uklizeni' bufferu funkci buffer_free():
void
buffer_free(Buffer *buffer)
{
memset(buffer->buf, 0, buffer->alloc);
xfree(buffer->buf);
}
Tady dojde k tomu, ze se tim memsetem() ktery v ni je zapise spousta nul
tam, kde by rozhodne nemely byt - protoze diky nastavovani buffer->alloc
prilis brzo je tato hodnota daleko vetsi, nez je velikost bufferu...ale
neni mi prilis jasne, jak muzu (jinak nez na DoS, protoze to pravdepodobne
nekdy pozdeji sesegfaulti, az se to bude pokusit pristoupit nekam na
nulovou adresu) mohl tyto podminky pouzit ke spusteni sveho kodu, ci
necemu obdobnemu.
--
JiKos.
Další informace o konferenci Linux