Slip ng Pahintulot: npm Package na Nagtatago ng mga Banta sa Cloud at System

Slip ng Pahintulot: Isang Kwento ng Pabalat ng "Awtorisadong Pananaliksik" ng npm na Nagtatago ng mga Probe ng Cloud-Metadata at Pagtitiyaga ng SYSTEM

Tl; DR

Sa pagitan ng 2026-06-15 at 2026-06-16, isang npm publisher ang nagtulak anim na pakete — 26 na bersyon sa lahat — na nagpapatakbo ng install-time script sa bawat npm installAng bawat pakete ay nagpapadala ng README na nagdedeklarang ito ay isang "benign" na artifact sa pananaliksik ng HackerOne / GitHub Bug Bounty na "hindi kailanman" nakakaantig sa mga halaga ng kredensyal at "hindi gumaganap ng anumang persistence." Hindi tumutugma ang code sa disclaimer. Sa mga Linux CI runner, sinusuri ng install hook ang kapaligiran at sinusuri ang isang cloud instance-metadata endpoint; sa Windows, humihiling ito ng elevation, at tumatakbo bilang SYSTEM, at nagbubukas ng command channel papunta sa isang external host. Ang isang indicator na dapat hanapin ngayon ay ang C2 host 173.255.233[.]239Kalubhaan: mataasApektadong ekosistema: npmAng mga pangalan ay nagsasama sa ingay ng dependency ng patuloy na integrasyon (metrics-pipeline-d8k2, event-metrics-q3x7, pkg-telemetry-r4f9, at tatlong magkakapatid).

Ang Pag-atake: Paano Ito Gumagana

Ang bawat pakete sa kumpol ay binubuo sa parehong paraan. package.json ikinokonekta ang parehong utos sa dalawang lifecycle hooks:

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

Tumatakbo sa pareho pre-install at post-install nangangahulugan na gumagana ang payload kahit na mabigo o hindi ang mga susunod na hakbang sa pag-install. run.js mismo ay isang dispatcher ng platform na may sampung linya:

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

Ang kilos ay naghahati-hati ayon sa operating system. Ang lahat ng anim na pakete ay may parehong dalawang piraso — run.js at ang mga platform beacon — kaya ang mga ito ay mga mapagpapalit na dropper sa halip na anim na magkakaibang tool. Ang tanging makabuluhang pagkakaiba sa pagitan ng mga ito ay ang publish cadence: apat na pangalan ang ipinapadala nang isang beses, habang dalawa ang muling inilalabas bawat 30-60 minuto sa loob ng ilang oras, na nagpapanatili sa isang bagong-publish na bersyon sa harap ng mga installer at resolver kahit na kinukuha ang mga luma.

Sa Linux (beacon_linux.js) ang mga profile ng script kung saan ito tumatakbo. Binibilang nito ang mga pangalan ng mga environment variable, binabasa ang mga file sa ilalim ng / proc, mga tseke para sa docker.sock, at tumatakbo hostname at sino akoPagkatapos ay naglalabas ito ng HTTP request sa AWS container instance-metadata endpoint. 169.254.170[.]2 — ang link-local address ng isang ECS ​​task query ay nag-a-query upang makuha ang sarili nitong configuration at panandaliang role credentials (IMDS, ang instance metadata service). Ang mga resulta ay ipo-POST sa kolektor ng kampanya sa 173.255.233[.]239.

Sa Windows (beacon34.js / beacon18.js) ang pakete ay higit pa sa pag-profile lamang sa host nito. Ang naka-flag na code ay nagdaragdag ng registry key sa ilalim ng ms-setting tagapamahala na may DelegadoIpatupad value — isang kilalang user-account-control bypass na nagpapahintulot sa isang inilunsad na proseso na tumakbo nang naka-elevate nang walang prompt. Tinatawag nito ang PowerShell gamit ang -ExecutionPolicy Bypass at Invoke-Expression, isinasagawa sa NT AUTHORITY\SYSTEM konteksto, at nagpo-poll sa isang panlabas na host para sa mga command. Ang Windows command channel ay tumatakbo sa isang Tunel ng Cloudflare, mga limitasyon-ng-diyametro-ng-mga-barya-sa-mga-parent.trycloudflare[.]com:443, bumabalik sa 173.255.233[.]239:443, gamit ang tatlong endpoint: /c2/poll para kumuha ng utos, /c2/labas upang ibalik ang output, /c2/eof Isara.

Ano ang bago rito: ang disclaimer bilang pagbabalatkayo

Ang nobelang elemento ay hindi ang payload — ang install-hook reconnaissance at Windows elevation ay parehong mahusay na naidokumento. Ito ang pabalat na kwento. Ang bawat pakete ay may README na nagbabasa bilang isang responsableng pagsisiwalat na artifact:

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

Ito ay isang kaaya-aya paketeng inilathala sa ilalim ng sariling saklaw ng `@ncurran` ng may-akda bilang bahagi ng isang awtorisadong pakikipag-ugnayan sa HackerOne / GitHub Bug Bounty (nasa saklaw ang npm).

Sa pag-install, sinusuri nito sarili nitong kapaligiran sa pagpapatupad ... pabagu-bago ng kapaligiran

mga pangunahing pangalan lamang ... sinusuri kung kilalang-kilala mga endpoint ng metadata ng ulap ay maaabot … Iniuulat lamang nito ang mga status code, haba ng tugon, at mga hash — hindi kailanman anumang kredensyal, halaga ng token, o datos ng ikatlong partido. Hindi ito nagsasagawa ng anumang pagtitiyaga, walang paggalaw sa gilid, at walang mapanirang aksyon.

Tatlong pahayag sa tekstong iyon ang sinasalungat ng ipinadalang code. Sinasabi ng README na "walang persistence," ngunit ang Windows beacon ay nagsusulat ng registry-based elevation key. Sinasabi nito na "hindi kailanman anumang credential, token value," ngunit ang Windows path ay nagpapatakbo ng mga arbitraryong nakuha na command bilang SYSTEM, na walang limitasyon sa kung ano ang binabasa o ibinabalik. Nagpapangalan pa nga ito ng isang pakete — @ncurran/sandbox-recon-880538 — hindi iyon ang ipinapadala nito, na nagpapahiwatig na ang README ay isang muling ginamit na template sa halip na isang paglalarawan ng artifact na hawak. Ang isang disclaimer ng pahintulot sa isang pakete na hindi kailanman sinang-ayunan ng isang biktima na i-install ay hindi nagbibigay ng pahintulot. Ang klasipikasyon dito ay malisyoso anuman ang mga salita. Ang disclaimer ay mayroon ding mas tahimik na target: isang awtomatikong hakbang sa triage na nagbabasa ng teksto ng pakete para sa mga nakakapagpanatag na signal — "benign," "authorized," isang pinangalanang programa, isang email sa pakikipag-ugnayan — ay maaaring itulak patungo sa isang ligtas na hatol sa pamamagitan ng prosa na sinasalungat ng payload. Ang aral ay naaangkop para sa mga tagasuri ng tao at makina: timbangin ang pag-uugali sa oras ng pag-install, hindi ang paglalarawan sa sarili ng README.

timeline

Lahat ng pakete ay lumabas sa loob ng 24-oras na palugit. Ang apat na pangalan na may iisang bersyon ang unang dumating, na sinundan ng dalawang pakete na muling inilalathala kada 30-60 minuto.

Petsa (UTC) pangyayari
2026-06-15 18:32 Unang pakete na inilathala — npm:pkg-telemetry-r4f9@1.0.0
2026-06-15 19:50 npm:runtime-metrics-w7k2@1.0.0 nai-publish
2026-06-15 20:14 npm:build-tracker-n5p1@1.0.0 nai-publish
2026-06-15 20:35 npm:npm-sandbox-ping-r9t2@1.0.0 nai-publish
2026-06-15 21:09–22:42 npm:event-metrics-q3x7 nai-publish 1.0.0 → 1.0.8 (9 bersyon)
2026-06-15 23:40 → 2026-06-16 04:40 npm:metrics-pipeline-d8k2 nai-publish 1.0.0 → 1.0.10 (11 bersyon)
2026-06-16 Natukoy at nauri bilang malisyoso ang cluster; ilang tarball na ang nagbabalik ng 404 sa registry (nagpapatuloy pa rin)

Kamakailan lamang ang kampanya at ang pagtanggal ay inaayos pa lamang: sa oras ng pagsusuri, ang ilang bersyon ay nalutas sa registry at ang iba ay hindi. Ituring ang lahat ng 26 na bersyon bilang nakompromiso.

Mga Tagapagpahiwatig ng Kompromiso

Pakete

ecosystem pakete Mga bersyon katayuan
npm metrics-pipeline-d8k2 1.0.0 – 1.0.10 may masamang hangarin
npm event-metrics-q3x7 1.0.0 – 1.0.8 may masamang hangarin
npm runtime-metrics-w7k2 1.0.0 may masamang hangarin
npm build-tracker-n5p1 1.0.0 may masamang hangarin
npm npm-sandbox-ping-r9t2 1.0.0 may masamang hangarin
npm pkg-telemetry-r4f9 1.0.0 may masamang hangarin

network

uri Nagtuturo Mga Tala
IP 173.255.233[.]239 Kolektor ng C2; Linux recon POST at Windows fallback :443
Domain diameter-coins-limitations-parents.trycloudflare[.]com Channel ng utos ng Windows sa ibabaw ng isang tunnel ng Cloudflare, :443
Landas ng URI /c2/poll, /c2/out, /c2/eof Utos ng Windows na poll / output / close
IP 169.254.170[.]2 Sinuri ang endpoint ng metadata ng AWS ECS instance mula sa install hook

Pag-uugali

Senyas paglalarawan
I-install hooks preinstall at postinstall parehong tumatakbo node run.js
Pagpapadala ng plataporma run.js tumatakbo beacon_linux.js sa Linux, beacon34.js / beacon18.js sa Windows
Pagsusuri sa Linux Binibilang ang mga pangalan ng susi na env-var, binabasa /proc, mga tseke docker.sock, tumatakbo hostname / whoami, sinusuri ang IMDS
Pagtaas ng mga bintana ms-settings DelegateExecute Pag-bypass sa UAC ng rehistro; PowerShell -ExecutionPolicy Bypass + Invoke-Expression; tumatakbo bilang SYSTEM
Magkaila Inaangkin ng README na "benign" "authorized" ang pananaliksik at "no persistence"; tumutukoy sa pangalan ng pakete na hindi nito ipinapadala

Pagpapatungkol at naobserbahang pag-uugali

Inilalarawan lamang namin ang publisher sa pamamagitan ng mga senyales nito at hindi namin iginigiit ang pagkakakilanlan ng sinumang tao sa likod ng account.

  • Katalogo ng mga signal. Ang lahat ng anim na pakete ay inilathala ng parehong npm account, npmresearch8847, kasama ang nakasaad na email npmresearch8847@web-library.net (email at SCM (parehong wala ang beripikasyon; hindi pa namin nabeberipika ang pagmamay-ari). Ang mga README ay inilalathala sa ilalim ng isang @ncurran saklaw at magbigay ng kontak ng nicholas@curran.tech, at run.js mga punto sa imbakan github.com/ncurran/npm-sandbox-research`. Ang anim na pakete ay may magkaparehong run.js dispatcher, isang karaniwang beacon_linux.js yugto ng recon, at ang host ng nag-iisang kolektor 173.255.233[.]239`. Ang pamamaraan ng pagpapangalan ay pare-pareho: isang generic na CI-sounding stem (sukatan, Telemetry, tagasubaybay ng pagbuo, sandbox-ping) kasama ang isang maikling random na hulapi.
  • Tiwala. Ang anim na pakete ay tila iisang kampanya batay sa lakas ng shared dispatcher, recon stage, at C2 host. Ang "awtorisadong pananaliksik" na framing ay tila pare-pareho sa lahat ng anim na README. Hindi pa namin nakumpirma na may anumang bug-bounty program na nagpahintulot sa aktibidad na ito, at ang mga claim sa disclaimer ay hindi tumutugma sa ipinadalang code.
  • Naobserbahang kakayahan. Ang tagapagpatupad ng kargamentocisapat na klase ng kakayahan: pagpapatupad ng install-hook code sa pareho paunang pag-install at postinstall; pagmamanman sa host at CI-environment na may egress patungo sa isang panlabas na kolektor; pag-access sa cloud instance-metadata mula sa konteksto ng pag-install; at, sa Windows, pag-angat ng lokal na pribilehiyo, pagpapatupad bilang SYSTEM, at isang fetch-and-run command loop sa isang external channel. Ang Windows command loop ay isang remote-control na kakayahan: kumukuha ito ng mga instruksyon at ibinabalik ang kanilang output.

Epekto, Mga Uso at Ang Dapat Gawin ng mga Tagapagtanggol

EPEKTO

Pinakamataas ang exposure para sa mga automated build environment. Ang npm install sa CI ang nagpapatakbo ng lifecycle. hooks kahit anong pagkakakilanlan ang hawak ng runner; sa isang cloud runner, ang pagkakakilanlang iyon ay kadalasang may kasamang maaabot na metadata endpoint at isang role credential. Ang address na sinusuri ng Linux beacon, 169.254.170[.]2, ay ang AWS ECS task-metadata endpoint: ang isang gawain na makakarating dito ay kadalasang makakakuha rin ng pansamantalang mga kredensyal ng tungkulin ng gawain nito mula sa parehong link-local service. Ang pagsusuri sa reachability mula sa loob ng isang install script ay ang hakbang na nauuna sa pagkuha ng mga kredensyal na iyon, kaya ang sinumang runner na nagpatakbo ng hook at maaaring makarating sa endpoint na iyon ay dapat ituring na na-expose na ang tungkulin ng gawain nito. Sa isang Windows developer o build host, ang payload ay humihiling ng elevation at nagbubukas ng command channel, na nagpapalawak ng exposure mula sa isang profile-and-egress patungo sa interactive remote control.

Hindi namin nakuha ang maaasahang bilang ng mga download para sa mga malisyosong bersyon bago ang pagtanggal, kaya hindi namin tinatantya ang bilang ng mga biktima. Ang mabilis na muling paglalathala ng dalawa sa mga package — labing-isa at siyam na bersyon sa loob ng ilang oras — ay nagpanatili ng mga bagong artifact sa harap ng mga installer at resolver habang inaalis ang mga lumang bersyon.

Mga umuusbong na pattern

Ang kumpol na ito ay isang halimbawa ng isang label na ginagamit bilang pantakip. Ang "awtorisadong pananaliksik," "bug bounty," at "sandbox testing" ay lalong ikinakabit sa mga pakete na ang mga install script ay higit pa sa pag-profile ng isang host. Ang framing ay nagpapalitan sa pag-aatubili ng isang tagasuri na kumilos laban sa isang bagay na nagpapahayag ng sarili bilang sanctioned. Ito ay kapareha ng pangalawang pamilyar na taktika: ang mga pangalan ng pakete ay ginawa upang magmukhang internal CI tooling kaya't hindi ito agad nakikita sa isang dependency tree. Ang kombinasyon ang dahilan kung bakit sulit bantayan ang pattern — isang pangalan na parang infrastructure plumbing, na nakabalot sa prosa na parang sanctioned test, na nangunguna sa isang install hook na tumataas sa isang operating system at sumusuri sa mga cloud credential sa kabila. Hindi binabago ng disclaimer o ng simpleng pangalan ang ginagawa ng code sa pag-install, at ang isang proseso ng triage na tumitimbang sa alinman sa kanila bilang nagpapagaan na ebidensya ay hindi makakarating sa maling hatol.

Ang dapat gawin ng mga tagapagtanggol

  • Hanapin sa mga lockfile at install log ang anim na pangalan ng package; ituring ang anumang tugma bilang isang insidente, hindi isang babala.
  • Harangan at alerto ang papalabas na trapiko papunta sa 173.255.233[.]239 at upang *.trycloudflare[.]com mga host mula sa pagbuo ng imprastraktura.
  • Maghanap ng mga kahilingan sa HTTP sa oras ng pag-install papunta sa mga address ng instance-metadata (169.254.170.2, 169.254.169.254) na nagmumula sa mga package manager sa CI.
  • I-rotate ang anumang cloud role credentials at tokens na naabot mula sa isang runner na nag-install ng apektadong bersyon.
  • Pagtutuos ng kuwenta paunang pag-install/postinstall mga script sa iyong hanay ng dependency; ang isang lifecycle hook na nagpapatakbo ng pangalawang script file ay nararapat basahin.
  • Sa mga endpoint ng Windows, maghanap ng bago DelegadoIpatupad mga halagang nakasulat sa ilalim ng ms-setting shell-handler key — ang elevation primitive na ginagamit ng payload na ito at isang maaasahang signal na hiwalay sa pangalan ng package.
  • I-pin at suriin ang mga lockfile, at i-disable ang mga install script (npm install –ignore-scripts) sa CI kung saan hindi kinakailangan ng iyong build ang mga ito.
  • Ituring ang mga disclaimer na may "awtorisadong pananaliksik" o "mabuting" impormasyon sa loob ng isang install script bilang hindi mapagkakatiwalaang teksto, hindi bilang dahilan para payagan ang script.

Isang pakete na nagpapahayag ng mabubuting intensyon sa prosa at mga kahilingan SYSTEM sa code ay dapat husgahan batay sa code.

mga tool sa pagsusuri ng komposisyon ng software ng mga tool sa sca
Unahin, ayusin, at i-secure ang mga panganib ng iyong software
Kunin ang Iyong Libreng Account.
Walang kinakailangang credit card.

I-secure ang Iyong Pag-develop at Paghahatid ng Software

kasama ang Xygeni Product Suite