####################################################################### Luigi Auriemma Applicazione: OpenTTD http://www.openttd.org Versioni: <= 0.4.7 Piattaforme: Windows, *nix, *BSD, Mac ed altre Bugs: A] terminazione del programma attraverso un identificativo di errore troppo grande B] broadcast clients disconnection in multiplayer menu Exploitation: A] remote, contro server e client (in-game) B] remote, contro clients (broadcast) Data: 23 Apr 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== OpenTTD e' un clone open source del vecchio gioco Transport Tycoon Deluxe. Supporta il multiplayer sia in LAN che Internet ed e' seguito da una vasta community. ####################################################################### ======= 2) Bugs ======= ----------------------------------------------- A] program termination through big error number ----------------------------------------------- Sia il client che il server supportano un tipo di comando (PACKET_SERVER_ERROR e PACKET_CLIENT_ERROR) per la visualizzazione di alcuni messaggi di errore predefiniti nella console. Il problema avviene quando un attacker passa un identificativo di errore (un numero a 8 bit) invalido che forza il programma a terminare spontaneamente attraverso l'uso della funzione error(). Il bug e' sfruttabile unicamente in-game quindi l'attacker deve avere accesso al server: nessun banning, deve conoscere la password se e' stata settata ed il server non deve essere pieno. Da strings.c: char *GetStringWithArgs(char *buffr, uint string, const int32 *argv) { uint index = GB(string, 0, 11); uint tab = GB(string, 11, 5); ... if (index >= _langtab_num[tab]) { error( "!String 0x%X is invalid. " "Probably because an old version of the .lng file.\n", string ); } return FormatString(buffr, GetStringPtr(GB(string, 0, 16)), argv, GB(string, 24, 8)); } ------------------------------------------------------ B] broadcast clients disconnection in multiplayer menu ------------------------------------------------------ I clients sono vulnerabili ad un bug quasi innocuo durante la gestione dei pacchetti UDP. I primi 2 bytes di ogni paccheto UDP sono un numero a 16 bit che specifica la grandezza del pacchetto. Se tale numero in un pacchetto ricevuto e' invalido (ad esempio troppo piccolo) il client ritorna immediatamente al menu principale. Questo bug diviene problematico quando un server malevolo visibile nella lista del master server invia pacchetti invalidi in risposta alle query dei clients che vogliono giocare online e che non possono piu' far cio' a causa del continuo ritorno al menu principale. ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/openttdx.zip ####################################################################### ====== 4) Fix ====== L'SVN ed i nightly builds (versioni pre-compilate per diverse architetture) sono stati corretti: http://www.openttd.org/nightly.php Queste nuove versioni (maggiori/uguali a r4531) correggono anche un problema di corruzione dei dati che causa la terminazione del server su alcune macchine quando l'attacker usa un nickname troppo grande (maggiore di NETWORK_CLIENT_NAME_LENGTH). #######################################################################