TL; DR
Mellom 15.06.2026 og 16.06.2026 presset en enkelt npm-utgiver på seks pakker – totalt 26 versjoner — som kjører et installasjonsskript på alle npm installHver pakke sender med seg en README-fil som erklærer den som et «godartet» HackerOne/GitHub Bug Bounty-forskningsartefakt som «aldri» berører legitimasjonsverdier og «ikke utfører noen persistens». Koden samsvarer ikke med ansvarsfraskrivelsen. På Linux CI-kjørere fingeravtrykker installasjonskroken miljøet og undersøker et endepunkt for metadata for skyinstanser; på Windows ber den om heving, kjører som SYSTEM, og åpner en kommandokanal til en ekstern vert. Den ene indikatoren å søke etter nå er C2-verten 173.255.233[.]239Alvorlighetsgrad: høyBerørt økosystem: NPMNavn blandes inn i kontinuerlig integrasjonsavhengighetsstøy (metrics-pipeline-d8k2, event-metrics-q3x7, pkg-telemetry-r4f9og tre søsken).
Angrepet: Hvordan det fungerer
Hver pakke i klyngen er bygget på samme måte. pakke.json kobler den samme kommandoen til to livssykluser hooks:
{
"scripts": {
"preinstall": "node run.js",
"postinstall": "node run.js"
}
}Kjører på begge forhåndsinstallasjon og etterinstallasjon betyr at nyttelasten utløses uavhengig av om senere installasjonstrinn mislykkes eller ikke. run.js i seg selv er en plattformsentral med ti linjer:
// 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) {}Oppførselen deler seg deretter etter operativsystem. Alle seks pakkene inneholder de samme to delene – run.js og plattformbeacons – så de er utskiftbare droppere snarere enn seks forskjellige verktøy. Den eneste meningsfulle forskjellen mellom dem er publiseringskadens: fire navn ble sendt én gang, mens to ble utgitt på nytt hvert 30.–60. minutt i flere timer, noe som holder en fersk publisert versjon foran installatører og resolvere selv om eldre blir trukket.
På Linux (beacon_linux.js) skriptet profilerer der det kjører. Det lister opp navnene på miljøvariabler, leser filer under / proc, sjekker for docker.sock, og kjører vertsnavn og whoamiDeretter sender den en HTTP-forespørsel til AWS-containerens metadata-endepunkt. 169.254.170[.]2 — den link-lokale adressen en ECS-oppgave spør om for å hente sin egen konfigurasjon og kortlivede rollelegitimasjon (IMDS, instansmetadatatjenesten). Resultatene POSTES til kampanjens samler på 173.255.233[.]239.
På Windows (beacon34.js / beacon18.js) pakken gjør betydelig mer enn å profilere verten sin. Flaggekoden legger til en registernøkkel under ms-innstillinger håndterer med en DelegateExecute verdi — en kjent omgåelse av brukerkontokontroll som lar en startet prosess kjøre forhøyet uten en ledetekst. Den starter PowerShell med -ExecutionPolicy Bypass og Anrop-uttrykk, utføres i NT MYNDIGHET\SYSTEM kontekst, og avspør en ekstern vert etter kommandoer. Windows-kommandokanalen kjører over en Cloudflare-tunnel, diameter-mynter-begrensninger-foreldre.trycloudflare[.]com:443, faller tilbake til 173.255.233[.]239:443, ved bruk av tre endepunkter: /c2/avstemning å hente en kommando, /c2/ut for å returnere utdata, /c2/eof å lukke.
Hva er nytt her: ansvarsfraskrivelsen som kamuflasje
Det nye elementet er ikke nyttelasten – både install-hook-rekognosering og Windows-elevasjon er godt dokumentert. Det er forsidehistorien. Hver pakke inneholder en README-fil som leses som en responsible-disclosure-artefakt:
# @ncurran/sandbox-recon-880538 — authorized npm-sandbox security researchDette er en godartet pakke publisert under forfatterens eget `@ncurran`-omfang som en del av en autorisert HackerOne / GitHub Bug Bounty-engasjement (npm er innenfor omfanget).
Ved installasjon inspiserer den sitt eget utførelsesmiljø … miljøvariabel
bare nøkkelnavn … sjekker om velkjente skymetadata-endepunkter er nåbar … Den rapporterer bare statuskoder, svarlengder og hasher — aldri noen legitimasjon, tokenverdi eller tredjepartsdata. Den utfører ingen persistens, ingen lateral bevegelse og ingen destruktiv handling.
Tre påstander i den teksten motsiges av den leverte koden. README-filen sier «ingen persistens», men Windows-beaconen skriver en registerbasert elevasjonsnøkkel. Den sier «aldri noen legitimasjons- eller tokenverdi», men Windows-banen kjører vilkårlige hentede kommandoer som SYSTEM, som ikke setter noen slik grense for hva som leses eller returneres. Den navngir til og med en pakke – @ncurran/sandbox-recon-880538 – det er ikke den den sendes i, noe som indikerer at README-filen er en gjenbrukt mal snarere enn en beskrivelse av artefaktet. En samtykkeerklæring i en pakke et offer aldri har gått med på å installere, gir ikke samtykke. Klassifiseringen her er ondsinnet uavhengig av ordlyden. Ansvarsfraskrivelsen har også et roligere mål: et automatisert sorteringstrinn som leser pakketekst for beroligende signaler – «godartet», «autorisert», et navngitt program, en kontakt-e-postadresse – kan dyttes mot en sikker dom ved hjelp av prosa som nyttelasten motsier. Lærdommen gjelder for både menneskelige og maskinelle anmeldere: vei installasjonstidens oppførsel, ikke README-filens selvbeskrivelse.
Tidslinje
Alle pakkene dukket opp innenfor et 24-timers vindu. De fire navnene med én versjon kom først, etterfulgt av to pakker som ble publisert på nytt hvert 30.–60. minutt.
| Dato (UTC) | Event |
|---|---|
| 2026-06-15 18:32 | Første pakke publisert – npm:pkg-telemetry-r4f9@1.0.0 |
| 2026-06-15 19:50 | npm:runtime-metrics-w7k2@1.0.0 publisert |
| 2026-06-15 20:14 | npm:build-tracker-n5p1@1.0.0 publisert |
| 2026-06-15 20:35 | npm:npm-sandbox-ping-r9t2@1.0.0 publisert |
| 2026-06-15 21:09–22:42 | npm:event-metrics-q3x7 publisert 1.0.0 → 1.0.8 (9 versjoner) |
| 2026-06-15 23:40 → 2026-06-16 04:40 | npm:metrics-pipeline-d8k2 publisert 1.0.0 → 1.0.10 (11 versjoner) |
| 2026-06-16 | Klynge identifisert og klassifisert som skadelig; flere tarballer returnerer allerede 404 i registeret (pågående) |
Kampanjen er nylig utført, og fjerningen er fortsatt i ferd med å avgjøres: på analysetidspunktet ble noen versjoner løst i registeret, mens andre ikke ble det. Behandle alle 26 versjoner som kompromitterte.
Indikatorer for kompromiss
Nettsidepakker
| Økosystem | Pakke | versjoner | status |
|---|---|---|---|
| NPM | metrics-pipeline-d8k2 | 1.0.0 – 1.0.10 | skadelig |
| NPM | event-metrics-q3x7 | 1.0.0 – 1.0.8 | skadelig |
| NPM | runtime-metrics-w7k2 | 1.0.0 | skadelig |
| NPM | build-tracker-n5p1 | 1.0.0 | skadelig |
| NPM | npm-sandbox-ping-r9t2 | 1.0.0 | skadelig |
| NPM | pkg-telemetry-r4f9 | 1.0.0 | skadelig |
Network
| typen | Indikator | Merknader |
|---|---|---|
| IP | 173.255.233[.]239 | C2-samler; Linux-rekognosering POST og Windows-reserve: 443 |
| Domene | diameter-coins-limitations-parents.trycloudflare[.]com | Windows-kommandokanal over en Cloudflare-tunnel, :443 |
| URI-sti | /c2/poll, /c2/out, /c2/eof | Windows-kommando poll / output / close |
| IP | 169.254.170[.]2 | Endepunktet for AWS ECS-forekomstmetadata undersøkt fra installasjonskroken |
Behavioral
| Signal | Tekniske beskrivelser |
|---|---|
| Install hooks | preinstall og postinstall begge løper node run.js |
| Plattformforsendelse | run.js går beacon_linux.js på Linux, beacon34.js / beacon18.js på Windows |
| Linux-rekognosering | Lister opp env-var nøkkelnavn, leser /proc, sjekker docker.sock, løper hostname / whoami, sonder IMDS |
| Vinduernes høyde | ms-settings DelegateExecute omgåelse av brukerkontrollkonto i registeret; PowerShell -ExecutionPolicy Bypass + Invoke-Expression; kjører som SYSTEM |
| Disguise | README hevder "godartet", "autorisert" forskning og "ingen persistens"; refererer til et pakkenavn den ikke sendes i |
Attribusjon og observert atferd
Vi beskriver kun utgiveren gjennom signalene hans og hevder ikke identiteten til noen av personene bak kontoen.
- Signalkatalog. Alle seks pakkene ble publisert av den samme npm-kontoen, npmresearch8847, med den oppgitte e-postadressen npmresearch8847@web-bibliotek.net (e-post og SCM bekreftelse fraværende; vi har ikke bekreftet eierskap). README-filene publiseres under en @ncurran omfang og gi en kontakt med nicholas@curran.techog run.js poeng på depotet github.com/ncurran/npm-sandbox-research`. De seks pakkene deler en identisk run.js koordinator, en vanlig beacon_linux.js rekognoseringsfase, og den enkle samlerverten 173.255.233[.]239`. Navneskjemaet er konsistent: en generisk CI-klingende stamme (beregninger, telemetri, byggesporing, sandkasse-ping) pluss et kort tilfeldig suffiks.
- Tillit. De seks pakkene ser ut til å være én kampanje basert på den delte koordinatoren, rekognoseringsfasen og C2-verten. Innrammingen av «autorisert forskning» ser ut til å være konsistent på tvers av alle seks README-filene. Vi har ikke vært i stand til å bekrefte at noe bug-bounty-program autoriserte denne aktiviteten, og påstandene i ansvarsfraskrivelsen samsvarer ikke med den leverte koden.
- Observert evne. Nyttelastøvelsencisfire kapasitetsklasser: install-hook-kodekjøring på begge forhåndsinstallering og etterinstallasjon; rekognosering av verts- og CI-miljø med utgang til en ekstern samler; tilgangskontroll av metadata for skyinstanser fra installasjonskonteksten; og, på Windows, eskalering av lokale rettigheter, utførelse som SYSTEM, og en hent-og-kjør-kommandosløyfe over en ekstern kanal. Windows-kommandosløyfen er en fjernkontrollfunksjon: den avspør etter instruksjoner og returnerer utdataene.
Innvirkning, trender og hva forsvarere bør gjøre
Impact
Eksponeringen er høyest for automatiserte byggemiljøer. En npm-installasjon i CI kjører livssyklusen hooks med hvilken som helst identitet løperen har; på en skybasert løper inkluderer denne identiteten ofte et tilgjengelig metadata-endepunkt og en rollelegitimasjon. Adressen som Linux-beacon-probene undersøker, 169.254.170[.]2, er AWS ECS-endepunktet for oppgavemetadata: en oppgave som kan nå den, kan vanligvis også hente oppgaverollens midlertidige legitimasjonsinformasjon fra den samme link-lokale tjenesten. En tilgjengelighetssjekk fra innsiden av et installasjonsskript er trinnet som går forut for å hente disse legitimasjonsinformasjonene, så enhver løper som kjørte kroken og kunne nå det endepunktet, bør behandles som om oppgaverollen sin hadde blitt eksponert. På en Windows-utvikler eller build-vert ber nyttelasten om heving og åpner en kommandokanal, som utvider eksponeringen fra en enkelt profil-og-utgang til interaktiv fjernkontroll.
Vi klarte ikke å innhente pålitelige nedlastingstall for de skadelige versjonene før fjerning, så vi kan ikke anslå antall ofre. Den raske republiseringen av to av pakkene – elleve og ni versjoner i løpet av timer – holdt nye artefakter foran installatører og resolvere mens eldre versjoner ble fjernet.
Fremvoksende mønstre
Denne klyngen er et eksempel på en etikett som brukes som dekke. «Autorisert forskning», «bug bounty» og «sandkassetesting» blir i økende grad knyttet til pakker med installasjonsskript som gjør mer enn å profilere en vert. Innrammingen handler om en anmelders nøling med å handle mot noe som annonserer seg selv som sanksjonert. Det kobles sammen med en annen kjent taktikk: pakkenavn konstruert for å se ut som interne CI-verktøy, slik at de slipper forbi et raskt blikk på et avhengighetstre. Kombinasjonen er det som gjør mønsteret verdt å se på – et navn som leses som infrastrukturrørleggerarbeid, pakket inn i prosa som leses som en sanksjonert test, og som fronter en installasjonshook som eskalerer på ett operativsystem og undersøker skylegitimasjon på det andre. Verken ansvarsfraskrivelsen eller det intetsigende navnet endrer hva koden gjør ved installasjon, og en triageprosess som veier noen av dem som formildende bevis, vil komme til feil dom.
Hva forsvarere bør gjøre
- Søk i låsefiler og installer logger for de seks pakkenavnene; behandle ethvert treff som en hendelse, ikke en advarsel.
- Blokker og varsle om utgående trafikk til 173.255.233[.]239 og til *.trycloudflare[.]com verter fra å bygge infrastruktur.
- Søk etter HTTP-forespørsler til forekomstmetadataadresser under installasjon (169.254.170.2, 169.254.169.254) som stammer fra pakkebehandlere i CI.
- Roter alle skyrollelegitimasjoner og tokener som var tilgjengelige fra en løper som installerte en berørt versjon.
- Audit forhåndsinstallering/etterinstallasjon skript i din avhengighetssetten livssykluskrok som kjører en andre skriptfil fortjener å leses.
- På Windows-endepunkter, søk etter nye DelegateExecute verdier skrevet under ms-innstillinger shell-handler-nøkkel — elevasjonsprimitiven denne nyttelasten bruker og et pålitelig signal uavhengig av pakkenavnet.
- Fest og gjennomgå låsefiler, og deaktiver installasjonsskript (npm install –ignore-scripts) i CI der bygget ditt ikke krever dem.
- Behandle ansvarsfraskrivelser om «autorisert forskning» eller «godartede» elementer i et installasjonsskript som upålitelig tekst, ikke som en grunn til å tillate skriptet.
En pakke som annonserer gode intensjoner i prosa og forespørsler SYSTEM i koden bør bedømmes ut fra koden.







