
Resoconto
NOTA: Ho segnalato completamente questo bug al team di Freenet e ho collaborato con loro per verificare la loro patch. La patch è ora distribuita nell'ultima versione di Freenet.
Recentemente ho trovato una vulnerabilità di sicurezza in Freenet che potrebbe permettere a un attaccante di de-anonimizzare un target o inviare documenti dannosi attraverso Freenet.
Questa vulnerabilità colpisce gli utenti di Freenet che usano Firefox come browser. Permette la de-anonimizzazione e altri comportamenti dannosi sul computer dell'utente. È presente in tutte le versioni fino alla 1483.
Questo exploit funziona sfruttando un disallineamento tra Firefox e Freenet nella gestione dei tipi MIME. Freenet include filtri per molti tipi di contenuto diversi - è stato investito molto sforzo per garantire che solo contenuti ben formati e senza script possano essere renderizzati senza una serie di avvisi per l'utente.
Freenet generalmente fa un buon lavoro nel gestire i dati come dovrebbe e permette all'utente di specificare se desidera che siano gestiti in altro modo.
Firefox, d'altra parte, è un po' più sfumato nel determinare il tipo MIME di un file. Nello specifico come documentato qui. La maggior parte del processo documentato in questa pagina è al di fuori del controllo di un attaccante, specialmente se deve attaccare attraverso Freenet. Una cosa che è sotto il controllo di un attaccante, tuttavia, è il tipo MIME dei dati che vengono inseriti. Quando i dati vengono inseriti nella rete Freenet, un utente può specificare il tipo MIME - quando questo campo viene lasciato nullo, i dati vengono trattati come application/octet-stream e ricevono tutto il trattamento appropriato riguardo agli avvisi.
Tuttavia, navigando alla sezione HTTP della documentazione di Mozilla, vediamo che Firefox in realtà fa le proprie ipotesi sul tipo MIME dei dati quando certe condizioni non sono soddisfatte dall'applicazione che serve il contenuto. Nello specifico, quando l'header Content-Encoding non viene inviato da un'applicazione, Firefox in realtà annusa il contenuto per decidere cosa farne. Se il primo blocco di dati non è testo, Firefox tratterà il file come il tipo MIME indicato dall'estensione.
Si scopre che Freenet non stava inviando questo header nelle sue risposte, il che ci permette di trasformare questo in qualcosa di utilizzabile. Poiché i nostri dati possono essere inseriti come tipo MIME text/plain, che ovviamente non riceve un filtraggio sofisticato, ma possono essere consegnati come qualunque tipo MIME indicato dall'estensione del file, ora abbiamo un modo per consegnare un documento HTML non filtrato (o PDF, o .docx...). Questo è un grosso problema perché normalmente tutto il contenuto pericoloso viene consigliato per il download in una cartella o spazio temporaneo e aperto al di fuori del browser.
Questo è un breve video dell'exploit in funzione - in questo caso per consegnare un file HTML non filtrato.
Per un esempio funzionante, installa la versione 1483 o precedente e naviga su:
Per chi vuole giocare a casa, puoi ottenere la versione più recente vulnerabile di Freenet qui.
Quindi come potremmo usare questo nel mondo reale?
Si scopre che se colleghi al tuo contenuto malevolo all'interno di Freenet su una pagina già navigata dall'utente, Freenet si assicurerà di trattare il file come il tipo indicato dalla sua estensione. Freenet vedrà che il nostro primo pezzo di dati è binario e avviserà l'utente che il nostro file è malevolo.
:(
Questo significa che se vogliamo che il nostro target visualizzi la nostra pagina malevola con JS, dobbiamo collegarvi esternamente. In realtà va bene, perché i sistemi di messaggistica più popolari di Freenet non operano dal proxy web di Freenet.
Se, per esempio, l'URI demo in questo articolo fosse linkato all'interno di FMS, non ci sarebbe alcun controllo extra e possiamo far eseguire il nostro payload.
Tutto ciò che sarebbe necessario per de-anonimizzare un certo numero di utenti Freenet sarebbe creare contenuti con un titolo interessante, inserire un file con il primo blocco di dati binario e poi creare una pagina web convincente che riporti silenziosamente l'indirizzo IP e l'attività in background. Combina questo con un set di strumenti come il framework BeEF e hai alcune opportunità interessanti.
Possiamo, ovviamente, usare anche questo come vettore per consegnare un PDF malevolo, .docx o altri file e ottenere un punto d'appoggio più permanente sul computer dell'utente.
Risolvere questo bug è abbastanza semplice - d'ora in poi FProxy passerà sempre l'header HTTP Content-Encoding quando consegna contenuto. Questo header dice al browser Firefox di trattare i tipi MIME esplicitamente come definiti da FProxy. Di conseguenza, i dati di tipo text/plain verranno sempre renderizzati come testo semplice e non trattati come nessun altro tipo MIME.
Questo bug è stato, tutto sommato, abbastanza semplice - eppure aveva la capacità di impattare la funzionalità di Freenet in modo significativo. Il controllo dei tipi MIME è davvero importante e una lezione importante da imparare da questo bug è che i tipi MIME non vengono sempre gestiti in modo coerente quando i dati vengono passati da un programma all'altro.
Basta inserire alcuni dati in Freenet con tipo MIME text/plain e il primo blocco contenente solo dati binari. Firefox lo tratterà come il tipo specificato dall'estensione del file e verrà consegnato direttamente all'utente invece di essere filtrato da Freenet. Invia alle tue vittime su FMS o Frost. Raccogli i loro indirizzi IP o convincili a eseguire un payload binario. Profitto!