I media player sono alcuni dei software più facilmente esposti alle vulnerabilità, locali e remoti. Oggi non sono più semplici riproduttori di file mp3: è cosa comune avere un unico programma in grado di leggere diversi formati di file audio e video, di riprodurre contenuti in streaming e di accedere a banche dati esterne. Se teniamo in considerazione l'elevato numero di formati e protocolli supportati, la rapidità con cui spesso i servizi devono essere aggiunti al player e l'estrema varietà dei servizi stessi, è facile capire come non sia affatto raro che vengano scoperte vulnerabilità in software di questo tipo.
La loro diffusione capillare fa sì inoltre che gli exploit scoperti diventino critici a prescindere: sia perché il fatto che gli utenti finali sono spesso persone comuni non "addette ai lavori", sia perché molti dei servizi forniti dai player non si limitano al funzionamento in locale, ma richiedono una connessione a Internet e vi è quindi una certa esposizione ad exploit remoti: pensate semplicemente ai plug-in dei rispettivi player per riprodurre contenuto multimediale all'interno di un browser.
Prima di parlare di alcuni casi reali risalenti alla recente storia dei più celebri e utilizzati media player, è bene spendere qualche parola sul concetto di buffer overflow, un tipo di vulnerabilità molto diffuso e sfruttato. Chi volesse conoscere subito le principali vulnerabilità dei Media player può saltare a pagina 2.
Stack, Heap e Buffer overflow: una premessa tecnica
Si ha un overflow quando tali dati vengono scritti oltre i limiti del buffer stesso, andando a sovrascrivere aree di memoria adiacenti con contenuti non previsti. Le conseguenze di un exploit che sfrutti un buffer overflow sono di svariato tipo: si va dal DoS (denial of service, crash inatteso dell'applicativo), all'esecuzione di codice arbitrario sulla macchina dell'utente che ha lanciato il programma, con i privilegi dell'utente stesso.
Quando un programma viene eseguito le variabili, e quindi i buffer, possono essere allocate in tre diverse zone: un'area per i dati statici, che contiene ad esempio costanti e variabili globali, un'area chiamata stack che contiene le variabili locali e i record di attivazione delle diverse funzioni, e un'area denominata heap che contiene variabili dinamiche, solitamente accedute attraverso puntatori, e alcune informazioni utili alla gestione di questa stessa area di memoria.
Due tipologie di buffer overflow molto diffuse sono i cosiddetti stack overflow e heap overflow, che coinvolgono aree di memoria diverse in modi diversi, pur perseguendo il medesimo scopo e sfruttando il medesimo problema: una stessa area di memoria contiene sia dati sia metadati (informazioni di gestione). Invadendo i secondi con i primi, sfruttando l'assenza dei dovuti controlli sulle dimensioni dei dati in ingresso, è possibile mandare in crash l'applicazione o, nel caso peggiore, mandare in esecuzione codice arbitrario.
Lo stack overflow è basato sul fatto che i record di attivazione delle funzioni contengono l'indirizzo di ritorno alla routine principale; questo significa che, riuscendo a scrivere su tale indirizzo, al termine della funzione il programma eseguirà il codice arbitrario inserito anziché tornare alla routine chiamante. Quello che tipicamente accade, quindi, è quanto segue: nello stack viene memorizzato un buffer dichiarato localmente dalla funzione ora in esecuzione, tale buffer viene riempito con dei dati senza i dovuti controlli, i dati riempiono il buffer e vanno oltre, fino a sovrascrivere l'indirizzo di ritorno con un altro indirizzo. Al termine della funzione, il programma salta a questo indirizzo e inizia ad eseguire una porzione di codice potenzialmente pericolosa.
Lo heap overflow, invece, è basato sul fatto che ogni blocco in cui l'area heap è suddivisa contiene dei metadati particolari: ad esempio puntatori ai blocchi precedente e successivo, dimensione della memoria allocata e un flag che indica se il blocco è in uso o meno. Quando un blocco di memoria in quest'area viene deallocato, il che avviene quando tale flag viene impostato su false, i blocchi liberi adiacenti vengono uniti, mantenendo un solo header di metadati per tutto il blocco di memoria libera. Se la quantità di memoria allocata è statica o corrotta, è possibile che si verifichi un overflow, e che dei dati siano scritti nell'header del blocco di memoria successivo; modificando i metadati ivi contenuti, però, non si può sovrascrivere un'area utilizzata direttamente come indirizzo di salto. Quello che accade è che viene sfruttato il processo di deallocazione descritto in precedenza, impostando quando liberare il blocco il cui header è stato sovrascritto e dove andare dopo la deallocazione stessa, sovrascrivendo ad esempio l'indirizzo di ritorno della routine di deallocazione di memoria (che si troverà sullo stack).
Uno sguardo ad alcuni casi recenti
Come si è detto in apertura, il numero di player presenti e la loro diffusione sono particolarmente elevati, e tutti i discorsi trattati finora riguardo la complessità e quantità dei servizi che offrono e la pericolosità dei buffer overflow valgono potenzialmente per ogni media player, indipendentemente dal produttore e dal sistema operativo su cui girano. E` il momento quindi di fare qualche esempio di vulnerabilità riscontrata e corretta in tempi relativamente recenti, esaminando diversi software, diversi servizi e diversi scenari di funzionamento, per meglio comprendere in che modo i vari aspetti dei media player moderni possano aprirsi a vulnerabilità di vario genere.
Windows Media Player
Iniziamo con uno dei programmi più celebri fra quelli appartenenti alla categoria: Windows Media Player, sviluppato da Microsoft e distribuito assieme a Windows. Nel 2006, nel bollettino MS06-005 viene presentata una vulnerabilità di tipo buffer overflow nella funzione che si occupa di caricare immagini bitmap: aprendo con WMP una bitmap creata ad hoc per sfruttare la vulnerabilità, è possibile lanciare l'esecuzione di codice arbitrario anche da remoto, ad esempio nel caso si acceda a una pagina Web che richiami il player per riprodurre del contenuto.
Nel bollettino MS06-006 si fa invece riferimento al plug-in di WMP per browser differenti da Internet Explorer: l'assenza di controlli adeguati su un buffer consente l'esecuzione remota di codice arbitrario; la vulnerabilità è sfruttabile costruendo un elemento EMBED malformato ad-hoc, dato che il problema è presente nella routine di gestione di tali elementi. Nel 2007, il bollettino MS07-047 descrive un heap overflow presente nel codice di lettura dell'header delle skin per WMP: all'apertura della skin (distribuita in formato WMZ o WMD), opportunamente forgiata per sfruttare il problema, è possibile l'esecuzione di codice arbitrario. Nel medesimo bollettino è descritta un'altra vulnerabilità dagli effetti simili, presente però nel codice di decompressione delle skin.
Nel 2008, il bollettino MS08-054 fa riferimento a un buffer overflow nel codice che gestisce file audio in streaming da un Windows Media Server; visitando una pagina Web appositamente costruita per ospitare un Windows Media Server che riproduca un file audio forgiato ad-hoc, l'esecuzione arbitraria di codice è possibile.
QuickTime e iTunes
Gli utenti Mac OS X non possono non conoscere software come QuickTime e iTunes, sviluppati di Apple e diffusi anche su sistemi Windows. Ha fatto molto discutere il recente aggiornamento, datato settembre 2008, alla versione 7.5.5 di QuickTime, che ha corretto ben otto vulnerabilità critiche. Uno stack overflow e un heap overflow sono presenti nelle funzioni di gestione dei file QTVR (QuickTime Virtual Reality); QTVR è un formato di immagini pensato per la gestione di immagini panoramiche, che consente di visualizzare le scene ruotando la visuale in un panorama ripreso da più punti di vista. Aprendo un file QTVR costruito ad arte, è quindi possibile l'esecuzione arbitraria di codice. Varie vulnerabilità riguardano l'apertura e la gestione di file PICT, un altro formato grafico sviluppato da Apple, anche in questo caso gli effetti rimangono gli stessi: aprendo un file PICT forgiato ad hoc si può ottenere un crash o l'esecuzione di codice arbitrario. Problemi simili sono portati anche dal codec Indeo (un codec video di Intel) e dalla gestione di video codificati in H.264.
Una settimana dopo questo aggiornamento, milw0rm pubblica un exploit zero day in grado di provocare un crash, evidenziando una vulnerabilità di tipo heap overflow potenzialmente critica, dovuta all'assenza di un controllo sulla lunghezza delle stringhe inserite nel parametro <?quicktime type=?>
; il problema è presente anche nel plugin QuickTime per browser Web.
Per quanto riguarda iTunes, l'aggiornamento alla versione 8 corregge due problemi: il primo è l'avvertimento non corretto che abilitare il Music Sharing non ha effetti sull'apertura di un eventuale firewall, il secondo riguarda un driver di terze parti vulnerabile ad un overflow che consente l'esecuzione di codice arbitrario locale. Ai tempi della versione 7, pochi mesi fa, fu scoperta una vulnerabilità di tipo buffer overflow nel codice che gestiva le immagini delle copertine degli album, e l'apertura di un file musicale contraffatto poteva portare all'esecuzione di codice arbitrario o al crash dell'applicativo.
MPlayer
Per quanto riguarda l'ambiente Linux, il media player più celebre, diffuso e utilizzato è senza dubbio MPlayer. Nel novembre 2006, fu divulgata una vulnerabilità di tipo buffer overflow nelle procedure di gestione dello streaming di filmati Real Media attraverso il protocollo RTSP (Real Time Streaming Protocol). Il protocollo RTSP viene utilizzato specificamente per la gestione di contenuto multimediale in streaming, e definisce alcuni comandi di controllo del traffico (play, pause, teardown, ...) da inviarsi in uno scenario client-server. La vulnerabilità in questione consentiva sia di causare un DoS sia di eseguire codice arbitrario da remoto; dato che il nocciolo del problema era in un plugin, non solo MPlayer era da considerarsi vulnerabile, ma anche Xine e potenzialmente altri media player che girassero sotto Linux.
Nel 2008, dopo il rilascio della versione 1.0rc2 del player, altre vulnerabilità sono state segnalate. Core Security Technologies ha rilevato un buffer overflow nel codice che si occupa di processare gli header dei file MOV. Tale formato, molto diffuso e conosciuto essendo il formato di QuickTime, memorizza la descrizione del contenuto multimediale separatamente dal contenuto stesso: la descrizione include metadati come il numero di tracce e il formato di compressione utilizzato. L'assenza di un controllo necessario durante il parsing di questi metadati, consente la creazione di un file MOV malizioso in grado di mandare in esecuzione codice arbitrario da remoto. Musecurity ha successivamente segnalato un heap overflow nel codice utilizzato per il parsing degli URL, che può condurre all'esecuzione di codice arbitrario successiva all'apertura di un URL creato ad hoc, e uno stack overflow nel codice utilizzato per gestire la risposta di un server CDDB, che può condurre all'esecuzione di codice arbitrario inviando al client una risposta CDDB costruita ad hoc. CDDB (Compact Disc DataBase) è una base di dati che contiene svariate informazioni sui CD audio: alcuni tipi di programmi, come appunto i media player, possono accedere ai server CDDB per reperire informazioni come titoli dei brani e degli album; le entry nel database possono essere sovrascritte, quindi una vulnerabilità che coinvolga una risposta CDDB contraffatta - come quella appena descritta - può essere sfruttata anche da un server legittimo.
Più recentemente, a fine estate 2008, oCERT divulga un heap overflow nel codice per il demuxing di file Real; anche in questo caso, la vulnerabilità può essere sfruttata per un DoS o per l'esecuzione arbitraria di codice da remoto, mediante la creazione di un file Real costruito ad arte.
VLC
VideoLAN VLC è forse il media player cross-platform più conosciuto, disponibile per Windows, MacOS X, Linux, e non solo. Ad agosto 2008 viene scoperta una vulnerabilità che porta ad un heap overflow durante l'apertura di un filmato MMS; seguendo un link opportuno su protocollo mmst://, quindi, è possibile mandare in esecuzione codice arbitrario. Un proof of concept è disponibile su milw0rm. La stessa versione del player presentava un secondo pericolo di heap overflow, questa volta durante il parsing di file TTA (True Audio, un codec audio lossless); anche in questo caso milw0rm offre un proof of concept di file TTA che, aperto con VLC 0.9.6i, causa un crash.
Conclusioni
La numerosità e la complessità dei servizi offerti dai media player moderni li rende un tipo di software particolarmente vulnerabile ad attacchi spesso pericolosi. E' quindi importante mantenere sempre aggiornato all'ultima versione il proprio player di fiducia, e scaricare ed installare le eventuali patch rilasciate dagli sviluppatori. Nel caso di vulnerabilità, non rare, che potenzialmente consentano l'esecuzione di codice arbitrario, è bene ricordarsi che tale codice è comunque limitato dai permessi dell'utente con cui il programma è in esecuzione: per questo motivo è sempre buona regola evitare di utilizzare un media player (o qualsiasi altro software applicativo, per gli stessi motivi) mentre si è loggati come utente root o Administrator, dato che i danni che è possibile subire sono in tal caso senz'altro maggiori.