####################################################################### Luigi Auriemma Applicazione: Vavoom http://www.vavoom-engine.com Versioni: <= 1.19.1 Piattaforme: Windows, DOS, *nix, *BSD ed altre Bugs: A] socket unreachable B] decompression crash Exploitation: remote, versus server and client Data: 26 Mar 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Vavoom e' un motore open source basato sul Doom engine con diverse caratteristiche interessanti. Nonostante il gioco supporti il multiplayer, ancora non e' disponibile un master server per il gioco online. ####################################################################### ======= 2) Bugs ======= --------------------- A] socket unreachable --------------------- Il gioco fa' uso di un socket asincrono tramite il comando FIONREAD. Quando un pacchetto vuoto (lunghezza 0) o piu' grande di 4096 bytes (ossia il massimo supportato dal gioco) viene ricevuto, il gioco continua a vedere sempre lo stesso pacchetto che ritorna 0 o -1 (loop infinito) e quindi nessuno e' piu' in grado di entrare o giocare. L'unico modo per ripristinare la situazione e' restartare il server. ---------------------- B] decompression crash ---------------------- Esiste un buffer-overflow nella gestione dei pacchetti compressi. Ad ogni modo non e' possibile (non ho trovato alcun modo per far cio') sfruttare il bug per eseguire codice malevolo, quindi l'unico effetto e' l'immediata interruzione del programma. Il problema e' causato dall'assenza di controlli sul parametro comprLength passato dall'attacker per specificare e limitare la quantita' di dati da' decomprimere situati nel pacchetto. Il buffer ove vengono decompressi i dati e' packetBuffer.data di 1024 bytes. Da Datagram_GetMessage in source/net_dgrm.cpp: ... uLongf DecomprLength = comprLength; if (uncompress(packetBuffer.data, &DecomprLength, CompressedData, length - NET_HEADERSIZE) != Z_OK) ... ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/vaboom.zip ####################################################################### ====== 4) Fix ====== No fix. Nessuna risposta dagli sviluppatori. UPDATE 27 Mar 2006 The current CVS fixes the bugs. #######################################################################