####################################################################### Luigi Auriemma Applicazione: Quake 3 engine http://www.idsoftware.com Vulnerabili: - Call of Duty <= 1.5 - Call of Duty: United Offensive <= 1.51 - Quake III Arena <= 1.32 - Return to Castle Wolfenstein <= 1.41 - Soldier of Fortune II: Double Helix <= 1.03 - Star Wars Jedi Knight II: Jedi Outcast <= 1.04 - Star Wars Jedi Knight: Jedi Academy <= 1.0.1.0 - Wolfenstein: Enemy Territory <= 1.02 / 2.56 ... probabilmente altri "Salvi": - Medal of Honor: Allied Assault (nessun effetto) - Medal of Honor: Breakthrough - Medal of Honor: Spearhead - Star Trek Voyager: Elite Force (solo attacker) - Star Trek: Elite Force II (solo crash attacker) - Wolfenstein: Enemy Territory 2.60 (patchato) Piattaforme: Windows, Linux e Mac Bug: errata gestione dei commandi/messaggi troppo grandi Exploitation: remoto, contro clients (in-game) Data: 02 Apr 2005 Autore: sconosciuto, il bug mi e' stato segnalato da un admin del gioco Return of Castle Wolfenstein Advisory: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Il motore di Quake 3 e' il famoso motore di gioco sviluppato da ID Software (http://www.idsoftware.com) ed utilizzato da molti giochi. ####################################################################### ====== 2) Bug ====== Questo problema e' abbastanza conosciuto da molto tempo (oltre un anno) nelle comunita' dei giochi Return to Castle Wolfenstein ed Enemy Territory e quest'ultimo al momento e' anche l'unico ad avere una patch ufficiale rilasciata qualche settimana fa'. Un interessante spiegazione di questo bug ed un metodo per correggerlo modificando il codice sorgente dei giochi vulnerabili (SDK) e' disponibile qui: http://bani.anime.net/banimod/forums/viewtopic.php?p=27322 In breve il problema e' nel modo in cui il motore gestisce i comandi lunghi piu' di 1022 caratteri, infatti essi vengono automaticamente troncati a questa misura ed il resto dei caratteri viene gestito come se fossero dati di rete confondendo il motore. Se un attacker entra in un server ed invia un messaggio molto grande, qualsiasi client nel server si disconnettera' automaticamente mostrando l'errore "CL_ParseServerMessage: Illegible server message". In alcuni giochi od alcune loro vecchie versioni puo' accadere che anche il server crashi, cio' non e' causato da questo bug ma da altri spiegati in questi advisory: http://aluigi.org/adv/jamsgbof-adv-ita.txt http://aluigi.org/adv/codmsgboom-adv-ita.txt Solo in Soldier of Fortune II avviene il crash dei clients invece della loro semplice disconnessione ma il gioco supporta solo il comando vsay_team e quindi solo i giocatori nello stesso team dell'attacker crasheranno. Il problema e' in-game quindi l'attacker deve avere accesso al server, se esso e' protetto da password e non conosce la parola chiave od il suo IP/guid e' stato bannato lui non puo' sfruttare il bug. ####################################################################### =========== 3) The Code =========== - scarica il seguente file: http://aluigi.org/poc/q3msgboom.cfg - salvalo nella directory di base del gioco (come baseq3, etmain, main, base e cosi' via) - avvia un client ed un server o, se possibile, piu' clients in modo da testare meglio gli effetti del bug - partecipa alla partita sul server - vai nella console di un client (tasto ~ o shift + ~) - digita: /exec q3msgboom - qualsiasi client nel server si disconnettera' automaticamente. Se non avviene nulla od il comando vsay non e' supportato, modifica il file q3msgboom.cfg utilizzando altri comandi come say o vsay_team. Jedi Knight II necessita' che lo script venga eseguito alcune volte prima di vedere gli effetti. ####################################################################### ====== 4) Fix ====== Al momento solo Enemy Territory 2.60 e' corretto in modo ufficiale. Ho provato diverse volte nelle ultime settimane a trovare un metodo universale per correggere il bug ma senza fortuna, infatti il metodo suggerito da Banimod (http://bani.anime.net/banimod/forums/viewtopic.php?p=27322) e' ok ma richiede la ricompilazione dell'SDK (ove disponibile). Ad ogni modo la funzione da modificare e' contenuta nel codice "game" (il nome di una specifica porzione del motore) che alcuni giochi hanno compilata come una DLL mentre altri come un file QVM (difficile da correggere e zippato nei files pk3) ed il pattern binario della funzione cambia molto da gioco a gioco soprattutto perche' e' il valore di G_SEND_SERVER_COMMAND a cambiare, quindi un fix binario basato sulla suddetta patch non e' possibile. #######################################################################