####################################################################### Luigi Auriemma Applicazione: Armagetron http://armagetron.sourceforge.net Armagetron Advanced http://armagetronad.sourceforge.net Versioni: Armagetron <= 0.2.6.0 Armagetron Advanced <= 0.2.7.0 Piattaforme: multipiattaforma (Windows, Linux ed altri) Bugs: A] crash causato da un descriptor ID troppo grande B] crash causato da un claim_id troppo grande C] socket irraggiungile tramite pacchetto vuoto D] blocco temporaneo causato da fake players Exploitation: remoto, contro il server Data: 10 Feb 2005 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Armagetron e' il ben noto gioco opensource sviluppato da Manuel Moos e ampiamente giocato online da molte persone. Recentemente il progetto Armagetron (arrivato alla versione 0.2.6.0) e' stato dichiarato "morto" ed il suo successore non ufficiale e' Armagetron Advanced. ####################################################################### ======= 2) Bugs ======= -------------------------------------------------- A] crash causato da un descriptor ID troppo grande -------------------------------------------------- Il gioco utilizza un array di 400 descrittori, ma i clients possono passare i loro descriptor ID utilizzando numeri a 16 bits (quindi fino a 65535). In breve un pacchetto con un descriptor ID maggiore di 400 puo' crashare il server a causa di un accesso ad una zona di memoria dell'array che non e' allocata. --------------------------------------------- B] crash causato da un claim_id troppo grande --------------------------------------------- Proprio come il bug descritto precedentemente, esiste un problema nella chiamata della funzione ANET_AddrCompare() dove viene passata la struttura peers (un array di 18 elementi) che punta ad un numero di 16 bits passato dal client alla fine del proprio pacchetto. ----------------------------------------------- C] socket irraggiungile tramite pacchetto vuoto ----------------------------------------------- Il gioco utilizza i sockets asincroni attraverso l'utilizzo di FIONREAD che fornisce il numero di bytes ricevuti nell'ultimo pacchetto (0 se non ce ne sono di nuovi). Se il server riceve un pacchetto UDP vuoto continuera' a controllare la coda del socket all'infinito in quanto ci sono ancora 0 bytes e nel frattempo non potra' gestire gli altri pacchetti quindi tutti i clients verranno disconnessi automaticamente da esso. La situazione ritorna normale solo dopo che inizia una nuova mappa e, quindi, il socket viene ricreato. -------------------------------------------- D] blocco temporaneo causato da fake players -------------------------------------------- Semplice, il server ed ogni client ad esso connesso si bloccano completamente se ci sono troppi giocatori che entrano nel server ma non inviano dati (time out). Quindi un attacker puo' riempire il server di fake players e quando parte una nuova mappa (le gare su Armagetron sono abbastanza brevi) nessuno sara' capace di giocare sul server. ####################################################################### =========== 3) The Code =========== A, B, C] http://aluigi.org/poc/atronboom.zip D] http://aluigi.org/fakep/atronfp.zip ####################################################################### ====== 4) Fix ====== No fix. Ho riportato i bugs A e B all'autore molti mesi fa' ma poi ho perso qualsiasi contatto con lui. Ho inviato una mail a due dei nuovi programmatori del progetto Armagetron Advanced spiegando tutti i bugs ma non ho ricevuto riposta. #######################################################################