npmjavascriptsecuritynews

npm Security 2025: Perché Provenance e Sigstore Cambiano Tutto

Dal worm 'Shai-Hulud' al typosquatting, il 2025 è stato brutale per npm. Scopri come rafforzare la tua supply chain con provenance, Sigstore e Trusted Publishing.

DataFormatHub Team
December 22, 202512 min read
Share:
npm Security 2025: Perché Provenance e Sigstore Cambiano Tutto

L'ecosistema dei pacchetti JavaScript, in particolare npm, è sempre stato un ambiente vivace, sebbene occasionalmente caotico. Ma mentre ci avviciniamo alla fine del 2025, l'aria è densa di un tipo diverso di energia: un'urgente spinta palpabile verso una supply chain software più sicura. Recenti attacchi di alto profilo hanno spostato la conversazione da "se" a "come" rafforziamo collettivamente le nostre dipendenze. Sono stato immerso nelle trincee, testando gli ultimi strumenti e osservando l'evoluzione del panorama, e onestamente, alcuni dei progressi sono genuinamente impressionanti, anche se il percorso verso l'adozione completa è ancora costellato di alcune spine fastidiose.

Non si tratta solo di patch; è una rivalutazione fondamentale della fiducia, della provenance e della meccanica stessa di come consumiamo e pubblichiamo il codice. La buona notizia? Stiamo assistendo a sforzi reali e tangibili da parte del team principale di npm, GitHub e della comunità più ampia per affrontare queste vulnerabilità sistemiche.

L'Ascesa di npm provenance e Sigstore: Fiducia alla Fonte

Questo è genuinamente impressionante perché affronta una delle minacce più insidiose: un ambiente di build o pubblicazione compromesso. Per anni, ci siamo affidati al campo integrity di package.json per i checksum, ma questo verifica solo il pacchetto scaricato rispetto a ciò che il registro pensa che dovrebbe essere. Non ci dice se il pacchetto è stato costruito e pubblicato dal manutentore legittimo in un ambiente affidabile. Entra in gioco npm provenance, disponibile in generale da ottobre 2023, con un significativo slancio nel 2024 e nel 2025.

npm provenance è l'implementazione di npm del framework Supply-chain Levels for Software Artifacts (SLSA), sfruttando la potenza di Sigstore. L'idea di base è creare attestazioni verificabili su come e dove un pacchetto è stato costruito e pubblicato. Quando pubblichi un pacchetto con --provenance, la CLI di npm funziona con il tuo provider CI/CD (attualmente GitHub Actions e GitLab CI/CD sono supportati) per generare un'attestazione di provenance. Questa attestazione include dettagli come l'URI del repository di origine, l'hash del commit e le istruzioni di build.

Ecco l'eleganza architettonica: invece di gestire chiavi di firma di lunga durata, Sigstore utilizza certificati effimeri di breve durata emessi da un'Autorità di Certificazione (Fulcio) che si federano con il tuo provider OIDC. Questo certificato viene quindi utilizzato per firmare la dichiarazione di provenance e sia il certificato che la firma vengono registrati in un log di trasparenza pubblico e a prova di manomissione (Rekor). Ciò significa che firmi la build, elimini la chiave privata e l'intero processo è pubblicamente verificabile.

Per pubblicare con provenance, è sufficiente aggiungere un flag:

npm publish --provenance --access public

E per la verifica? Il comando npm audit signatures, introdotto a luglio 2022, è ora il nostro migliore amico per questo. Verifica le firme ECDSA e genererà un errore se i pacchetti hanno firme mancanti o non valide, indicando potenziali manomissioni.

npm audit signatures

Questo è un passo avanti monumentale. Sebbene non garantisca l' assenza di codice dannoso, fornisce un collegamento crittografico alla fonte e all'ambiente di build, consentendo agli sviluppatori di prendere decisioni di fiducia informate. Il limite, per ora, è la sua dipendenza da runner ospitati su cloud e provider CI/CD specifici. Per coloro di noi con runner self-hosted o sistemi CI alternativi, l'adozione è ancora un po' goffa, richiedendo workaround manuali o in attesa di un supporto più ampio. Ma la direzione è chiara, ed è robusta.

Rafforzare il Publisher: 2FA, Token Granulari e Trusted Publishing

La raffica di attacchi alla supply chain nel 2025, incluso il worm "Shai-Hulud" a settembre e le successive campagne di typosquatting a ottobre, è servita da brusco campanello d'allarme. Gli aggressori hanno compromesso gli account dei manutentori tramite phishing sofisticato, portando a iniezioni di pacchetti dannosi. GitHub, che possiede npm, ha risposto con modifiche aggressive e necessarie all'autenticazione e alla pubblicazione, implementate in gran parte tra ottobre e metà novembre 2025.

I cambiamenti chiave sono:

  1. 2FA Obbligatorio per la Pubblicazione Locale: Questa è un'enorme vittoria. Non è più possibile pubblicare da una macchina locale solo con una password. Se stai pubblicando dal tuo ambiente di sviluppo, sarà richiesto il 2FA. Questo affronta direttamente i vettori di phishing che hanno afflitto i manutentori.
  2. Deprecazione dei Token Classici Legacy: I token npm classici, spesso di lunga durata e ad ampio raggio, vengono gradualmente eliminati. Questo è fondamentale perché i token di lunga durata compromessi erano un vettore di attacco primario.
  3. Durata Limitata per i Token Granulari: I nuovi token granulari, che consentono autorizzazioni più precise, avranno una durata massima di sette giorni (con un massimo di 90 giorni per alcuni casi). Questo riduce drasticamente la finestra di opportunità per gli aggressori se un token viene rubato.
  4. Espansione di Trusted Publishing: Il supporto di npm per Trusted Publishing, introdotto a luglio 2025, elimina la necessità di gestire i token API nei sistemi CI/CD. Invece, i provider CI/CD (come GitHub Actions) possono attestare direttamente l'identità del publisher e npm verifica questa attestazione. Questo è lo standard aureo, poiché elimina il token come segreto nella tua pipeline di build.

La transizione, sebbene necessaria, ha causato alcune interruzioni del flusso di lavoro per gli sviluppatori abituati a pratiche più vecchie. La deprecazione del 2FA TOTP a favore del 2FA basato su FIDO (come WebAuthn/passkey) è anche una mossa significativa, poiché l'autenticazione resistente al phishing è dimostrabilmente superiore al TOTP contro attacchi sofisticati. Sebbene alcuni sviluppatori possano trovare difficile il passaggio alle passkey a causa della compatibilità dei dispositivi, i vantaggi in termini di sicurezza sono innegabili.

Per coloro che pubblicano da CI, la raccomandazione è utilizzare npm publish --provenance con la configurazione Trusted Publishers, bypassando completamente la necessità di token espliciti nel tuo ambiente CI. Per la pubblicazione locale, assicurati che il tuo 2FA sia aggiornato e resistente al phishing.

Oltre npm audit: Il Paesaggio in Evoluzione della Scansione delle Dipendenze

npm audit è un punto fermo dal 2018, facendo un lavoro decente nel segnalare le vulnerabilità note nella tua struttura di dipendenze controllando rispetto al database delle Advisory Pubbliche di npm. E sebbene sia un modo rapido e integrato per identificare i problemi, gli eventi recenti ne hanno evidenziato i limiti. Un npm audit funziona solo contro le vulnerabilità note. Non rileva malware nuovo, attacchi alla supply chain sottili che modificano pacchetti legittimi o vulnerabilità nel tuo codice.

Il worm "Shai-Hulud", ad esempio, ha compromesso i pacchetti e li ha ripubblicati con malware. Mentre npm audit potrebbe eventualmente rilevare le nuove versioni dannose se vengono pubblicate advisory, la diffusione iniziale può essere rapida. Questo sottolinea la necessità di un approccio multilivello.

È qui che gli strumenti specializzati brillano davvero. Soluzioni come Snyk e SonarQube vanno molto più a fondo. Snyk, ad esempio, offre il rilevamento delle vulnerabilità in tempo reale nelle dipendenze, il monitoraggio continuo e persino le richieste pull automatizzate per applicare le correzioni. SonarQube, sebbene più ampio nel suo ambito per la qualità del codice, fornisce anche un'analisi di sicurezza completa per JavaScript e Node.js, in grado di interrompere le build se le soglie di sicurezza non vengono soddisfatte.

L'integrazione di questi strumenti nelle pipeline CI/CD non è più un "nice-to-have" ma un "must-have". Una configurazione tipica potrebbe includere:

  1. Hook pre-commit: Esecuzione di linter di base e analisi statica per rilevare i problemi ovvi in anticipo.
  2. Passo di build CI: Esecuzione di npm audit per un controllo rapido, ma soprattutto, integrazione di uno strumento SCA (Software Composition Analysis) robusto come Snyk o uno strumento SAST (Static Application Security Testing) come SonarQube.
  3. Monitoraggio post-deployment: Scansione continua delle applicazioni distribuite e delle loro dipendenze per nuove vulnerabilità scoperte.

La realtà è che, sebbene npm audit sia accessibile, è una base di partenza. Fare affidamento esclusivamente su esso nel 2025 è come portare un coltello da burro a una sparatoria. Gli strumenti commerciali e open source avanzati, sebbene richiedano più configurazione e potenzialmente costi, offrono la profondità necessaria per proteggere veramente le applicazioni moderne.

Sicurezza Runtime Reimaginata: Le Autorizzazioni di Deno e la Visione di JSR

Mentre npm è il gestore di pacchetti dominante per Node.js, l'ecosistema JavaScript più ampio sta assistendo a una fascinante evoluzione dei runtime, con Deno e Bun che sfidano l'egemonia di Node.js. Ciò che è entusiasmante è come le loro filosofie stiano influenzando la sicurezza. Comprendere le differenze tra Node.js, Deno, Bun nel 2025: Scegliere il Tuo Runtime JavaScript è ora un prerequisito per un'architettura sicura.

Deno: Sicurezza al Primo Posto per Default

Deno, creato dal fondatore di Node.js Ryan Dahl, ha la sicurezza integrata nel suo core. A differenza di Node.js, che concede agli script l'accesso illimitato al sistema per impostazione predefinita, Deno opera con un modello di autorizzazioni sandbox. Ciò significa che un programma Deno non può accedere al file system, alla rete o alle variabili d'ambiente senza un'autorizzazione esplicita.

Ad esempio, per consentire l'accesso alla rete e la lettura dal file system, è necessario eseguire lo script Deno con i flag:

deno run --allow-net --allow-read app.ts

Questo modello di autorizzazione esplicito è un punto di svolta per prevenire gli attacchi alla supply chain, in cui pacchetti dannosi spesso tentano di esfiltrare dati o compromettere il sistema host. Se una dipendenza compromessa tenta di fetch dati da un dominio non autorizzato o di read file sensibili, Deno semplicemente lo negherà, a meno che tu non abbia esplicitamente concesso tale autorizzazione.

JSR: Un Nuovo Registro per JavaScript Moderno

Introdotto in beta pubblica a marzo 2024, JSR (JavaScript Registry) è la risposta di Deno a un registro di pacchetti moderno. JSR non mira a biforcare npm ma a costruire sul suo successo, abbracciando ESM, il supporto nativo TypeScript e un focus su sicurezza ed esperienza dello sviluppatore.

Una delle caratteristiche di sicurezza di spicco di JSR è la "pubblicazione sicura e senza token". Simile al Trusted Publishing di npm, JSR mira a proteggere dagli attacchi alla supply chain eliminando la necessità di token di lunga durata durante il processo di pubblicazione. JSR si concentra anche sulla provenance completa per i pacchetti pubblicati, garantendo informazioni di build verificabili.

Bun: Velocità con Sicurezza in Evoluzione

Bun, il nuovo arrivato costruito in Zig, dà la priorità alla velocità pura in ogni aspetto: esecuzione runtime, installazione dei pacchetti, bundling e test. Sebbene Bun sia incredibilmente veloce e offra la compatibilità con npm, il suo modello di sicurezza è attualmente più simile a quello di Node.js, con accesso illimitato per impostazione predefinita.

Tuttavia, il rapido ciclo di sviluppo di Bun suggerisce che funzionalità di sicurezza più esplicite potrebbero essere sulla roadmap. Per ora, se stai sfruttando le incredibili prestazioni di Bun, è fondamentale stratificare la tua sicurezza con una scansione delle dipendenze robusta e le protezioni CI/CD, poiché il suo sandboxing nativo non è maturo come quello di Deno.

Il Ruolo Cruciale di package-lock.json e SRI: Integrità che Non Puoi Ignorare

Il file package-lock.json è molto più di un semplice elenco di versioni bloccate; è un manifesto crittografico della tua struttura di dipendenze. Il suo campo integrity, in particolare, contiene un hash di integrità delle risorse (SRI), in genere SHA512, per ogni pacchetto. Questo hash è un'impronta digitale univoca del contenuto del pacchetto così come è stato originariamente pubblicato nel registro.

Quando esegui npm install (o npm ci in CI/CD, che è altamente raccomandato per la riproducibilità), npm scarica il pacchetto, ricalcola il suo hash e lo confronta con il valore integrity nel tuo package-lock.json. Se non corrispondono, l'installazione fallisce, segnalando una potenziale manomissione. Questa è la nostra prima e spesso più critica linea di difesa contro gli attori malintenzionati che modificano i pacchetti nel registro o durante il transito.

Tuttavia, questo meccanismo non è a prova di tutti gli attacchi alla supply chain. Il vettore di attacco "lockfile poisoning" dimostra questo: se un aggressore ottiene il controllo dell'account di un manutentore, può pubblicare una versione dannosa di un pacchetto e quindi aggiornare il package-lock.json nel repository legittimo con l'hash di integrità nuovo, dannoso. Se questo package-lock.json compromesso viene committato e quindi viene eseguito npm install o npm ci, il pacchetto dannoso verrà installato perché l'hash di integrità corrisponde alla versione dell'attaccante.

Ecco perché npm provenance è così cruciale come livello di difesa aggiuntivo, dimostrando chi ha pubblicato il pacchetto e come è stato costruito. Aggiunge una "fonte di verità" oltre al semplice hash.

Gli sviluppatori dovrebbero sempre:

  • Committare package-lock.json: Ciò garantisce installazioni deterministiche e fornisce gli hash di integrità per la verifica.
  • Rivedere le differenze di package-lock.json nelle PR: Cerca modifiche impreviste, soprattutto alle versioni dei pacchetti o agli hash di integrità, che potrebbero indicare un attore malintenzionato che tenta di iniettare una dipendenza compromessa.
  • Assicurarsi che venga utilizzato SHA-512: I file package-lock.json più vecchi potrebbero utilizzare SHA-1, che è crittograficamente debole e vulnerabile agli attacchi di collisione. Le versioni moderne di npm utilizzano SHA-512 per impostazione predefinita, ma se stai lavorando su un progetto più vecchio, una nuova installazione npm dopo aver eliminato node_modules e package-lock.json (e quindi committato quello nuovo) può aggiornare questi hash.
# Per forzare l'aggiornamento a SHA512 (utilizzare con cautela, committare le modifiche dopo!)
rm -rf node_modules package-lock.json
npm install

Difendersi dagli Attacchi agli Script del Ciclo di Vita: La Minaccia Silenziosa

Una delle funzionalità più potenti, e pericolose, dei pacchetti npm sono gli script del ciclo di vita. Si tratta di comandi shell arbitrari definiti in package.json (ad esempio, preinstall, install, postinstall, prepack, prepare) che vengono eseguiti in varie fasi del processo di installazione o pubblicazione del pacchetto. Sebbene incredibilmente utili per la compilazione, la configurazione o la creazione di moduli nativi, sono anche un vettore primario per gli attacchi alla supply chain.

Uno script postinstall dannoso, ad esempio, può eseguire codice arbitrario sulla macchina di un utente immediatamente dopo l'installazione di un pacchetto. Ciò potrebbe variare dal furto di variabili d'ambiente e credenziali all'installazione di malware aggiuntivo. Gli attacchi di typosquatting di ottobre 2025, che hanno utilizzato infostealer a più stadi e hanno lanciato terminali nascosti per estrarre password di sistema e cookie del browser, hanno sfruttato pesantemente gli script postinstall.

La difesa contro questo richiede un approccio multilivello:

  1. Flag --ignore-scripts: Per i deployment di produzione o quando si controllano nuove dipendenze, l'esecuzione di npm install --ignore-scripts può impedire l'esecuzione di questi script. Questa è una salvaguardia cruciale, soprattutto negli ambienti CI/CD in cui si desidera ridurre al minimo la superficie di esecuzione.
    npm install --ignore-scripts
    # O tramite variabile d'ambiente per effetto globale
    NPM_CONFIG_IGNORE_SCRIPTS=true npm install
    
  2. Revisione Attenta di package.json: Quando si aggiungono nuove dipendenze, ispezionare sempre il loro package.json per script del ciclo di vita sospetti. Se un pacchetto di utilità semplice ha uno script postinstall complesso, è un campanello d'allarme.
  3. Ambienti Sandbox: L'esecuzione di npm install all'interno di ambienti sandbox o container può limitare il raggio d'azione di uno script dannoso.
  4. Analisi Statica: Gli strumenti di sicurezza avanzati possono spesso rilevare modelli sospetti negli script del ciclo di vita.

La Strada da Percorrere: Un Ecosistema Più Resiliente

Guardando indietro al 2024 e al 2025, è chiaro che l'ecosistema dei pacchetti JavaScript è stato messo a dura prova, ma sta emergendo più forte. I recenti attacchi, sebbene dolorosi, hanno accelerato l'adozione di funzionalità di sicurezza critiche. Ci stiamo muovendo verso:

  • Identità e Provenance Più Forti: npm provenance e Sigstore sono dei punti di svolta, offrendo collegamenti verificabili dal pacchetto pubblicato alla fonte e alla build. Questo sposta la fiducia da "Spero che sia buono" a "Posso verificare che sia stato costruito come previsto".
  • Workflow di Pubblicazione Rafforzati: Il 2FA obbligatorio, i token di breve durata e Trusted Publishing rendono significativamente più difficile per gli aggressori compromettere gli account dei manutentori e iniettare codice dannoso. Questa è una difesa pratica e solida contro il phishing.
  • Scansione Sofisticata: Sebbene npm audit rimanga utile, l'aumento della dipendenza da strumenti SCA e SAST avanzati, integrati in profondità nell'SDLC, è fondamentale per rilevare sia le minacce note che quelle nuove.
  • Sicurezza a Livello di Runtime: Il modello di autorizzazioni di sicurezza integrato di Deno e il registro JSR incentrato sulla sicurezza stanno spingendo i confini di ciò che è possibile in un ambiente JavaScript sicuro. Questi non sono solo "alternative" ma "innovazioni" che influenzeranno l'intero ecosistema.

Tuttavia, non siamo fuori pericolo. L'enorme scala dell'ecosistema npm (4.5 trilioni di richieste solo nel 2024) lo rende ancora un obiettivo primario. L'adozione di queste nuove funzionalità di sicurezza non è universale e i progetti legacy continueranno a porre delle sfide. L'esperienza dello sviluppatore può ancora essere goffa quando si integrano nuove misure di sicurezza e la documentazione per alcune funzionalità sperimentali (come il modello di autorizzazioni sperimentale di Node.js, che è ancora in evoluzione) può essere scarsa.

La mia opinione? Abbraccia questi cambiamenti con entusiasmo. Integra npm publish --provenance nel tuo CI/CD. Imposta il 2FA resistente al phishing obbligatorio per il tuo team. Non limitarti a eseguire npm audit; investi in una scansione più approfondita. Esamina attentamente package-lock.json e pensa due volte prima di abilitare gli script del ciclo di vita da fonti sconosciute. L'ecosistema JavaScript è più resiliente che mai, ma la sua forza dipende in ultima analisi dalla nostra vigilanza collettiva e dalla nostra volontà di adottare queste misure di sicurezza pratiche ed efficienti. Stiamo costruendo il futuro e rendere sicuro è la nostra responsabilità condivisa.


Fonti


🛠️ Strumenti Correlati

Esplora questi strumenti DataFormatHub relativi a questo argomento:


📚 Potrebbe Piaccerti Anche