####################################################################### Luigi Auriemma Applicazione: NeoEngine http://www.neoengine.org Versioni: <= 0.8.2 and CVS 3422 Piattaforme: Windows, *nix, *BSD and more Bugs: A] visualization format string B] crash caused by failed allocation Exploitation: remoto Data: 27 Jun 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== NeoEngine e' un motore di gioco open source rilasciato sotto la licenza MPL. ####################################################################### ======= 2) Bugs ======= Diversamente dal mio modo solito di operare i bugs che seguono non sono stati testati in pratica a causa dell'assenza di un programma funzionante da utilizzare per i miei test, come ad esempio un server minimale, e dalla mancanza di feedback dagli sviluppatori. ------------------------------ A] visualization format string ------------------------------ Le funzioni di visualizzazione utilizzate nel NeoEngine sono affette da alcune vulnerabilita' di tipo format string causate dall'assenza dell'argomento indicante il formato dei dati: Da neoengine/console.cpp: bool Console::Render( Frustum *pkFrustum, bool bForce ) ... m_pkFont->Printf( m_iX + m_iWidth - 2, m_iY + iHeight, strCmd.c_str() ); ... m_pkFont->Printf( m_iX + 4, m_iY + iHeight, strCmd.c_str() ); ... Da neowtk/textarea.cpp: bool TextArea::Render( Frustum *pkFrustum, bool bForce ) ... if( !m_bPassword ) m_pkFont->Printf( kPos.x + m_kPadding.x, kPos.y + m_kPadding.y, m_strText.c_str() ); else m_pkFont->Printf( kPos.x + m_kPadding.x, kPos.y + m_kPadding.y, string( m_strText.length(), '*' ).c_str() ); ------------------------------------ B] crash caused by failed allocation ------------------------------------ E' possibile causare il crash del motore attraverso un uiMessageLength (numero a 32 bit) troppo grande che porta all'assegnamento di NULL al puntatore pucMessage ed alla conseguente lettura di dati dal socket senza pero' verificare il valore di ritorno di Read. Da neonet/core.cpp: void Core::Receive() ... unsigned int uiMessageLength; ... if ( pkTCPSocket->Read( &uiMessageLength, sizeof( unsigned int ) ) <= 0 ) ... char *pucMessage; pucMessage = ( char* )malloc( uiMessageLength + 1 ); if ( uiMessageLength > 0 ) { pkTCPSocket->Read( pucMessage, uiMessageLength ); } pucMessage[ uiMessageLength ] = 0; Message *pkMessage = pkMessageTemplate->Deserialize( string( pucMessage, uiMessageLength ) ); free( pucMessage ); ####################################################################### =========== 3) The Code =========== Proof-of-concept non disponibile. ####################################################################### ====== 4) Fix ====== No fix. Ho contattato l'autore un mese fa' ma dopo una risposta iniziale non ho ricevuto piu' altre notizie. #######################################################################