Modulo NodeJS scaricato 7 milioni di volte consente agli hacker di iniettare codice

Modulo NodeJS scaricato 7 milioni di volte consente agli hacker di iniettare codice

Un modulo Node.js scaricato milioni di volte presenta un difetto di sicurezza che può consentire agli autori degli attacchi di eseguire un attacco DoS (Denial of Service) su un server o ottenere un accesso remoto completo alla shell.

Assegnata la CVE-2020-7699, la vulnerabilità risiede nel componente npm "express-fileupload", che è stato scaricato almeno 7,3 milioni di volte da npm.

La stima è prudente in quanto non tiene conto dei download da GitHub, siti Web mirror e altri repository clonati.

Questo tipo di vulnerabilità, noto come "Prototype Pollution", si verifica in genere nel codice JavaScript (JS) a causa della natura fondamentale della lingua. Poiché JS è un linguaggio basato su prototipo, ogni oggetto, funzione e struttura di dati nel linguaggio ha una proprietà "Prototype" intrinseca che può essere modificata tramite il mutatore "__proto__".

La possibilità di modificare il codice esistente è una funzionalità prevista che consente la facile estensione degli oggetti esistenti, con più proprietà e metodi.

Gli attacchi di prototipazione come questo sfruttano questo "difetto di progettazione" iniettando tipi incompatibili di oggetti in quelli esistenti per causare errori, portando almeno a un Denial of Service (DoS), se non all'accesso remoto alla shell.

Sfruttare il prototipo

L'attacco effettivo è reso possibile dalla funzione "parseNested" fornita da express-fileupload. Se abilitata, l'opzione "parseNested" è responsabile per "appiattire" i dati JSON caricati in oggetti nidificati.

Posix, il ricercatore di sicurezza che ha scoperto questo difetto spiega in un post sul blog,

"Il modulo express-fileupload offre diverse opzioni per il caricamento e la gestione dei file nell'applicazione [Node.js]. Tra questi, parseNested fa appiattire l'argomento".

Pertanto, se forniamo {"abc": true} come input, internamente, verrà utilizzato come {"a": {"b": {"c": true}}}

Ad esempio, se l'applicazione utilizzava il modulo "express-fileupload" per facilitare il caricamento dei file e l'opzione "parseNested" impostata su "true", ciò indica all'applicazione sul lato server di avviare l'appiattimento dei dati ricevuti in oggetti JSON nidificati.

Questa opzione "parseNested" è illustrata nell'immagine seguente.

Quando viene fornito un semplice payload nell'intestazione HTTP "Content-Disposition", un utente malintenzionato può fornire un valore "__proto __. ToString" per attivare l'attacco.

Ricordiamo, il mutatore "__proto__" può influenzare la proprietà "Prototype" di JavaScript ereditata da tutti gli oggetti e le strutture JS.

In sostanza, la richiesta HTTP mostrata qui sovrascriverà e danneggerà il metodo "toString" incorporato di ogni oggetto presente nel tuo codice.

"Se Object.prototype.toString può essere inquinato, ciò causerà un errore e, per ogni richiesta, express [sic] restituisce sempre 500 errori", ha detto il ricercatore.

Esecuzione di codice in remoto tramite shell inversa

Una variante più sofisticata di questo exploit descritta dal ricercatore consente a un utente malintenzionato di ottenere una shell sul sistema vulnerabile. Questo exploit, tuttavia, dipende in gran parte dal fatto che l'applicazione che utilizza una versione vulnerabile "express-fileupload" utilizzava anche il motore di template EJS (modelli JavaScript incorporati).

Supponiamo che la tua applicazione stia utilizzando EJS per analizzare i dati caricati senza ulteriori controlli. Un utente malintenzionato può quindi inviare una richiesta HTTP che sovrascrive l'opzione "outputFunctionName" di EJS.

Il carico utile mostrato sopra exploit inquinamento prototipo entro espresso fileupload, e istruisce EJS (dovrebbe essere in uso) per lanciare un Node.js "child_process". Questo nuovo processo genera una shell inversa sul computer dell'aggressore.

Una volta stabilita la connessione, un utente malintenzionato può ora eseguire codice arbitrario sul server compromesso.

Non tutte le installazioni hanno avuto un impatto

Il ricercatore, tuttavia, ha dichiarato al blog The Daily Swig che il difetto potrebbe non avere un impatto su tutti gli utenti. Solo le applicazioni con l'opzione "parseNested" abilitata sono vulnerabili a questo difetto di inquinamento del prototipo.

Inoltre, per ottenere l'accesso completo alla shell e l'esecuzione di codice in modalità remota, un'altra libreria come EJS, unitamente al vulnerabile file-upload rapido, è un prerequisito. Vale la pena notare che EJS non è l'unica libreria in grado di rendere possibile l'accesso alla shell.

Posix ha dichiarato a  The Daily Swig  che gli attacchi non hanno avuto un impatto solo su EJS,

"Il mio post spiega come ottenere una shell tramite EJS. [Ma] poiché il prototipo dell'inquinamento può cambiare il flusso di vari contesti, semplicemente l'aggiunta di alcuni moduli di riferimento può creare molte possibilità per gli aggressori."

Entro poche ore dalla ricezione del rapporto del ricercatore, "express-fileupload" ha risolto la vulnerabilità e gli utenti dovrebbero prendere in considerazione l'idea di ottenere l'ultima versione patchata 1.1.9 da npm.

Posted on

Author L'autore

Dario Fadda alias {Nuke}

Da sempre appassionato di informatica e del mondo open-source nel 2003 ho fondato il portale Spcnet.it per condividere articoli, notizie ed in generale tutto quello che riguarda il mondo dei computers, con particolare attenzione alle tematiche di Sicurezza informatica, Malware e Ransomware, ma anche guide di Programmazione e utili suggerimenti per tutte le fasce di interesse.
Dal 2006 sono membro del Gulch (Gruppo Utenti Linux Cagliari), con cui cerco di dare il mio contributo attivo per eventi e LinuxDay.
Su Twitter segnalo e condivido nuovi Phishing pericolosi con approfondimenti sul Bank Security.

Ho ideato Hacker Alert per effettuare ricerche di vulnerabilità e phishing in tempo reale.

Praticamente per tutto ciò che scopro e che è degno di nota ne condivido il codice sorgente su Git Hub.
Per tutto il resto c'è Dario Fadda .it che contiene "quasi" tutto di me.