####################################################################### Luigi Auriemma Applicazione: Gamespy cd-key validation SDK http://www.gamespy.net Versioni: precedenti il 20 Novembre 2004 Giochi: a causa dell'implementazione di questo SDK e' difficile testare ed elencare tutti i giochi vulnerabili, comunque la sequente e' la lista ufficiale di giochi che usano i vari SDK di Gamespy (quindi non solo il cd-key SDK): http://www.gamespy.net/partners/ Mentre di seguito c'e' una lista parziale, creata e mantenuta da me, dei giochi che usano il cd-key validation SDK: http://aluigi.org/papers/gshlist.txt Piattaforme: qualsiasi piattaforma supportata Bug: buffer-overflow Exploitation: remoto, contro server (in-game) Data: 10 Dicembre 2004 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Il Gamespy cd-key validation SDK e' un toolkit sviluppato da Gamespy (http://www.gamespy.net) ed e' utilizzato da molti giochi per gestire la verifica delle cd-key online. ####################################################################### ====== 2) Bug ====== Prima di spiegare questo bug e' importante specificare che e' un in-game bug quindi l'attacker deve avere accesso al server vulnerabile e, in questo caso specifico, conoscere il protocollo del gioco od usare un debugger per sfruttare la vulnerabilita', e poi dipende da come gli sviluppatori hanno implementato l'SDK di Gamespy nei loro giochi. Infatti il problema e' un buffer-overflow causato da una stringa di testo inviata dal client al server, quindi un gioco non e' vulnerabile solo se i suoi sviluppatori hanno inserito dei limiti alla lunghezza della stringa ricevuta dal client (ma dubito che qualcuno l'abbia fatto). Dopo aver ricevuto tale stringa, il server chiama la funzione sprintf() per costruire la classica query per la verifica della cd-key: query_length = sprintf( query, "\\auth\\\\pid\\%d\\ch\\%s\\resp\\%s\\ip\\%d\\skey\\%d", pid, // product ID of the game ch, // server challenge resp, // client response <-- la causa del bug! ip, // client IP address skey); // number to track the query La spiegazione dettagliata di questo metodo di autenticazione usato dal Gamespy cd-key validation SDK e' disponibile qui: http://aluigi.org/papers/gskey-auth.txt Il buffer-overflow avviene proprio durante questa istruzione e dopo la query viene codificata per l'invio al master server di Gamespy usando la classica operazione di XOR con la parola "gamespy". ####################################################################### =========== 3) The Code =========== Ho scritto un proof-of-concept solo per il gioco Gore in quanto il suo protocollo e' abbastanza semplice: http://aluigi.org/poc/goregsbof.zip Per gli altri giochi un'idea e' l'utilizzo di un debugger sul client per l'intercettazione della stringa del client da inviare al server, la sua sostituzione con una stringa piu' grande (di circa 512 bytes senza bytes NULL) e poi e' necessario forzare il gioco ad utilizzare tutta la stringa in quanto di solito vengono usati solo 73 bytes. ####################################################################### ====== 4) Fix ====== Il bug e' stato corretto il 19 Novembre 2004, quindi gli sviluppatori dei giochi vulnerabili hanno avuto un sacco di tempo per controllare i loro giochi e patcharli se necessario. #######################################################################