####################################################################### Luigi Auriemma Applicazione: Scorched 3D http://www.scorched3d.co.uk Versioni: <= 39.1 (bf) Piattaforme: Windows, Linux, MacOS, FreeBSD e Solaris Bugs: A] format string e buffer-overflow in addLine e SendString* B] server freeze attraverso numplayers negativo C] ComsMessageHandler buffer-overflow D] vari crash e possibile esecuzione di codice in Logger.cpp Exploitation: remote, versus server Data: 02 Nov 2005 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Scorched 3D e' un gioco multiplayer open source molto conosciuto ed ispirato al vecchio classico Scorched Earth. ####################################################################### ======= 2) Bugs ======= ----------------------------------------------------------- A] format string e buffer-overflow in addLine e SendString* ----------------------------------------------------------- Il gioco e' affetto da diversi format string e buffer-overflow situati "principalmente" nelle funzioni GLConsole::addLine, ServerCommon::sendString* e ServerCommon::serverLog. Tutte queste funzioni utilizzano vsprintf con buffers statici di varia grandezza (come 1024, 2048 e 10000) ed alcune di loro sono chiamate da istruzioni che passato direttamente l'input dell'utente (come messaggi o comand e parametri) direttamente come argomenti di formattazione aprendo il server anche verso attacchi di tipo format string. ----------------------------------------------- B] server freeze attraverso numplayers negativo ----------------------------------------------- I clients di Scorched 3D utilizzano uno strano campo chiamato numplayers utilizzato per creare un numero specifico di giocatori nel server (nonostante il client sia solo uno). Il problema e' nell'utilizzo di un numplayers negativo che innanzitutto bypassa il controllo (di tipo signed) usato nel codice e poi congela il server che entra in un loop quasi infinito situato in ServerConnectHandler.cpp: for (unsigned int i=0; i