####################################################################### Luigi Auriemma Applicazione: Open Cubic Player http://www.cubic.org/player/ http://stian.lunafish.org/coding-ocp.php Versioni: DOS/Windows <= 2.6.0pre6 Linux/*BSD <= 0.1.10_rc5 Piattaforme: DOS, Windows, *nix, *BSD ed altre Bugs: A] buffer-overflow in mpLoadS3M B] buffer-overflow in itload.cpp C] buffer-overflow in mpLoadULT D] double buffer-overflow in mpLoadAMS Exploitation: locale Data: 31 Jul 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Open Cubic Player (OCP) e' un player open source il cui sviluppo e' iniziato nel lontano 1994 ma e' tuttora utilizzato e supportato. ####################################################################### ======= 2) Bugs ======= I programmi (sia il codice originale che il fork per *nix) sono affetti dalle seguenti vulnerabilita': ------------------------------- A] buffer-overflow in mpLoadS3M ------------------------------- Buffer-overflow causato dalla lettura di una enorme quantita' di dati (orders e gli altri valori sono di tipo signed quindi un numero negativo come -1 e' lo stesso di 0xffffffff, e poi naturalmente si possono utilizzare anche i valori positivi fino a 32767) in buffer di soli 256 elementi. Da playgmd/gmdls3m.cpp: extern "C" int mpLoadS3M(gmdmodule &m, binfile &file) ... struct ... short orders,ins,pats,flags,cwt,ffv; ... m.patnum=hdr.orders; ... unsigned char orders[256]; unsigned short inspara[256]; unsigned short patpara[256]; unsigned long smppara[256]; unsigned char defpan[32]; file.read(orders, m.patnum); ... -------------------------------- B] buffer-overflow in itload.cpp -------------------------------- Da playit/itload.cpp: int itplayerclass::module::load(binfile &file) ... unsigned short nords; unsigned short nins; unsigned short nsmps; unsigned short npats; ... unsigned char ords[256]; unsigned long sampoff[100]; unsigned long insoff[100]; unsigned long patoff[200]; file.read(ords, hdr.nords); file.read(insoff, hdr.nins*4); file.read(sampoff, hdr.nsmps*4); file.read(patoff, hdr.npats*4); ... ------------------------------- C] buffer-overflow in mpLoadULT ------------------------------- Da playgmd/gmdlult.cpp: extern "C" int mpLoadULT(gmdmodule &m, binfile &file) ... unsigned char chnn; unsigned char patn; chnn=file.getc(); patn=file.getc(); m.channum=chnn+1; unsigned char panpos[32]; if (ver>=2) file.read(panpos, m.channum); ... -------------------------------------- D] double buffer-overflow in mpLoadAMS -------------------------------------- Qui esistono ben due vulnerabilita', la prima avviene durante la lettura dell'array data nella struttura envs. data e' un array di 64*3 bytes ma il programma permette la lettura di 255*3 bytes causando un buffer-overflow. La seconda vulnerabilita' invece avviene durante la lettura del nome di ogni pattern dove patname e' un buffer di soli 11 bytes che deve contenere i dati dell'attacker che possono raggiungere la lunghezza di 256 bytes. Da playgmd/gmdlams.cpp: extern "C" int mpLoadAMS(gmdmodule &m, binfile &file) ... struct { unsigned char speed; unsigned char sustain; unsigned char loopstart; unsigned char loopend; unsigned char points; unsigned char data[64][3]; } envs[3]; unsigned short envflags; file.read(samptab, 120); for (j=0; j<3; j++) { file.read(&envs[j], 5); file.read(envs[j].data, envs[j].points*3); } ... (second bug) ... namelen=file.getc(); patlen-=3+namelen; char patname[11]; file.read(patname, namelen); ... ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/ocpbof.zip ####################################################################### ====== 4) Fix ====== I bugs verranno corretti nelle prossime versioni. #######################################################################