Sicurezza informatica

L'inganno di Strapi: come 36 pacchetti npm malevoli hanno preso di mira l'infrastruttura del database

36 pacchetti npm malevoli travestiti da plugin Strapi sono stati scoperti a sfruttare Redis e PostgreSQL. Scopri come proteggere oggi stesso la tua CI/CD e i tuoi database.
L'inganno di Strapi: come 36 pacchetti npm malevoli hanno preso di mira l'infrastruttura del database

In una finestra di sole 13 ore, 36 pacchetti malevoli hanno inondato il registro npm, spacciandosi per strumenti legittimi per il popolare CMS Strapi. Non si è trattato di un atto casuale di vandalismo digitale; è stato un tentativo calcolato e sistemico di infiltrarsi in ambienti di database mission-critical. Quando i ricercatori di sicurezza di SafeDep hanno identificato la campagna, gli attori della minaccia avevano già stabilito una sofisticata testa di ponte, sfruttando la fiducia intrinseca che gli sviluppatori ripongono negli ecosistemi open-source.

Dal punto di vista del rischio, questo incidente evidenzia una realtà precaria nel moderno sviluppo software: le nostre supply chain sono forti quanto la loro dipendenza più debole. Gli aggressori hanno utilizzato quattro account "sock puppet" — umarbek1233, kekylf12, tikeqemif26 e umar_bektembiev1 — per distribuire pacchetti che apparivano, a prima vista, come plugin della community maturi. Tuttavia, dietro le quinte, questi pacchetti erano progettati per agire come un cavallo di Troia digitale, trasportando payload in grado di compromettere istanze Redis e PostgreSQL.

L'anatomia dell'inganno

Gli aggressori hanno impiegato una astuta convenzione di denominazione per bypassare i filtri mentali degli sviluppatori impegnati. Prefissando i loro pacchetti con strapi-plugin- e aggiungendo termini funzionali comuni come cron, database o health, hanno imitato la struttura di denominazione dell'ecosistema ufficiale di Strapi. Curiosamente, hanno anche codificato rigidamente il numero di versione a 3.6.8 in tutti i 36 pacchetti. Questa è stata una scelta deliberata per far apparire il software come una release matura e stabile piuttosto che un nuovo caricamento sospetto.

Nella mia esperienza di analisi dei rapporti di threat intelligence, questo tipo di comportamento "typosquatting-adjacent" è sempre più comune. Gli aggressori sanno che gli sviluppatori spesso cercano prima la funzionalità e verificano il produttore in un secondo momento. Mentre i plugin ufficiali di Strapi sono rigorosamente limitati al namespace @strapi/, la mancanza di un ambito obbligatorio per i plugin della community crea un vuoto che gli attori malevoli sono fin troppo felici di colmare.

L'hook postinstall: un esecutore silenzioso

A livello architettonico, la vulnerabilità primaria sfruttata qui non è un bug in Strapi o in npm stesso, ma piuttosto una funzionalità del ciclo di vita di npm. Ciascuno dei 36 pacchetti conteneva uno script postinstall.js. Nell'ecosistema npm, uno script post-installazione viene eseguito automaticamente non appena il pacchetto viene scaricato, richiedendo zero interazione da parte dell'utente per attivare il suo payload.

Di conseguenza, il codice malevolo viene eseguito con gli stessi privilegi dell'utente che esegue l'installazione. In un ambiente di sviluppo locale, ciò potrebbe significare l'accesso ai file personali e alle variabili d'ambiente. Tuttavia, in un contesto normativo in cui l'integrità dei dati è fondamentale, il vero pericolo risiede nelle pipeline CI/CD e nei container Docker. Se un processo di build automatizzato scarica uno di questi pacchetti, lo script ottiene effettivamente l'accesso root all'interno di quell'ambiente containerizzato, consentendogli di muoversi lateralmente e attaccare l'infrastruttura interna.

Sfruttare il Data Layer

Ciò che rende questa specifica campagna particolarmente granulare e pericolosa è la sua focalizzazione sul data layer. I payload non erano generici; erano specificamente progettati per sfruttare Redis e PostgreSQL. Una volta attivato lo script postinstall, esso tentava di:

  • Raccogliere credenziali: Setacciando variabili d'ambiente e file di configurazione alla ricerca di stringhe di connessione al database.
  • Distribuire Reverse Shell: Stabilendo un canale di ritorno persistente verso il server di comando e controllo (C2) dell'aggressore.
  • Rilasciare impianti persistenti: Garantendo che, anche se il processo iniziale fosse stato terminato, l'aggressore mantenesse un punto d'appoggio nel sistema.

In sostanza, gli aggressori cercavano le chiavi del regno. I database sono spesso la parte più sensibile dell'architettura di un'applicazione, contenendo di tutto, dai PII degli utenti alla logica di business proprietaria. Prendendo di mira Redis e PostgreSQL, gli aggressori miravano a trasformare una semplice installazione di un pacchetto in una violazione dei dati su vasta scala.

Il firewall umano e la sicurezza della supply chain

Osservando il panorama delle minacce, dobbiamo riconoscere che, al di là delle patch, l'elemento umano rimane una variabile significativa. Ricordo un caso durante un'indagine su una fuga di dati in cui uno sviluppatore senior ha introdotto accidentalmente una dipendenza malevola perché stava lavorando fino a tardi e non ha verificato la homepage del pacchetto. Succede ai migliori di noi, ma in un mondo di attacchi automatizzati, non possiamo più permetterci tali mancanze.

Dal punto di vista dell'utente finale, l'impatto di una tale violazione è spesso invisibile finché non è troppo tardi. In altre parole, una dipendenza compromessa è come una lenta falla nello scafo di una nave; potresti non accorgerti dell'innalzamento dell'acqua finché i motori non si guastano. In questo caso, i "motori" sono i tuoi database e l' "acqua" è l'accesso non autorizzato ai tuoi dati mission-critical.

Difesa proattiva: come proteggere la tua pipeline

In definitiva, la responsabilità di mettere in sicurezza la supply chain del software ricade sia sulle piattaforme che sugli sviluppatori che le utilizzano. Mentre npm lavora per rimuovere questi pacchetti una volta segnalati, la finestra di disponibilità di 13 ore è stata un tempo più che sufficiente affinché i sistemi automatizzati ingerissero il codice malevolo.

Per costruire una postura più resiliente, considera i seguenti passaggi pratici:

  1. Imporre pacchetti con ambito (Scoped Packages): Quando usi Strapi, dai priorità ai plugin sotto l'ambito @strapi/. Sii estremamente scettico verso i pacchetti senza ambito che mancano di descrizione, repository o homepage.
  2. Disabilitare gli script per impostazione predefinita: Usa il flag --ignore-scripts quando esegui npm install in ambienti in cui non ti fidi esplicitamente di ogni dipendenza. Ciò impedisce l'esecuzione automatica degli script postinstall.
  3. Usare Lockfile e Audit: Esegui regolarmente npm audit e usa package-lock.json per assicurarti che il tuo albero delle dipendenze sia prevedibile e non sia stato manomesso.
  4. Implementare il filtraggio dell'egresso di rete: A livello architettonico, i tuoi runner CI/CD e i container di produzione non dovrebbero avere accesso illimitato a Internet. Bloccare le connessioni in uscita non autorizzate può impedire alle reverse shell di connettersi all'aggressore.

Come contromisura contro attacchi futuri, dobbiamo trattare ogni dipendenza di terze parti come un rischio potenziale. Adottando un approccio zero-trust verso i nostri gestori di pacchetti, possiamo trasformare le nostre pipeline di sviluppo in una difesa robusta piuttosto che in una porta aperta per lo sfruttamento.

Fonti:

  • SafeDep Threat Research Team Analysis
  • npm Registry Security Advisory Logs
  • Strapi Official Documentation on Plugin Security
bg
bg
bg

Ci vediamo dall'altra parte.

La nostra soluzione di archiviazione e-mail crittografata end-to-end fornisce i mezzi più potenti per lo scambio sicuro dei dati, garantendo la sicurezza e la privacy dei tuoi dati.

/ Creare un account gratuito