####################################################################### Luigi Auriemma Applicazione: AlsaPlayer http://www.alsaplayer.org Versioni: <= 0.99.76 e CVS corrente Piattaforme: *nix ed altre Bugs: A] buffer-overflow in reconnect's redirection B] buffer-overflow in GTK playlist C] buffer-overflow in cddb_lookup Exploitation: remoto e locale Data: 09 Aug 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== AlsaPlayer e' un media player open source molto conosciuto e sviluppato originariamente per i drivers Alsa. ####################################################################### ====== 2) Bug ====== --------------------------------------------- A] buffer-overflow in reconnect's redirection --------------------------------------------- La funzione che gestisce le connessioni HTTP e' vulnerabile ad un buffer-overflow che avviene quando viene utilizzato sscanf per copiare l'URL del campo Location ricevuto dal server nel buffer redirect di soli 1024 bytes dichiarato in http_open. Da reader/http/http.c: static int reconnect (http_desc_t *desc, char *redirect) { char request [2048]; char response [10240]; ... } else if (rc == 302) { s = strstr(response, "302"); if (s) { //alsaplayer_error("%s", s); s = strstr(response, "Location: "); if (s && redirect) { /* Parse redirect */ if (sscanf(s, "Location: %[^\r]", redirect)) { /* alsaplayer_error("Redirection: %s", redirect); */ } } return 1; } ... ---------------------------------- B] buffer-overflow in GTK playlist ---------------------------------- Un buffer-overflow esiste nelle funzioni che aggiungono elementi alla playlist quando viene utilizzata l'interfaccia GTK (quindi tutte le altre non sono toccate da questo problema): new_list_item e CbUpdated in interface/gtk/PlaylistWindow.cpp. Il miglior modo per sfruttare questo bug e' tramite gli URL che seguono (perfetti, per esempio, se AlsaPlayer e' il player di default del browser web): http://aaaaa(piu'_di_1024_caratteri)aaaaa o http://127.0.0.1/aaaaa(piu'_di_1024_caratteri)aaaaa.mp3 --------------------------------- C] buffer-overflow in cddb_lookup --------------------------------- AlsaPlayer interroga automaticamente il server CDDB specificato nella sua configurazione (freedb.freedb.org di default) quando l'utente sceglie la funzione CDDA per ascoltare gli audio CD. La funzione che interroga il server utilizza un buffer di 20 bytes ed uno di 9 per immagazzinare la categoria e l'ID ricevuti dal server mentre il buffer contenente questa risposta del server e' grande 32768 bytes. Naturalmente per sfruttare questo bug l'attacker deve avere il controllo del server freedb specificato nella configurazione di AlsaPlayer. Da input/ccda/cdda_engine.c: char * cddb_lookup (char *address, char *char_port, int discID, struct cd_trk_list *tl) { int port = atoi (char_port); int server_fd, i, j, n; int total_secs = 0, counter = 0; char *answer = NULL, *username, *filename, categ[20], newID[9]; char msg[BUFFER_SIZE], offsets[BUFFER_SIZE], tmpbuf[BUFFER_SIZE]; char hostname[MAXHOSTNAMELEN], server[80]; ... /* copy the match to the category */ j = 0; while (answer[i] != ' ') categ[j++] = answer[i++]; categ[j++] = '\0'; /* copy the new cdID */ j = 0; i++; while (answer[i] != ' ') newID[j++] = answer[i++]; newID[j++] = '\0'; } ... ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/alsapbof.zip esempi di utilizzo: A] nc -l -p 80 -v -v -n < alsapbof_a.txt B] alsaplayer http://`perl -e 'print "a"x2000'` C] nc -l -p 888 -v -v -n < alsapbof_c.txt ####################################################################### ====== 4) Fix ====== Ho provato a contattare lo sviluppatore alcuni giorni fa' ma sembra che il programma non sia piu' supportato (l'ultima versione risale a tre anni fa'). #######################################################################