####################################################################### Luigi Auriemma Applicazione: client/server Doom (csDoom) http://voxelsoft.com/csdoom/ (current maintainer) http://csdoom.sourceforge.net (original author, 2000) Versioni: <= 0.7 Piattaforme: Windows, *nix, *BSD and more Bugs: A] buffer-overflow in SV_BroadcastPrintf B] buffer-overflow in SV_SetupUserInfo C] format string in Printf Exploitation: A] remote, versus server B] remote, versus server C] remote, versus server and client Data: 26 March 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== client/server Doom (csDoom) e' un motore open source per Doom sviluppato da Sergey Makovkin e basato sul codice di ZDoom 1.22. Il gioco e' incentrato sul multiplayer online e l'ultima versione e' stata rilasciata nel lontano 2000. Nel 2004/2005 Denis Lukianov decise di continuare lo sviluppo di questo motore concentrandosi soprattutto sulla rimozione di tutti i bugs che portarono alla morte di questo software. Nonostante sia abbastanza vecchio, questo gioco e' tuttora incluso nel server browser Internet Doom Explorer (IDE, http://nfdfn.jinr.dubna.su/~bond/csdoom/) usato per ricavare la lista di servers online di alcuni motori di Doom. ####################################################################### ======= 2) Bugs ======= ---------------------------------------- A] buffer-overflow in SV_BroadcastPrintf ---------------------------------------- La funzione SV_BroadcastPrintf e' usata dal server per inviare un messaggio a tutti i clients connessi. Per esempio e' utilizzata quando un client entra nel match od invia un messaggio. Il buffer usato per contenere la stringa generata e' composto da 1024 bytes mentre il testo in entrata inviato dall'attacker puo' essere di massimo 2048 bytes (MSG_ReadString) permettendo una possibile esecuzione di codice malevolo. Da doomsv/src/sv_main.cpp: void STACK_ARGS SV_BroadcastPrintf (int level, const char *fmt, ...) { va_list argptr; char string[1024]; client_t *cl; va_start (argptr,fmt); vsprintf (string, fmt,argptr); va_end (argptr); ... -------------------------------------- B] buffer-overflow in SV_SetupUserInfo -------------------------------------- Quando un giocatore entra nel server, invia due stringhe di testo che identificano il suo nickname e teamname. Entrambe queste stringhe (max 2048 bytes, MSG_ReadString) vengono copiate tramite strcpy() in due buffers di 16 bytes. Ad ogni modo questi buffers sono globali, non locali, quindi non dovrebbe essere possibile usare questo bug per eseguire codice malevolo ma solo per crashare il server. Da doomsv/src/sv_main.cpp: void SV_SetupUserInfo(void) { player_t *p; p = &players[parse_cl]; strcpy(p->userinfo.netname, MSG_ReadString() ); strcpy(p->userinfo.team, MSG_ReadString() ); ... -------------------------- C] format string in Printf -------------------------- Sia il client che il server hanno la stessa vulnerabilita' di tipo format string nella funzione PrintString (all'istruzione "printf (outline);") situata in doom*/src/c_console.cpp. Questa funzione e' usata per visualizzare tutte le stringhe di testo nella console e sullo schermo di gioco attraverso la funzione Printf usata ampiamente nel motore. Il flusso di codice che segue dovrebbe essere abbastanza chiaro: int STACK_ARGS Printf (int printlevel, const char *format, ...) { va_list argptr; int count; va_start (argptr, format); count = VPrintf (printlevel, format, argptr); va_end (argptr); return count; } int VPrintf (int printlevel, const char *format, va_list parms) { char outline[8192]; if (gameisdead) return 0; vsprintf (outline, format, parms); return PrintString (printlevel, outline); } int PrintString (int printlevel, const char *outline) { printf (outline); return strlen (outline); } Nota: questo bug venne gia' corretto da Denis nel csDoom client. ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/csdoombof.zip ####################################################################### ====== 4) Fix ====== Tutti i bugs sono stati corretti nella versione corrente (rilasciata ieri) mantenuta da Denis: http://voxelsoft.com/csdoom/ #######################################################################