Toestemmingsformulier: npm-pakket dat cloud- en systeembedreigingen verbergt

Toestemmingsbewijs: Een dekmantel voor "geautoriseerd onderzoek" van npm die cloudmetadata-onderzoeken en systeempersistentie verbergt

TL; DR

Tussen 15 en 16 juni 2026 heeft één enkele npm-publisher een push uitgevoerd. zes pakketten — in totaal 26 versies — die een installatiescript uitvoeren op elke npm installElk pakket bevat een README-bestand waarin wordt verklaard dat het een "onschadelijk" HackerOne/GitHub Bug Bounty-onderzoeksartefact is dat "nooit" inloggegevens aanraakt en "geen persistentie uitvoert". De code komt niet overeen met de disclaimer. Op Linux CI-runners scant de installatiehook de omgeving en onderzoekt een endpoint voor cloud-instantiemetadata; op Windows vraagt ​​deze om beheerdersrechten en wordt uitgevoerd als SYSTEMen opent een commandokanaal naar een externe host. De enige indicator waarnaar nu gezocht moet worden, is de C2-host. 173.255.233[.]239. Ernst: hoog. Betrokken ecosysteem: NPMNamen versmelten tot de ruis van afhankelijkheden bij continue integratie (metrics-pipeline-d8k2, event-metrics-q3x7, pkg-telemetry-r4f9en drie broers en zussen).

De aanval: hoe werkt het?

Elk pakket in het cluster wordt op dezelfde manier gebouwd. package.json verbindt hetzelfde commando in twee levenscycli. hooks:

{   "scripts": {     "preinstall": "node run.js",     "postinstall": "node run.js"   } }

Op beide draaien pre-installatie en post-installatie Dit betekent dat de payload wordt uitgevoerd, ongeacht of latere installatiestappen mislukken. uitvoeren.js Het is zelf een platformdispatcher met tien regels:

// 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) {}

Het gedrag verschilt vervolgens per besturingssysteem. Alle zes pakketten bevatten dezelfde twee onderdelen — uitvoeren.js en de platformbakens — dus het zijn verwisselbare droppers in plaats van zes verschillende tools. Het enige wezenlijke verschil tussen hen is de publicatiefrequentie: vier namen werden eenmalig uitgebracht, terwijl twee namen urenlang elke 30-60 minuten opnieuw werden uitgebracht, waardoor er altijd een recent gepubliceerde versie beschikbaar is voor installatieprogramma's en resolvers, zelfs als oudere versies worden verwijderd.

Op Linux (beacon_linux.jsHet script analyseert de omgeving waarin het wordt uitgevoerd. Het somt de namen van omgevingsvariabelen op en leest bestanden onder / proc, controleert op docker.sock, en loopt hostname en whoamiVervolgens wordt een HTTP-verzoek verzonden naar het AWS-container-instantie-metadata-eindpunt. 169.254.170[.]2 — het link-local adres dat een ECS-taak opvraagt ​​om zijn eigen configuratie en kortstondige rolreferenties (IMDS, de instantie-metadataservice) te verkrijgen. De resultaten worden via POST naar de collector van de campagne verzonden. 173.255.233[.]239.

Op Windows (beacon34.js / beacon18.jsHet pakket doet aanzienlijk meer dan alleen de host profileren. De gemarkeerde code voegt een registersleutel toe onder de ms-instellingen begeleider met een DelegateExecute waarde — een bekende omzeiling van gebruikersaccountbeheer waarmee een gestart proces met verhoogde bevoegdheden kan worden uitgevoerd zonder prompt. Het roept PowerShell aan met -Uitvoeringsbeleid Bypass en Invoke-expressie, wordt uitgevoerd in de NT AUTORITEIT\SYSTEEM context, en peilt een externe host voor opdrachten. Het Windows-opdrachtkanaal werkt via een Cloudflare-tunnel, diameter-coins-limitations-parents.trycloudflare[.]com:443, terugvallen op 173.255.233[.]239:443, gebruikmakend van drie eindpunten: /c2/poll om een ​​commando op te halen, /c2/out om uitvoer terug te geven, /c2/eof sluiten.

Wat is hier nieuw: de disclaimer als camouflage.

Het nieuwe element zit hem niet in de payload — het verkennen van installatie-hooks en het verkrijgen van verhoogde toegang tot Windows zijn beide goed gedocumenteerd. Het zit hem in het dekmantelverhaal. Elk pakket bevat een README-bestand dat leest als een document dat verantwoordelijke openbaarmaking garandeert:

# @ncurran/sandbox-recon-880538 — authorized npm-sandbox security research

Dit is een goedaardig pakket gepubliceerd onder de eigen scope van de auteur `@ncurran` als onderdeel van een Geautoriseerde HackerOne/GitHub Bug Bounty-deelname (npm valt binnen het toepassingsgebied).

Tijdens de installatie wordt er een inspectie uitgevoerd. zijn eigen uitvoeringsomgeving … omgevingsvariabele

alleen sleutelnamen … controleert of het bekend is cloud-metadata-eindpunten zijn bereikbaar … Het rapporteert alleen statuscodes, reactielengtes en hashes — nooit Het versleutelt geen inloggegevens, tokenwaarden of gegevens van derden. Het voert geen acties uit. persistentie, geen zijwaartse beweging en geen destructieve actie.

Drie beweringen in die tekst worden tegengesproken door de meegeleverde code. De README zegt "geen persistentie", maar de Windows-beacon schrijft een registergebaseerde verhogingssleutel. Er staat "nooit referenties, tokenwaarde", maar het Windows-pad voert willekeurige opgehaalde commando's uit als SYSTEM, wat geen enkele beperking oplegt aan wat er gelezen of geretourneerd wordt. Het geeft zelfs een pakket een naam — @ncurran/sandbox-recon-880538 — dat is niet de versie waarin het wordt verzonden, wat erop wijst dat de README een hergebruikt sjabloon is in plaats van een beschrijving van het betreffende artefact. Een disclaimer in een pakket dat het slachtoffer nooit heeft goedgekeurd voor installatie, verleent geen toestemming. De classificatie is hier kwaadaardig, ongeacht de formulering. De disclaimer heeft ook een subtieler doelwit: een geautomatiseerde triage die de pakkettekst leest op geruststellende signalen — "goedaardig", "geautoriseerd", een benoemd programma, een contact-e-mailadres — kan worden beïnvloed richting een veilig oordeel door tekst die de inhoud van het pakket tegenspreekt. De les geldt voor zowel menselijke als geautomatiseerde beoordelaars: let op het gedrag tijdens de installatie, niet op de zelfbeschrijving in de README.

Timeline

Alle pakketten verschenen binnen een tijdsbestek van 24 uur. De vier pakketten die slechts in één versie beschikbaar waren, verschenen als eerste, gevolgd door twee pakketten die elke 30-60 minuten opnieuw werden gepubliceerd.

Datum (UTC) Evenementen
2026-06-15 18:32 Eerste pakket gepubliceerd — npm:pkg-telemetry-r4f9@1.0.0
2026-06-15 19:50 npm:runtime-metrics-w7k2@1.0.0 gepubliceerde
2026-06-15 20:14 npm:build-tracker-n5p1@1.0.0 gepubliceerde
2026-06-15 20:35 npm:npm-sandbox-ping-r9t2@1.0.0 gepubliceerde
2026-06-15 21:09–22:42 npm:event-metrics-q3x7 gepubliceerde 1.0.0 → 1.0.8 (9 versies)
2026-06-15 23:40 → 2026-06-16 04:40 npm:metrics-pipeline-d8k2 gepubliceerde 1.0.0 → 1.0.10 (11 versies)
2026-06-16 Cluster geïdentificeerd en geclassificeerd als kwaadaardig; diverse tarball-bestanden geven al een 404-foutmelding bij de registry (lopend onderzoek)

De campagne is recent en de verwijdering ervan is nog niet volledig afgerond: tijdens de analyse bleken sommige versies wel in het register te zijn opgenomen en andere niet. Beschouw alle 26 versies als gecompromitteerd.

Indicatoren van compromis

Arrangementen

Ecosysteem Pakket versies Status
NPM metrics-pipeline-d8k2 1.0.0 – 1.0.10 kwaadaardig
NPM event-metrics-q3x7 1.0.0 – 1.0.8 kwaadaardig
NPM runtime-metrics-w7k2 1.0.0 kwaadaardig
NPM build-tracker-n5p1 1.0.0 kwaadaardig
NPM npm-sandbox-ping-r9t2 1.0.0 kwaadaardig
NPM pkg-telemetry-r4f9 1.0.0 kwaadaardig

Netwerk

Type Indicator Notes
IP 173.255.233[.]239 C2-collector; Linux recon POST en Windows fallback :443
Domein diameter-coins-limitations-parents.trycloudflare[.]com Windows-opdrachtkanaal via een Cloudflare-tunnel, :443
URI-pad /c2/poll, /c2/out, /c2/eof Windows-opdracht poll / uitvoer / sluiten
IP 169.254.170[.]2 AWS ECS-instantie-metadata-eindpunt wordt onderzocht vanuit de installatiehook

Behavioral

Signaal Beschrijving
Install hooks preinstall en postinstall beide lopen node run.js
Perronverzending run.js loopt beacon_linux.js op Linux, beacon34.js / beacon18.js op Windows
Linux recon Geeft een overzicht van de namen van omgevingsvariabelensleutels en leest deze. /proc, controles docker.sock, loopt hostname / whoamiIMDS-sondes
Windows-gevel ms-settings DelegateExecute UAC-omzeiling in het register; PowerShell -ExecutionPolicy Bypass + Invoke-Expression; wordt uitgevoerd als SYSTEM
Vermommen De README beweert dat het om "onschadelijk", "geautoriseerd" onderzoek gaat en dat er "geen persistentie" is; er wordt verwezen naar een pakketnaam die niet wordt meegeleverd.

Toeschrijving en waargenomen gedrag

We beschrijven de uitgever alleen aan de hand van de signalen en beweren niet wie er achter het account schuilgaat.

  • Signalencatalogus. Alle zes pakketten werden gepubliceerd door hetzelfde npm-account. npmresearch8847, met het opgegeven e-mailadres npmresearch8847@web-library.net (e-mail en SCM (verificatie ontbreekt; we hebben het eigendom niet geverifieerd). De README's worden gepubliceerd onder een @ncurran bereik en geef een contactpersoon op nicholas@curran.techen uitvoeren.js wijst naar de repository github.com/ncurran/npm-sandbox-research`. De zes pakketten delen een identieke uitvoeren.js centralist, een veelvoorkomende beacon_linux.js verkenningsfase en de enkele collectorhost 173.255.233[.]239`. Het naamgevingsschema is consistent: een generieke CI-klinkende stam (metriek, telemetrie, build-tracker, sandbox-ping) plus een kort willekeurig achtervoegsel.
  • Vertrouwen. De zes pakketten lijken één campagne te vormen, gezien de gedeelde dispatcher, verkenningsfase en C2-host. De formulering "geautoriseerd onderzoek" lijkt consistent in alle zes README-bestanden. We hebben niet kunnen bevestigen dat een bug-bountyprogramma deze activiteit heeft geautoriseerd, en de beweringen in de disclaimer komen niet overeen met de geleverde code.
  • Waargenomen capaciteit. De belastingoefeningcises vier mogelijkhedenklassen: installatie-hook code-uitvoering op beide vooraf installeren en na installatie; verkenning van de host en de CI-omgeving met toegang tot een externe collector; onderzoek naar de bereikbaarheid van cloud-instantiemetadata vanuit de installatiecontext; en, op Windows, lokale privilege-escalatie, uitvoering als SYSTEMen een fetch-and-run-opdrachtlus via een extern kanaal. De Windows-opdrachtlus is een mogelijkheid voor afstandsbediening: hij peilt naar instructies en retourneert de uitvoer ervan.

Impact

Het risico is het grootst in geautomatiseerde buildomgevingen. Een `npm install` in CI voert de volledige levenscyclus uit. hooks met welke identiteit de runner ook heeft; bij een cloudrunner omvat die identiteit vaak een bereikbaar metadata-eindpunt en een rolreferentie. Het adres dat de Linux-beacon gebruikt, 169.254.170[.]2Dit is het AWS ECS-taakmetadata-eindpunt: een taak die dit eindpunt kan bereiken, kan doorgaans ook de tijdelijke referenties van de taakrol ophalen via dezelfde link-local service. Een bereikbaarheidscontrole vanuit een installatiescript is de stap die voorafgaat aan het ophalen van deze referenties. Elke runner die de hook heeft uitgevoerd en dit eindpunt kon bereiken, moet daarom worden beschouwd als een taakrol waarvan de toegang is ontzegd. Op een Windows-ontwikkelaars- of buildhost vraagt ​​de payload om verhoogde bevoegdheden en opent een commandokanaal, waardoor de blootstelling wordt uitgebreid van een enkel profiel en uitgang naar interactieve afstandsbediening.

We konden geen betrouwbare downloadcijfers verkrijgen voor de schadelijke versies voordat deze werden verwijderd, dus we kunnen het aantal slachtoffers niet schatten. De snelle herpublicatie van twee van de pakketten – elf en negen versies binnen enkele uren – zorgde ervoor dat installatieprogramma's en resolvers steeds met nieuwe versies werden geconfronteerd, terwijl oudere versies werden verwijderd.

Opkomende patronen

Deze cluster is een voorbeeld van hoe een label als dekmantel kan dienen. Labels als "geautoriseerd onderzoek", "bug bounty" en "sandbox-testen" worden steeds vaker gebruikt voor pakketten waarvan de installatiescripts meer doen dan alleen een host profileren. De formulering speelt in op de aarzeling van een reviewer om actie te ondernemen tegen iets dat zichzelf als geautoriseerd presenteert. Het wordt gecombineerd met een tweede bekende tactiek: pakketnamen die zo zijn ontworpen dat ze lijken op interne CI-tools, waardoor ze onopgemerkt blijven bij een snelle blik op de afhankelijkheidsstructuur. De combinatie maakt dit patroon de moeite waard om in de gaten te houden: een naam die klinkt als infrastructuurbeheer, verpakt in een tekst die klinkt als een geautoriseerde test, en die een installatiehook verbergt die op het ene besturingssysteem escaleert en op het andere cloudreferenties controleert. Noch de disclaimer, noch de nietszeggende naam verandert wat de code doet tijdens de installatie, en een triageproces dat een van beide als verzachtend bewijs meeweegt, zal tot een verkeerd oordeel leiden.

Wat verdedigers moeten doen

  • Doorzoek de lockfiles en installatielogboeken op de zes pakketnamen; beschouw elke overeenkomst als een incident, niet als een waarschuwing.
  • Blokkeer en waarschuw voor uitgaand verkeer naar 173.255.233[.]239 Samen *.trycloudflare[.]com hosts vanuit de bouwinfrastructuur.
  • Zoek naar HTTP-verzoeken tijdens de installatie naar instantie-metadata-adressen (169.254.170.2, 169.254.169.254) afkomstig van pakketbeheerders in CI.
  • Vervang alle cloudrolreferenties en -tokens die bereikbaar waren vanaf een runner die een getroffen versie heeft geïnstalleerd.
  • Audit vooraf installeren/na installatie scripts in uw afhankelijkheidssetEen lifecycle hook die een tweede scriptbestand uitvoert, is zeker het lezen waard.
  • Zoek op Windows-endpoints naar nieuwe DelegateExecute waarden geschreven onder de ms-instellingen shell-handler key — de verhogingsprimitief die deze payload gebruikt en een betrouwbaar signaal dat onafhankelijk is van de pakketnaam.
  • Vergrendelingsbestanden vastzetten en controleren, en installatiescripts uitschakelen (npm install –ignore-scripts) in CI waar uw build ze niet nodig heeft.
  • Beschouw disclaimers als "geautoriseerd onderzoek" of "onschadelijk" in een installatiescript als onbetrouwbare tekst, niet als reden om het script toe te staan.

Een pakket dat in proza ​​goede bedoelingen aankondigt en verzoeken indient. SYSTEM Code moet beoordeeld worden op de code zelf.

sca-tools-software-compositie-analyse-tools
Prioriteer, herstel en beveilig uw softwarerisico's
Maak nu een gratis account aan.
Geen kredietkaart nodig.

Beveilig uw softwareontwikkeling en -levering

met Xygeni-productsuite