Nella moderna ingegneria del software, la velocità nello sviluppo è spesso una priorità. Uno dei fattori che ha rivoluzionato il modo di costruire applicazioni web è sicuramente l'uso delle dipendenze e dei pacchetti tramite gestori come NPM (Node Package Manager). Oggi possiamo creare un'app complessa semplicemente installando alcune librerie open source. Tuttavia, questa comodità ha un prezzo: le vulnerabilità nelle dipendenze possono diventare il punto debole della nostra applicazione.
In questo articolo scopriremo:
- Perché la sicurezza nelle dipendenze è fondamentale.
- Quali rischi comporta l'uso di librerie NPM non sicure.
- Come monitorare, prevenire e correggere vulnerabilità.
- Best practice e strumenti essenziali per proteggere un progetto JavaScript
Il problema delle dipendenze insicure in JavaScript
Ogni pacchetto NPM può portare con sé decine o centinaia di altre dipendenze (le famose dipendenze delle dipendenze). Molte di queste librerie sono mantenute da singoli sviluppatori o community che possono smettere di aggiornarle, risultare obsolete o addirittura essere compromesse.
Esempi di vulnerabilità reali:
- Event-stream (2018): un pacchetto NPM molto popolare è stato compromesso da un maintainer che ha introdotto codice malevolo per rubare delle criptovalute.
Colors.jsFaker.js
UAParser.js
Tutti questi incidenti dimostrano che se non prestiamo attenzione anche una semplice npm install può essere un vettore di attacco.
Strumenti per individuare le vulnerabilità
Esegui il comando:
npm audit
Questo strumento integrato in NPM controlla automaticamente tutte le dipendenze del tuo progetto confrontandole con un database pubblico di vulnerabilità note.
Puoi usare anche:
npm audit fix
per tentare di aggiornare automaticamente le librerie vulnerabili, se esistono delle versioni patchate compatibili.
snyk è invece uno strumento più avanzato che offre anche integrazione con GitHub, CI/CD, Slack e molto altro:
npx snyk test
È inoltre possibile integralo nelle pipeline:
- name: Run Snyk to check for vulnerabilities
run: snyk test
Snyk è gratuito per progetti open source e offre piani commerciali per uso aziendale.
Con GitHub Security Alerts, se il tuo codice è hostato su GitHub puoi attivare la scansione automatica delle dipendenze tramite GitHub Actions. Ogni volta che viene rilevata una vulnerabilità riceverai una notifica. Potrai anche automatizzare l'apertura di una pull request per correggerla.
Monitorare e minimizzare le dipendenze
Evita dipendenze non necessarie. Spesso infatti aggiungiamo interi pacchetti solo per una funzione. Esistono ottimi tool nativi o moderni standard JS che evitano la necessità di dipendenze extra. Per esempio:
- Usa
fetch() - Usa
Intl.NumberFormat()
Verifica l'autore e la sua popolarità. Prima di installare un nuovo pacchetto:
- Controlla numero di download su NPM.
- Verifica gli ultimi aggiornamenti e la data dell'ultima release.
- Dai uno sguardo al repository GitHub: ha contributor attivi? Issue risolte?
- Attento a fork sospetti o a pacchetti con nomi simili (es.
lodash.jslodash
Best practice per la sicurezza delle dipendenze in JavaScript
Usa package-lock.json o pnpm-lock.yaml. I file lock impediscono aggiornamenti automatici non desiderati. Anche se aggiorni una dipendenza, le sotto-dipendenze restano bloccate, garantendo coerenza e minori rischi.
Per automatizzare le revisioni configura strumenti come Renovate o Dependabot per:
- Aprire automaticamente pull request con aggiornamenti.
- Segnalarti patch di sicurezza.
- Testare i cambiamenti nelle pipeline CI.
Usa poi ambienti di build isolati ed esegui npm install
Docker
Elimina inoltre le dipendenze inutilizzate. Ogni pacchetto inutilizzato ma installato rappresenta una superficie d'attacco inutile.
npm prune
oppure usa strumenti come depcheck
In ambienti professionali: policy di sicurezza
In progetti aziendali, è buona norma stabilire policy come:
- Whitelist di pacchetti approvati.
- Controlli pre-merge per scansioni di sicurezza.
- Formazione per i developer sulla scelta consapevole delle dipendenze.
- Revisione periodica delle librerie critiche.
Esempio pratico: da insicuro a sicuro
Prima:
const moment = require('moment'); // 500kb, deprecated
Dopo:
const { format } = require('date-fns'); // più leggero, modulare
npm audit
restituisce:
1 high severity vulnerability found
La soluzione è:
npm audit fix
Oppure puoi aggiornare moment
Conclusione: la sicurezza delle dipendenze JavaScript
La sicurezza delle dipendenze JavaScript non è solo una preoccupazione per le grandi aziende o i team di sicurezza. È una responsabilità quotidiana di ogni sviluppatore. Viviamo in un ecosistema ricco, veloce e potente, ma anche fragile. Ignorare le vulnerabilità nei pacchetti NPM può compromettere interi progetti, dati sensibili o la fiducia degli utenti.
La buona notizia è che oggi esistono strumenti potenti e strategie efficaci per gestire questo rischio. Non serve diventare un esperto di sicurezza per iniziare: basta prendere l'abitudine di monitorare, aggiornare e scegliere con attenzione. Automatizza dove possibile, rivedi regolarmente le tue dipendenze, e soprattutto: non installare nulla alla cieca.
Il tuo codice è sicuro quanto la libreria più vulnerabile che usi. In un mondo sempre più esposto, la sicurezza è un investimento, non un ostacolo. E comincia con un semplice npm audit.