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