È stata identificata una vulnerabilità critica nella rete di distribuzione dei contenuti cdnjs fornita da Cloudflare, progettata per accelerare la consegna delle librerie JavaScript, che consente l'esecuzione di codice arbitrario sui server CDN. Il rischio del problema è aggravato dal fatto che circa il 12,7% di tutti i siti web su Internet utilizza il servizio per caricare librerie JavaScript, e il compromesso dell'infrastruttura consente di sostituire le librerie fornite da ciascuno di questi siti.
Il servizio cdnjs carica pacchetti da Git o dal repository NPM, per poi consentire a qualsiasi sito di utilizzare gratuitamente la rete di distribuzione dei contenuti di Cloudflare per accelerare il caricamento delle librerie JavaScript. Analizzando il codice dei componenti cdnjs pubblicati su GitHub, è stato scoperto che per estrarre i pacchetti NPM dagli archivi tgz viene utilizzato il modulo standard archive/tar in Go, che restituisce l'elenco dei file così com'è, senza normalizzare i percorsi. Nel caso in cui lo script estragga il contenuto in base all'elenco restituito, la presenza di file nel formato «..\/..\/..\/..\/..\/..\/..\/tmp\/test» nell'archivio può portare alla sovrascrittura di file arbitrari nel sistema, a seconda dei diritti di accesso.
Si ipotizza che un attaccante possa presentare una richiesta per aggiungere una propria libreria a cdnjs e caricare nel repository NPM un archivio appositamente formattato, contenente file con caratteri «..\/» nel percorso. Sui server cdnjs viene periodicamente eseguita l'operazione di «autoupdate», durante la quale l'elaboratore carica nuove versioni della libreria proposta ed estrae il contenuto. Utilizzando file con percorsi «..\/», l'attaccante può raggiungere la sovrascrittura dei file dello script del servizio e l'esecuzione del proprio codice su server su cui è avvenuta l'estrazione.
Nel caso di caricamento di aggiornamenti da Git, è stato scoperto che l'elaboratore degli aggiornamenti non considerava i link simbolici durante la copia dei file da Git. Questa caratteristica consentiva di organizzare la lettura di qualsiasi file con server attraverso l'aggiunta di link simbolici in Git.
Gli esperimenti con la dimostrazione dell'hacking di cdnjs per ottenere un premio su HackerOne sono stati avviati iniziando a testare un'ipotesi relativa alla lettura dei file. È stato aggiunto un collegamento simbolico test.js al repository Git della libreria JavaScript fornita tramite CDN, puntando al file /proc/self/maps. Dopo la pubblicazione di una nuova versione della libreria, il gestore degli aggiornamenti ha elaborato questo repository e ha pubblicato il file specificato in cdnjs (test.js è stato creato come collegamento simbolico e quando veniva richiesta questo file, veniva restituito il contenuto di /proc/self/maps).
Sostituendo il collegamento simbolico al file /proc/self/environ, l'autore della ricerca ha notato che i dati restituiti contenevano i valori delle variabili ambientali GITHUB_REPO_API_KEY e WORKERS_KV_API_TOKEN. La prima variabile conteneva la chiave API per l'accesso con permessi di scrittura al repository robocdnjs su GitHub. Nella seconda variabile era presente un token per lo storage KV in cdnjs. Sfruttando queste informazioni, l'attaccante poteva apportare modifiche a cdnjs e compromettere completamente l'infrastruttura.
Fonte: opennet.ru
