####################################################################### Luigi Auriemma Applicazione: OpenMPT (aka MODPlug Tracker) http://modplug.sourceforge.net http://www.modplug.com libmodplug http://modplug-xmms.sourceforge.net Versioni: OpenMPT <= 1.17.02.43 e SVN corrente libmodplug <= 0.8 e CVS corrente Piattaforme: Windows *nix, *BSD, XMMS plugin ed altri Bugs: A] various global buffer overflows in ReadITProject B] heap overflow in ReadSample Exploitation: locale Data: 09 Aug 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== MODPlug Tracker, e naturalmente la sua piu' recente versione open source OpenMPT, e' uno dei piu' tracker musicali piu' interessanti con in piu' anche il supporto a tantissimi tipi di moduli. libmodplug invece e' una libreria per Linux creata dal codice sorgente di OpenMPT ed e' usata principalmente per il plugin ModPlug-XMMS. ####################################################################### ======= 2) Bugs ======= --------------------------------------------------- A] various global buffer overflows in ReadITProject --------------------------------------------------- Tutti i campi di testo nei file ITP non sono adeguatamente verificati quindi e' possibile causare dei buffer-overflow delle variabili globali attraverso questa funzione con la possibilita' di eseguire codice malevolo (confermato nei miei test). Nota: i file ITP non sono supportati in libmodplug Da soundlib/Load_it.cpp: BOOL CSoundFile::ReadITProject(LPCBYTE lpStream, DWORD dwMemLength) { ... // Song name // name string length memcpy(&id,lpStream+streamPos,sizeof(DWORD)); len = id; streamPos += sizeof(DWORD); // name string memcpy(&m_szNames[0],lpStream+streamPos,len); streamPos += len; ... (other overflows) ... ------------------------------ B] heap overflow in ReadSample ------------------------------ In alcuni moduli la funzione ReadSample puo' essere utilizzata per causare un heap overflow attraverso un nLength invalido. Come si vede dal codice che segue, nLength viene incrementato di 6 bytes (mem) e in alcuni casi anche moltiplicato per due, il valore finale e' poi usato per allocare pIns->pSample (FYI AllocateSample alloca "(nbytes + 39) & ~7" e ritorna il puntatore piu' 16). Un attacker, dopo aver forzato il programma ad allocare 0 bytes, avra' la possibilita' di causare un heap overflow attraverso le istruzioni memcpy che copieranno (cio' dipende da nFlags) tutti i bytes rimanenti nel file. Il modulo migliore da utilizzare per sfruttare la vulnerabilita' sembra essere AMF. Da soundlib/Sndfile.cpp: UINT CSoundFile::ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength) //------------------------------------------------------------------------------------------------ { UINT len = 0, mem = pIns->nLength+6; if ((!pIns) || (pIns->nLength < 4) || (!lpMemFile)) return 0; if (pIns->nLength > MAX_SAMPLE_LENGTH) pIns->nLength = MAX_SAMPLE_LENGTH; ... if ((pIns->pSample = AllocateSample(mem)) == NULL) ... default: len = pIns->nLength; if (len > dwMemLength) len = pIns->nLength = dwMemLength; memcpy(pIns->pSample, lpMemFile, len); } ... ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/mptho.zip ####################################################################### ====== 4) Fix ====== Una nuova versione sara' rilasciata a breve #######################################################################