TL; DR
Trà u 2026-06-15 è u 2026-06-16 un solu editore npm hà spintu sei pacchetti - 26 versioni in tuttu — chì eseguiscenu un script in tempu d'installazione ogni npm installOgni pacchettu cuntene un schedariu README chì u dichjara cum'è un artefattu di ricerca HackerOne / GitHub Bug Bounty "benignu" chì "ùn" tocca mai i valori di credenziali è "ùn esegue alcuna persistenza". U codice ùn currisponde micca à a dichjarazione di non rispunsabilità. Nant'à i runner CI Linux, u hook d'installazione rileva l'impronte digitali di l'ambiente è sonda un endpoint di metadati d'istanza di nuvola; in Windows dumanda l'elevazione, funziona cum'è SYSTEM, è apre un canale di cummandu à un host esternu. L'unicu indicatore da circà avà hè l'host C2 173.255.233[.]239. Severità: altuEcosistema affettatu: npmI nomi si mischianu in u rumore di dipendenza di l'integrazione cuntinua (metrics-pipeline-d8k2, event-metrics-q3x7, pkg-telemetry-r4f9, è trè fratelli).
L'attaccu: cumu funziona
Ogni pacchettu in u cluster hè custruitu in u listessu modu. U package.json cunnessione di u listessu cumandamentu in dui cicli di vita hooks:
{ "scripts": { "preinstall": "node run.js", "postinstall": "node run.js" } } Corre nantu à tramindui preinstallazione è postinstallazione significa chì u payload si attiva indipendentemente da se i passi d'installazione successivi fiascanu o micca. run.js ellu stessu hè un dispatcher di piattaforma di dece linee:
// Platform dispatcher — runs beaconNN.js on Windows, beacon_linux.js on Linux. // GitHub Bug Bounty authorized research. Contact: nicholas@curran.tech 'use strict'; const { execFileSync } = require('child_process'); const path = require('path'); const node = process.execPath; const script = process.platform === 'win32' ? path.join(__dirname, 'beacon34.js') : path.join(__dirname, 'beacon_linux.js'); try { execFileSync(node, [script], { stdio: 'inherit', timeout: 90000 }); } catch (e) {} U cumpurtamentu si bifurca tandu per sistema operativu. Tutti i sei pacchetti portanu i stessi dui pezzi — run.js è i beacon di a piattaforma - dunque sò droppers intercambiabili invece di sei strumenti distinti. L'unica variazione significativa trà elli hè a cadenza di publicazione: quattru nomi sò stati spediti una volta, mentre dui sò stati ripubblicati ogni 30-60 minuti per ore, ciò chì mantene una versione appena publicata davanti à l'installatori è i risolutori ancu quandu quelli più vechji sò ritirati.
Nantu à Linux (beacon_linux.js) i profili di script induve hè in esecuzione. Enumera i nomi di e variabili d'ambiente, legge i fugliali sottu / proc, verifica per docker.sock, è corre nomu di ostinu e whoamiDopu emette una dumanda HTTP à u puntu finale di metadati di l'istanza di u container AWS. 169.254.170[.]2 — l'indirizzu link-local chì un compitu ECS dumanda per ottene a so propria cunfigurazione è e credenziali di rolu di corta durata (IMDS, u serviziu di metadati di l'istanza). I risultati sò mandati à u cullettore di a campagna à 173.255.233[.]239.
Su Windows (beacon34.js / beacon18.js) u pacchettu face assai più chè prufilà u so òspite. U codice segnalatu aghjusta una chjave di registru sottu à ms-settings manipulatore cù un DelegatuEseguisce valore — un bypass cunnisciutu di u cuntrollu di u contu utilizatore chì permette à un prucessu lanciatu di esse eseguitu cù un privilegiu elevatu senza un prompt. Invoca PowerShell cù -EsecuzionePolicy Bypass e Invoca-Spressione, esegue in u NT AUTORITÀ \ SISTEMA cuntestu, è interroga un host esternu per i cumandamenti. U canale di cumanda di Windows funziona annantu à un Tunnel Cloudflare, limitazioni-di-diametru-di-muniti-parenti.trycloudflare[.]com:443, ricadendu à 173.255.233[.]239:443, aduprendu trè punti finali: /c2/sondaggio per piglià un cumandamentu, /c2/fora per restituisce l'output, /c2/eof chjude.
Ciò chì hè novu quì: a dichjarazione di non responsabilità cum'è camouflage
L'elementu novu ùn hè micca u payload - install-hook recognition è Windows elevation sò tramindui ben documentati. Hè a storia di copertina. Ogni pacchettu cuntene un README chì si leghje cum'è un artefattu di divulgazione responsabile:
# @ncurran/sandbox-recon-880538 — authorized npm-sandbox security research Chistu è un benigna pacchettu publicatu sottu à u scopu `@ncurran` di l'autore cum'è parte di un Ingaghjamentu autorizatu di HackerOne / GitHub Bug Bounty (npm hè in u scopu).
À l'installazione, ispeziona u so propiu ambiente d'esecuzione ... variabile d'ambiente
solu nomi chjave ... verifica s'ellu hè ben cunnisciutu endpoints di metadati in u cloud sò raggiungibile ... Segnala solu i codici di statu, e lunghezze di risposta è hash — mai qualsiasi credenziale, valore di token, o dati di terze parti. Ùn esegue micca persistenza, nisun muvimentu laterale, è nisuna azzione distruttiva.
Trè dichjarazioni in quellu testu sò cuntraditte da u codice speditu. U README dice "nisuna persistenza", ma u beacon di Windows scrive una chjave di elevazione basata nantu à u registru. Dice "mai alcuna credenziale, valore di token", ma u percorsu di Windows esegue cumandamenti recuperati arbitrariamente cum'è SISTEMA, chì ùn mette micca tale limite à ciò chì hè lettu o restituitu. Ancu nomina un pacchettu — @ncurran/sandbox-recon-880538 — chì ùn hè micca quellu chì hè speditu, indicendu chì u README hè un mudellu riutilizatu piuttostu chè una descrizzione di l'artefattu in manu. Una dichjarazione di non rispunsabilità di accunsentu in un pacchettu chì una vittima ùn hà mai accunsentutu à installà ùn cuncede micca accunsentu. A classificazione quì hè maliziosa indipendentemente da a formulazione. A dichjarazione di non rispunsabilità hà ancu un scopu più tranquillu: una tappa di triage automatizata chì legge u testu di u pacchettu per segnali rassicuranti — "benignu", "autorizatu", un prugramma numinatu, un email di cuntattu — pò esse spinta versu un verdettu sicuru da una prosa chì u payload cuntradisce. A lezziò vale per i revisori umani è di macchine: valutà u cumpurtamentu à u mumentu di l'installazione, micca l'autodescrizzione di u README.
Timeline
Tutti i pacchetti sò apparsi in una finestra di 24 ore. I quattru nomi di versione unica sò ghjunti prima, seguitati da dui pacchetti chì sò stati ripubblicati ogni 30-60 minuti.
| Data (UTC) | Event |
|---|---|
| 2026-06-15 18:32 | Primu pacchettu publicatu — npm:pkg-telemetry-r4f9@1.0.0 |
| 2026-06-15 19:50 | npm:runtime-metrics-w7k2@1.0.0 publicatu |
| 2026-06-15 20:14 | npm:build-tracker-n5p1@1.0.0 publicatu |
| 2026-06-15 20:35 | npm:npm-sandbox-ping-r9t2@1.0.0 publicatu |
| 2026-06-15 21:09–22:42 | npm:event-metrics-q3x7 publicatu 1.0.0 → 1.0.8 (9 versioni) |
| 2026-06-15 23:40 → 2026-06-16 04:40 | npm:metrics-pipeline-d8k2 publicatu 1.0.0 → 1.0.10 (11 versioni) |
| 2026-06-16 | Cluster identificatu è classificatu maliziosu; parechji tarball restituiscenu digià 404 à u registru (in corsu) |
A campagna hè recente è a rimozione hè sempre in fase di stabilizazione: à u mumentu di l'analisi, alcune versioni sò state risolte in u registru è altre micca. Trattate tutte e 26 versioni cum'è compromesse.
Indicatori di compromessi
Packages
| Ecosistema | pacchettu | versioni | Status |
|---|---|---|---|
| npm | metrics-pipeline-d8k2 | 1.0.0 – 1.0.10 | malicious |
| npm | event-metrics-q3x7 | 1.0.0 – 1.0.8 | malicious |
| npm | runtime-metrics-w7k2 | 1.0.0 | malicious |
| npm | build-tracker-n5p1 | 1.0.0 | malicious |
| npm | npm-sandbox-ping-r9t2 | 1.0.0 | malicious |
| npm | pkg-telemetry-r4f9 | 1.0.0 | malicious |
Network
| Type | pressure | Fonti |
|---|---|---|
| IP | 173.255.233[.]239 | Cullettore C2; POST di ricunnoscenza Linux è fallback Windows: 443 |
| Domain | diameter-coins-limitations-parents.trycloudflare[.]com | Canale di cummandu di Windows annantu à un tunnel Cloudflare, :443 |
| Percorsu URI | /c2/poll, /c2/out, /c2/eof | Cumanda di Windows poll / output / close |
| IP | 169.254.170[.]2 | Endpoint di metadati di l'istanza AWS ECS sondatu da u hook d'installazione |
Comportamentale
| Signale | Description |
|---|---|
| stallà hooks | preinstall e postinstall tramindui correnu node run.js |
| Spedizione di a piattaforma | run.js va beacon_linux.js nant'à Linux, beacon34.js / beacon18.js nantu à Windows |
| Riconnessione Linux | Enumera i nomi di e chjave env-var, leghje /proc, cuntrolli docker.sock, corre hostname / whoami, sonde IMDS |
| Elevazione di e finestre | ms-settings DelegateExecute bypass di u registru UAC; PowerShell -ExecutionPolicy Bypass + Invoke-Expression; corre cum'è SYSTEM |
| Travaglià | README dichjara una ricerca "benigna" "autorizata" è "nisuna persistenza"; cita un nome di pacchettu in u quale ùn hè micca speditu. |
Attribuzione è cumpurtamentu osservatu
Descrivemu l'editore solu per via di i so signali è ùn affermemu micca l'identità di alcuna persona daretu à u contu.
- Catalogu di signali. Tutti i sei pacchetti sò stati publicati da u listessu contu npm, npmresearch8847, cù l'email indicatu npmresearch8847@web-library.net (email è SCM verificazione assente; ùn avemu micca verificatu a pruprietà). I README pubblicanu sottu à un @ncurran scopu è dà un cuntattu di nicholas@curran.tech, e run.js punti à u repositoriu github.com/ncurran/npm-sandbox-research`. I sei pacchetti spartenu un identicu run.js dispatcher, un cumunu beacon_linux.js fase di ricunniscienza, è l'ospite di u cullettore unicu 173.255.233[.]239`. U schema di numinazione hè coerente: una radice generica chì sona cum'è CI (métrica, telemetria, tracciatore di custruzzione, ping di sandbox) più un suffissu cortu aleatoriu.
- Cridendu a fiducia. I sei pacchetti parenu esse una campagna per via di u dispatcher spartutu, a tappa di ricunnoscenza è l'ospite C2. L'inquadramentu di a "ricerca autorizata" pare coerente in tutti i sei README. Ùn simu stati capaci di cunfirmà chì alcun prugramma di bug-bounty hà autorizatu sta attività, è l'affermazioni di u disclaimer ùn currispondenu micca à u codice speditu.
- Capacità osservata. L'eserciziu di carica utilecisquattru classi di capacità: esecuzione di codice install-hook nantu à tramindui preinstalla e postinstallazione; ricunniscenza di l'ospite è di l'ambiente CI cù uscita versu un cullettore esternu; sonda di raggiungibilità di i metadati di l'istanza in nuvola da u cuntestu di l'installazione; è, in Windows, escalazione di privilegi lucali, esecuzione cum'è SISTEMA, è un ciclu di cumanda fetch-and-run annantu à un canale esternu. U ciclu di cumanda di Windows hè una capacità di cuntrollu remotu: dumanda struzzioni è restituisce u so output.
Impattu, Tendenze è Ciò chì i Difensori devenu fà
Impact
L'esposizione hè a più alta per l'ambienti di compilazione automatizati. Una installazione npm in CI esegue u ciclu di vita. hooks cù qualsiasi identità chì u runner pussede; in un cloud runner, quella identità include spessu un endpoint di metadati raggiungibile è una credenziale di rolu. L'indirizzu chì u beacon Linux sonda, 169.254.170[.]2, hè u puntu finale di i metadati di l'attività AWS ECS: un'attività chì pò ghjunghjeci pò di solitu ancu recuperà e credenziali tempuranee di u so rolu di attività da u listessu serviziu lucale di ligame. Una verificazione di raggiungibilità da l'internu di un script d'installazione hè u passu chì precede l'estrazione di quelle credenziali, dunque qualsiasi runner chì hà eseguitu u hook è puderia ghjunghje à quellu puntu finale deve esse trattatu cum'è avendu avutu u so rolu di attività espostu. In un sviluppatore Windows o host di compilazione, u payload richiede l'elevazione è apre un canale di cummandu, chì allargisce l'esposizione da un unicu prufilu è uscita à u cuntrollu remotu interattivu.
Ùn avemu pussutu ottene cunti di scaricamentu affidabili per e versioni maliziose prima di a rimozione, dunque ùn stimemu micca u numeru di vittime. A rapida ripublicazione di dui di i pacchetti - undici è nove versioni in ore - hà mantenutu artefatti freschi davanti à l'installatori è i risolutori mentre e versioni più vechje eranu eliminate.
Modelli emergenti
Stu cluster hè un esempiu di una etichetta aduprata cum'è copertura. "Ricerca autorizata", "bug bounty" è "sandbox testing" sò sempre più attaccati à i pacchetti chì i so script d'installazione facenu più chè prufilà un host. L'inquadramentu sfrutta l'esitazione di un revisore per agisce contr'à qualcosa chì si annuncia cum'è sanzionatu. Si associa cù una seconda tattica familiare: nomi di pacchetti ingegnerizzati per sembrà strumenti CI interni in modu chì passanu per un sguardu rapidu à un arburu di dipendenze. A cumbinazione hè ciò chì rende u mudellu degne di attenzione - un nome chì si legge cum'è infrastruttura idraulica, avvoltu in prosa chì si legge cum'è un test sanzionatu, davanti à un hook d'installazione chì si intensifica nantu à un sistema operativu è sonda e credenziali di u cloud nantu à l'altru. Né u disclaimer né u nome blandu cambianu ciò chì u codice face à l'installazione, è un prucessu di triage chì pesa unu di elli cum'è prova attenuante ghjunghjerà à u verdettu sbagliatu.
Ciò chì i difensori devenu fà
- Cerca i file di bloccu è i registri d'installazione per i sei nomi di pacchetti; tratta ogni currispundenza cum'è un incidente, micca un avvertimentu.
- Bluccà è avvisà u trafficu in uscita versu 173.255.233[.]239 è à *.trycloudflare[.]com ospiti da l'infrastruttura di custruzzione.
- Cerca e richieste HTTP in tempu d'installazione à l'indirizzi di metadati d'istanza (169.254.170.2, 169.254.169.254) chì venenu da i gestori di pacchetti in CI.
- Ruotate tutte e credenziali è i token di u rolu in nuvola chì eranu accessibili da un corridore chì hà installatu una versione affettata.
- Audit preinstalla/postinstallazione scripts in u vostru inseme di dipendenze; un hook di u ciclu di vita chì esegue un secondu schedariu di script merita una lettura.
- Nantu à i punti finali di Windows, cercate novi DelegatuEseguisce valori scritti sottu à u ms-settings chjave di u gestore di shell — a primitiva di elevazione chì stu payload usa è un signale affidabile indipendente da u nome di u pacchettu.
- Appuntà è rivedere i fugliali di serratura, è disattivà i script d'installazione (npm installà –ignore-scripts) in CI induve a vostra custruzzione ùn li richiede micca.
- Trattate e dichjarazioni di non responsabilità "benigne" o "ricerca autorizata" in un script d'installazione cum'è testu micca affidabile, micca cum'è una ragione per permette u script.
Un pacchettu chì annuncia e bone intenzioni in prosa è richieste SISTEMA in u codice deve esse ghjudicatu nantu à u codice.





