####################################################################### Luigi Auriemma Applicazione: ZIG Game Engine http://zige.sourceforge.net Versioni: Ziglite <= 1.0.0 e CVS <= 24 Jun 2006 (alcuni bugs sono ancora non corretti) anche Zig (1.4.0 e CVS corrente) e' vulnerabile Piattaforme: Windows, *nix, *BSD ed altre Bugs: A] format string bug in console logging B] invalid memory access in getObject C] library termination through throw Exploitation: remoto Data: 06 Jul 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== ZIG Game Engine e' una libreria open source per il gioco multiplayer. E' divisa in due progetti, il principale e piu' aggiornato e' Ziglite mentre l'altro e' Zig (aka ziglib). ####################################################################### ======= 2) Bugs ======= --------------------------------------- A] format string bug in console logging --------------------------------------- La libreria supporta il logging del testo della console. Questa caratteristica e' disabilitata di default e deve essere attivata nel programma principale tramite la funzione enable_log(). L'istruzione che logga l'output della console e' affetta da una vulnerabilita' di tipo format string situata in console.cpp: bool console_c::write_string(const char* outstr) ... // log if (conLogHandle > -1) log(conLogHandle, outstr); ... ------------------------------------- B] invalid memory access in getObject ------------------------------------- La funzione getObject messa a disposizione dalla libreria per la gestione degli oggetti ricevuti dalla rete puo' essere utilizzata per far crashare il programma principale attraverso un code invalido, cosa che porta alla lettura di zone di memoria non valide. Da buffer.cpp: serializable_c *buffer_c::getObject() { //use special functions that can write/read a value from 0 to 32k using only one //byte for values in the range 0..127 (optimization) int code = get32K(); // get the CTypeMaker for this class code //CTypeMaker *maker = CTypeRegister::m_mTypeMaker[ code ]; CTypeMaker *maker = (CTypeRegister::GetTypeMaker())[ code ]; // call "new" and create a new instance for the class serializable_c *objeto = (serializable_c *)maker->CreateNew(); // feed the class with the field values from the buffer objeto->read(*this); return objeto; } ------------------------------------ C] library termination through throw ------------------------------------ L'utilizzo di throw (per l'exception handling) quando un pacchetto e' piu' piccolo della quantita' di dati da leggere causa l'immediata terminazione del programma principale. throw e' utilizzato in tutte le funzioni di lettura dei dati disponibili in buffer.cpp: getByte, getBytes, getShort, getShorts, getLong, getLongs, getFloat, getDouble, getBlock, getString e getDataToSocket. ####################################################################### =========== 3) The Code =========== Proof-of-concept non disponibile ####################################################################### ====== 4) Fix ====== Il bug A e' stato corretto il 25 Jun 2006 nel CVS. Per gli altri bug c'e' da aspettare un po' piu' di tempo in quanto necessitano di profonde modifiche al codice. #######################################################################