Moduli non pubblicati su npm: un hacker potrebbe trarre vantaggio dalla loro precedente notorietà?

14

All'inizio di questa settimana, Azer Koçulu ha deciso di non pubblicare i suoi moduli da npm , il gestore pacchetti predefinito per Node.js . Aveva pubblicato 273 moduli in totale.

Alcuni moduli importanti, come Babel e React, si basavano su uno di essi: left-pad , e un sacco di Le installazioni di npm hanno iniziato a fallire perché il modulo non è stato più trovato. Il modulo originale è stato rapidamente ripubblicato da Cameron Westland come versione 1.0.0, dal momento che npm consente di riscrivere un nome di pacchetto abbandonato purché non utilizzino gli stessi numeri di versione.

Quindi lo staff di npm ha deciso di ripubblicare la versione originale perché erano ancora osservando molti errori.

Tuttavia, qualcuno avrebbe potuto essere più veloce di Cameron e avrebbe potuto caricare uno script malevolo invece di quello originale. Poiché i pacchetti non sono firmati, lo script dannoso potrebbe essere stato scaricato ed eseguito migliaia di volte.

NPM ha qualche meccanismo che impedisce a un utente malintenzionato di sfruttare la notorietà di un modulo non pubblicato?

    
posta Benoit Esnard 25.03.2016 - 14:00
fonte

1 risposta

9

È possibile inviare il codice dannoso a NPM?

Sicuramente. Se un pacchetto deve essere compromesso (o ne viene pubblicato uno nuovo), installato e utilizzato qualsiasi codice fornito con quel pacchetto potrebbe essere eseguito. Quindi, se lo eseguono nel contesto node.js, ad esempio, l'attacco ha accesso a molte funzionalità a livello macchina come il file system, le informazioni di sistema, l'esecuzione di file, i processi, ecc. Sarebbe semplice come mettere il codice dell'attaccante su essere restituito nell'esportazione. Quindi non appena viene eseguito il require('bad-package') del codice. Ancora peggio potrebbe essere semplice come installare il modulo. Possono specificare uno script di preinstallazione nel manifest del pacchetto ed eseguire immediatamente lo script.

Il codice dannoso è stato inviato a NPM?

Di certo sicuramente di nuovo. Il 26/01/2015 un pacchetto denominato rimrafall è stato pubblicato su NPM. Lo scopo era quello di aumentare la consapevolezza del problema. Il pacchetto eseguiva un hook di preinstallazione in modo che immediatamente all'installazione rm -rf /* venisse eseguito. Rimrafall è stato rimosso entro 2 ore, ma può essere trovato su Github .

Gli sviluppatori possono mantenere se stessi e i propri utenti al sicuro?

Come sviluppatore, il solo metodo di prevenzione affidabile vicino è il blocco della versione nel package.json alle versioni conosciute per essere al sicuro. Il blocco della versione è normalmente praticato per garantire che venga utilizzata solo una dipendenza di lavoro nota e un aggiornamento delle dipendenze non testato non infrange nulla. Ma lo stesso può essere usato per respingere una versione degli attaccanti. Come hai detto, non puoi ripubblicare un file di una particolare versione. Impostando una versione esatta nelle dipendenze l'applicazione scaricherà solo questa versione. Se un utente malintenzionato doveva ottenere il controllo del pacchetto, poteva solo spingere il codice dannoso agli utenti di un pacchetto successivo. Ho detto "vicino all'affidabilità" perché se un utente malintenzionato doveva compromettere i server NPM, poteva cambiare una versione precedente in qualsiasi modo desiderasse.

Inoltre puoi impedire un attacco di script di preinstallazione utilizzando il flag --ignore-scripts durante l'installazione. Questo ti darebbe la possibilità di installare ma vedere il suo codice prima di eseguirlo. (A meno che il pacchetto contenga file binari nativi.) Prima di installare è possibile verificare la presenza di tali script eseguendo npm show $module scripts . Se vuoi lasciare il NPM fuori dal mix per rivedere lo script, puoi scaricarlo direttamente su http://registry.npmjs.org/MODULENAME/-/MODULENAME-VERSION.tgz .

L'NPM impedisce a qualcuno di rilevare un pacchetto non pubblicato?

Sì e no. Una volta che non è stato pubblicato, è presente una sospensione posta sul nome del pacchetto per evitare un abuso immediato. Tuttavia è ancora ottenibile se richiesto da NPM. In teoria, la semplice ingegneria sociale potrebbe aggirare il processo di controllo e mettere il nome del pacchetto nelle mani dell'attaccante. Di seguito è riportato un messaggio per un pacchetto non pubblicato:

This package name is not currently in use, but was formerly occupied by a popular package. To avoid malicious use, npm is hanging on to the package name, but loosely, and we'll probably give it to you if you want it.

You may adopt this package by contacting [email protected] and requesting the name.

In conclusione

Quindi, in chiusura, un utente malintenzionato potrebbe sfruttare il pacchetto non pubblicato? Sì, se la persona sbagliata ha preso rapidamente possesso di nulla era nel loro modo di spingere un aggiornamento del pacchetto con il loro codice. Ciò comprometterebbe chiunque scaricasse l'ultima versione di quel pacchetto o installasse / aggiornasse progetti che non bloccavano le loro dipendenze dalla versione.

Modifica: tieni presente che le tue dipendenze possono avere dipendenze. Così, mentre la dipendenza stessa può sembrare sicura, assicurati che non si carichi in una dipendenza non sicura di sua proprietà.

    
risposta data 25.03.2016 - 20:45
fonte

Leggi altre domande sui tag