####################################################################### Luigi Auriemma Applicazione: Codename Eagle http://global.dice.se/games/codenameeagle/ Versioni: <= 1.42 Piattaforme: Windows Bug: socket irraggiungibile Exploitation: remote, contro server Data: 11 Dicembre 2004 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Codename Eagle e' un bel gioco sviluppato da Refraction Games e distribuito da Take-Two (http://www.take2games.com). E' stato rilasciato alla fine del 1999. ####################################################################### ====== 2) Bug ====== Il gioco utilizza un loop per l'intercettazione e la lettura dei dati dal socket: if(ioctlsocket(sock, FIONREAD, &len) < 0) socket_error(); // errore if(len) { // se len e' diverso da zero // leggi il socket } La funzione ioctlsocket() e' utilizzata per conoscere se nuovi dati sono stati ricevuti dal socket e la loro quantita'. Per esempio, se un client invia un pacchetto UDP di 10 bytes, ioctlsocket() trovera' 10 bytes nella coda del socket cosi' len conterra' 10 e dopo verranno fatte tutte le operazioni necessarie dal momento che len e' diverso da 0. Dopo cio', len continuera' ad essere 0 finche' non verranno ricevuti nuovi dati. Il problema accade quando un attacker invia un pacchetto UDP di 0 bytes infatti len ora conterra' la nuova quantita' di dati ricevuta che e' 0 e quindi il controllo if(len) fallita' e ioctlsocket() ritornera' un len di 0 bytes per sempre dal momento che la coda del socket viene svuotata solo dopo aver chiamato la funzione recvfrom() che pero' e' stata bypassata. ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/ceaglesock.zip ####################################################################### ====== 4) Fix ====== No fix. Il gioco non e' piu' supportato. Ho rilasciato un work-around (e ripeto, solo un work-around) per la versione 1.41/1.42: http://aluigi.org/patches/ceaglesockfix.zip #######################################################################