Vulnerabilità nei cdnj che consentiva l'esecuzione di codice sui server Cloudflare

È stata identificata una vulnerabilità critica nella rete di distribuzione dei contenuti cdnjs di Cloudflare, progettata per accelerare la consegna delle librerie JavaScript, consentendo l'esecuzione di codice arbitrario sui server CDN. La pericolosità del problema è aggravata dal fatto che circa il 12.7% di tutti i siti su Internet utilizza il servizio per scaricare le librerie JavaScript e la compromissione dell'infrastruttura rende possibile la sostituzione delle librerie fornite da uno qualsiasi di questi siti.

Il servizio cdnjs scarica i pacchetti da Git o da un repository NPM, dopodiché consente a qualsiasi sito di utilizzare gratuitamente la rete di distribuzione dei contenuti Cloudflare per accelerare il caricamento delle librerie JavaScript. Studiando il codice dei componenti cdnjs pubblicato su GitHub, è emerso che per decomprimere i pacchetti NPM negli archivi tgz viene utilizzato il modulo standard archive/tar in linguaggio Go, che produce un elenco di file così com'è, senza normalizzare i percorsi . Nel caso in cui lo script scompatta i contenuti in base all'elenco fornito, la presenza nell'archivio di file come “../../../../../../../tmp/test” può portare alla sovrascrittura di file arbitrari nel sistema, per quanto consentito dai diritti di accesso.

È stato suggerito che un utente malintenzionato potesse richiedere di aggiungere la sua libreria a cdnjs e caricare un archivio appositamente progettato contenente file con i caratteri "../" nel percorso del repository NPM. Sui server cdnjs viene periodicamente eseguita un'operazione di "autoupdate", durante la quale il gestore scarica le nuove versioni della libreria proposta e ne scompatta i contenuti. Utilizzando file con percorsi "../", un utente malintenzionato può sovrascrivere file con script di servizio ed eseguire il relativo codice sul server su cui è stato eseguito il decompressione.

Nel caso del download degli aggiornamenti da Git, si è scoperto che il gestore che scaricava gli aggiornamenti non teneva conto dei collegamenti simbolici durante la copia dei file da Git. Questa funzionalità ha permesso di organizzare la lettura di qualsiasi file dal server aggiungendo collegamenti simbolici a Git.

Si è deciso di iniziare gli esperimenti con una dimostrazione di hacking cdnjs per ricevere un premio ad HackerOne testando l'ipotesi riguardante la lettura dei file. Un collegamento simbolico test.js è stato aggiunto al repository Git della libreria JavaScript servita tramite CDN, che punta al file /proc/self/maps. Dopo aver pubblicato 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 questo file è stato richiesto, è stato restituito il contenuto di /proc/self/maps ).

Sostituendo un collegamento simbolico al file /proc/self/environ, l'autore dello studio ha notato che i dati forniti contenevano i valori delle variabili d'ambiente GITHUB_REPO_API_KEY e WORKERS_KV_API_TOKEN. La prima variabile memorizzava la chiave API per l'accesso in scrittura al repository robocdnjs su GitHub. La seconda variabile ha archiviato il token nell'archivio KV in cdnjs. Utilizzando le informazioni ricevute, l'aggressore potrebbe apportare modifiche a cdnjs e compromettere completamente l'infrastruttura.

Fonte: opennet.ru

Aggiungi un commento