####################################################################### Luigi Auriemma Applicazione: Sauerbraten engine http://sauerbraten.org Versioni: <= 2006_02_28 e CVS corrente Piattaforme: Windows, *nix, *BSD e MacOS Bugs: A] sgetstr() buffer-overflow B] accesso invalido alla memoria C] crash dei clients tramite mappa invalida D] crash attraverso client non connesso Exploitation: remoto, contro server e clients Data: 06 Mar 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Sauerbraten e' l'evoluzione del Cube engine (http://www.cubeengine.com) sviluppato by Wouter van Oortmerssen, infatti puo' anche essere definito come "Next-Gen Cube" o "Cube 2". Supporta il multiplayer sia via LAN che Internet. ####################################################################### ======= 2) Bugs ======= ---------------------------- A] sgetstr() buffer-overflow ---------------------------- Il gioco utilizza una funzione priva di controlli per la lettura delle stringhe dai dati in ingresso. La funzione e' sgetstr() che si trova in shared/cube.h: #define sgetstr() { char *t = text; do { *t = getint(p); } while(*t++); } Il problema, che affligge sia server che clients, e' che questo codice copia i dati in input oltre il text buffer di dimensione MAXTRANS (5000 bytes) permettendo la possibile esecuzione di codice malevolo. -------------------------------- B] accesso invalido alla memoria -------------------------------- Sia sgetstr(), getint() che le istruzioni che le chiamano non effettuano alcun controllo sulla corretta lunghezza dei dati in input. In breve e' possibile forzare il server od il client a leggere oltre i dati ricevuti raggiungendo zone della memoria non allocate e quindi crashando immediatamente. ------------------------------------------- C] crash dei clients tramite mappa invalida ------------------------------------------- Nel Sauerbraten engine i giocatori hanno la possibilita' di scegliere una mappa specifica su cui giocare, se nel server c'e' solo un giocatore la mappa verra' cambiata istantaneamente altrimenti si andra' alle votazioni. Quando un client prova a leggere una mappa non valida esso esce riportando il messaggio di errore "while reading map: header malformatted". Quando la mappa viene scelta tutti i clients aggiungono l'estensione .ogz al nome mappa e caricano il file. La grandezza massima del nome della mappa e' di 260 bytes e la funzione che carica il file utilizza uno sprintf() sicuro che tronca la stringa (compreso il .ogz) se viene raggiunto il limite. Dopodiche' il caricamente della mappa non e' controllato per evitare possibili attacchi di directory traversal quindi se un attacker (un giocatore) specifica un nome mappa di circa 260 bytes puo' forzare qualsiasi client che entrera' nel server (a causa del problema del voto spiegato precedentemente che limita la sfruttabilita' di questo bug) a caricare qualsiasi file che non sia una mappa valida e quindi usciranno immediatamente. Come gia' detto l'azione dell'exploit avviene con qualsiasi client che entrera' nel server in quanto il nuovo nome mappa sara' attivo nel server fino al successivo match. --------------------------------------- D] crash attraverso client non connesso --------------------------------------- Un client parzialmente connesso puo' facilmente far crashare il server di Sauerbraten. Questo bug e' causato dalla seguente istruzione in engine/server.cpp: int num = ((client *)event.peer->data)->num; In breve quando la connessione va' in timeout il server cerca di visualizzare l'host del client disconnesso ignorando che quest'ultimo non e' mai entrato in gioco. L'effetto e' la lettura di una zona di memoria non allocata. ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/sauerburn.zip ####################################################################### ====== 4) Fix ====== Gli sviluppatori rilasceranno un fix, solo per il solo buffer-overflow, presto. #######################################################################