Rizikingas verslas: savaime ištrinančių npm paketų paaiškinimas

Rizikingas verslas: antiprotekciniai paketai, kurie patys išsitrina

Lt; DR

Paketai patys išsitrina. Per penkiolika rugpjūčio dienų vienas npm operatorius paskelbė devynis paketus devyniais vardais iš septynių paskyrų ir aštuonis iš jų atsiėmė asmeniškai. Kiekvieno likęs galiojimo laikas sutrumpėjo nuo trylikos valandų iki septyniolikos minučių. Ši technika nėra vienintelė jų: dar septynis paketus iš nesusijusių operatorių, kuriuose buvo visiškai skirtingi naudingieji duomenys, jų pačių leidėjai atsiėmė vidutiniškai per 37.8 minutės. Artefaktas dingsta dar prieš paleidžiant daugumą gynybinių procesų, o diegimas jau įvyko.

Viskas, ką registras atskleidžia, keičiasi; naudingoji apkrova – ne. Visi devyni išsiuntė baitiškai identišką kodą bin/ kataloge tie patys SHA-256 santraukų rinkiniai trijuose paketų pavadinimuose ir dviejose paskyrose, su penkiolikos dienų skirtumu. Turinio tapatybė yra vienintelis sekimo signalas, kurio šis operatorius nenulaužė, o vienintelis paketas, kurio jie niekada neatsiėmė, yra priežastis, kodėl jį apskritai buvo galima ištirti.

Jį montuojantys žmonės nėra aukos ir vis tiek yra labai pažeidžiami. Ši priemonė nėra skirta kūrėjams: ji panaikina nuotolinį egzaminų stebėjimą naudodama paslėptą ekrano kopiją, teksto ištraukimą ekrane ir atsakymų grąžinimą į perdangą, todėl kas bėga npm install yra numatytas naudos gavėjas, o ne taikinys. Jie taip pat paleidžia nepasirašytą dvejetainį failą, kuris iššifruoja jų naršyklės slapukų saugyklą iš paskyros, kuri per valandą išsitrina. Jie negali gauti pataisos, vėliau negali patikrinti, ką paleido, ir negali pranešti apie žalą neatskleisdami, kodėl jį įdiegė.

Ekosistema: npm, tas pats modelis pastebėtas ir PyPI. Laikotarpis: 2026 m. birželis–rugpjūtis.

Matavimas

Užlaikymo laikas yra intervalas tarp paketo pasirodymo ir išnykimo, apskaičiuojamas pagal paties registro metaduomenis. Tai matavimai, o ne įvertinimai.

PaketasPaskelbta (UTC)Kairė stovinti
moidev2026-08-16 16:315val 58m
moidevx2026-08-17 03:2413val 23m
moidevz2026-08-26 03:3812val 56m
moideva2026-08-26 18:581val 33m
amicat2026-08-28 20:4817m
bmcat2026-08-28 21:1747m
eyevox2026-08-28 21:4421m
moidevh2026-08-31 03:2247m

Skaitant leidimo tvarka, langas susitraukia daugiau nei keturiasdešimt kartų – nuo ​​13 val. 23 min. plačiausiame lange iki 17 minučių siauriausiame lange. Pirmieji keturi paketai vidutiniškai trunka aštuonias su puse valandos; paskutiniai keturi – trisdešimt tris minutes. Rugpjūčio 28 d. per vieną 77 minučių laikotarpį buvo paskelbti ir pašalinti trys paketai.

Susitraukimas nėra laipsniškas dreifas. Jis sutelktas rugpjūčio 26–28 dienomis, o pasikeitė operatoriaus įvertinimas, kiek laiko pakuotė gali saugiai stovėti.

Kiekvieną pašalinimą čia inicijuoja leidėjas. Kiekvieno registro dokumente šalia rodomas tuščias prižiūrėtojų sąrašas. laikas.nepaskelbtas įrašas – paskelbimo panaikinimo, o ne pašalinimo parašas. Devintas paketas, eyious, niekada nebuvo atšauktas; tai yra priežastis, kodėl visa tai galėjo būti išnagrinėta.

Yra antras išėmimo iš darbo režimas, kurio nereikėtų painioti su šiuo. Kai tik Naudingosios apkrovos versija ištraukiama ir pakuotė išlieka, mediana yra maždaug 73 valandos 31 pakuotėje. Šie pakaitalai atkeliauja pagal scenarijų parengtomis partijomis ir palieka tuščią apvalkalą – a paketas.json deklaruojant pagrindinis kuris nesiunčia jokio failo – kurio vienintelė funkcija yra išsaugoti vardą. Tas režimas tvarko pagal tvarkaraštį. Šis yra sureguliuotas ekspozicijos langas.

Kas išlieka po ištrynimo

Devyni iš šių paketų yra vieno operatoriaus: moidev, moidevx, moidevz, moideva, moidevh, draugiškas, bmcat, eyevox bei eyiousPavadinimai neturi jokios konvencijos – kas nors, kas seka moidev „stem“ būtų praleidęs daugiau nei pusę jų – ir jie buvo paskelbti iš septynių atskirų paskyrų, beveik visos registruotos vienkartinio naudojimo el. pašto domenuose.

Jie dalijasi manifestiniu įrašu be jokios priežasties egzistuoti:

„dėžė“: { "": "bin/kalamasha-tool.js" } }

Prieš pašalinimą išsaugojome penkių kopijas. Visuose penkiuose – visas šiukšliadėžė/ katalogas yra baitų atžvilgiu identiškas:

filėSHA-256
bin/kalamasha-tool.js0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd
bin/uia_extract.exee2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865
bin/chrome_cookies.ps121b61ec810331850d72423c40c5448e6cd310c4cfad6aed54f92cd7e7cac5f3a
bin/stealth_capture.ps1c9baf5897c03b941c54f736df5af9243ad28794a9e69746d41d4f4a34065589c
bin/uia_extract.pyc20b38c63efd9221930095c54b42cdd5adffa1972c44c4578226cbe1e4dbac3e
bin/uia_get_text.ps14a3f3ada0bdf13aa8e89edb8af817c7816296147dae5be25f169ff960d28a87c

Dar du signalai sutampa. Trys paketai buvo paskelbti rugpjūčio 17, 26 ir 31 dienomis 03:24, 03:38 ir 03:22 UTC laiku – šešiolikos minučių trukmės juosta per penkiolika dienų ir trijose atskirose paskyrose. Be to, dvi iš šių paskyrų buvo užregistruotos tame pačiame vienkartiniame el. pašto domene, susiejant jas nepriklausomai nuo kodo.

Sąskaitos

Šios yra „npm“ leidėjų paskyros, iš kurių buvo išsiųstas naudingasis turinys, nurodant kiekvieną įkeltą paketą ir kiek laiko jis buvo paliktas veikti:

Leidėjo paskyraPaketasEl. pašto domenasKairė stovinti
letol39119moidev:1.0.0hutdot.com (vienkartinis)5val 58m
so1d1a7i27moidevx:1.0.0ogzmail.com (vienkartinis)13val 23m
lololololol435678eyiouss:3.0.21, 3.0.22, 4.0.1ogzmail.com (vienkartinis)vis dar publikuojamas
tagadob568moidevz:1.0.0ebflyai.com (vienkartinis)12val 56m
tayihim489moideva:1.0.0prodbits.com (vienkartinis)1val 33m
sahihai123amicat:1.0.0, bmcat:2.0.9, eyevox:1.0.0vartotojų žiniatinklio paštas17m / 47m / 21m
heytoshanmoidevh:1.0.0vartotojų žiniatinklio paštas47m

taip1d1a7i27 bei lololololol435678 dalintis ogzmail.com registracijos domenas – nuoroda, jungianti paskyrą, kurioje vis dar yra aktyvi kopija, su paskyra, kurioje buvo paskelbta pagal moidev stiebas dviem savaitėmis anksčiau. sahihai123 rugpjūčio 28 d. per vieną 77 minučių laikotarpį paskelbė ir atšaukė tris atskirus paketų pavadinimus. Heitošanas registruotas, paskelbtas moidevhir atsiėmė jį po 47 minučių; tai lieka vienintele tos paskyros publikacija.

Visos šios paskyros neturi patvirtinto el. pašto adreso, neturi patvirtintos nuorodos į šaltinio valdymo platformas ir nėra publikavusios jokio nesusijusio projekto. Šešiose iš septynių nebelieka jokių talpinamų duomenų.

Vienas paketas niekada nebuvo atsiimtas. eyiouss:4.0.1 buvo publikuotas nuo rugpjūčio 16 d. ir rašymo metu vis dar buvo išsprendžiamas. Aštuoni artefaktai buvo neatkurti; kampanija buvo visiškai rekonstruota iš to, kuris liko. Operatorius, kuris refleksyviai ištrina, galiausiai vis tiek paliks vieną.

Ką daro įrankis

eyiouss:4.0.1 „npm“ platformoje save apibūdina kaip „didelio našumo DOM įrankį ir diagnostikos tiltą šiuolaikinėms žiniatinklio programoms“. Tai ekrano kopijų fiksavimo ir atsakymų paieškos įrankis, sukurtas veikti nuotolinio egzaminų stebėjimo sistemoje, ir šaltinis tai teigia savo žodžiais.

Prieš paleisdamas paleidimo priemonę, ji nukopijuojama naudojant netikrą failo pavadinimą ir nurodo, ko vengiama:

// 🛡️ SLAPTŲ DVEJETAŽEČIŲ PAVADINIMAS: NETURI susidurti su tikru „Testpad“! const STEALTH_NAME = 'SearchApp.exe';

To paties failo antraštė jį vadina Anti-Proctor vaiduoklių sargybinis ir įgyvendina atgimimo ciklą, kuris tuo greičiau atsitraukia, kuo greičiau jis sunaikinamas. Kitur procesas padidina savo prioritetą. kovoti su procesoriaus apribojimu, išstumia egzamino programą iš priekinio plano, kai ji sufokusuojama, ir nutraukia saugaus egzamino naršyklės antrinį procesą su taskkill /F /T.

Fiksavimas vykdomas per susietą „PowerShell“ scenarijų, iškviečiant jį išjungus vykdymo politiką ir užblokavus langą, o ekrane rodomas tekstas renkamas lygiagrečiai naudojant „Windows UI Automation“. Eilėje esantys vaizdai ir tekstas pateikiami kalbos modelio sesijai įterptojoje naršyklėje, o atsakymas pateikiamas visada viršuje esančiame perdengime. Šis ryšys sąmoningai atidedamas, o kode nurodoma to priežastis: siekiant išvengti nuolatinio NETSTAT poveikio.

Pakuotė taip pat siunčiama chrome_cookies.ps1, vadovaujama CHROME sausainių ištraukiklis, kuris iššifruoja „Chrome“ ir „Edge“ slapukus per DPAPI ir nuskaito slapukų duomenų bazę iš iki keturių naršyklės profilių. Nurodyta iš ankstocisely: neradome šio skripto, iškviesto pagal pavadinimą, iš jokio atsiųsto „JavaScript“ failo. Yra ir pasiekiama tik naudojančioji pusė, kuri įterpja saugomus seanso slapukus į įterptąją naršyklę.

Žmonių, kurie jį įrengia, pozicija

Niekas to neįdiegia atsitiktinai. Jis neturi jokios funkcijos, išskyrus stebimą egzaminą, o jo rezultatas yra atsakymo perdanga vartotojo ekrane. Apgaulingas paketo aprašymas visiškai nėra skirtas diegimo programai – tai yra priedanga, nukreipta į registrą ir visus, kurie vėliau tikrina įrenginį. Diegimo programa žino, ką gauna; aprašymas egzistuoja, kad... įrašas diegimo informacija to neatspindi.

Nukentėjusios šalys yra trečiosios šalys, kurios niekada nelietė npm: egzaminą organizuojanti įstaiga, kiti kandidatai ir visi paskesni procesai, kurie remiasi kvalifikacijos reikšme.

Tačiau montuotojas todėl nėra saugus, ir šią dalį verta paminėti, nes pats dingstančio paketo modelis sukuria apšvitą.

Jie paleidžia nepasirašytą dvejetainį failą iš niekieno. uia_extract.exe Sukompiliuoti failai, be šaltinio ir kilmės duomenų, iš paskyros, kuri nebeegzistuoja. Tas pats failas, naudojant maišos kodą, buvo pakartotinai publikuotas letol39119, taip1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123 bei Heitošanas per penkiolika dienų. Nėra prižiūrėtojo, kurio reikėtų paklausti, nėra saugyklos, kurią būtų galima skaityti, ir nėra istorijos, kurią būtų galima patikrinti – kiekviena jį išsiuntusi tapatybė pati išsitrynė.

Jie suteikė jai būtent tas galimybes, kurių reikia kenkėjiškoms programoms. Paslėptas procesas, veikiantis netikru pavadinimu, kuris iššifruoja naršyklės slapukų saugyklą, nuolat skaito ekraną, nutraukia saugos programinės įrangos veikimą ir vėl paleidžiamas, kai ji išjungiama. Šiandien slapukų iššifravimas apsiriboja vieno tiekėjo domenais ir aptarnauja paties vartotojo sesiją. Ši apimtis yra vienos eilutės pakeitimas, ir niekas apie pristatymo modelį nebūtų rodoma, jei jis pasikeistų – naujas vardas, nauja paskyra, naujas įkėlimas.

Jie negali gauti pataisos. Paketo publikavimas atšaukiamas per valandą. Nėra jokio atnaujinimo kelio, jokio pranešimo ir jokio būdo vėliau sužinoti, kad jų įdiegta versija skyrėsi nuo tos, kurią įdiegė jų draugas. Kas yra kompiuteryje, tas ir lieka jame.

Jie negali patikrinti, ką atliko. Jų užrakinimo failas dabar nurodo paketą, kurio nebegalima išspręsti. Jei vėliau, po incidento ar ginčo, jie norėtų išsiaiškinti, kas buvo jų kompiuteryje, registras neturėtų jokio įrašo, kurį galėtų jiems pateikti.

Ir jie negali pranešti apie žalą. Šio įrankio paveiktas vartotojas negali pateikti pranešimo apie piktnaudžiavimą neatskleidęs, kodėl jį įdiegė. Tai nėra atsitiktinumas. Registro piktnaudžiavimo ataskaitos yra pagrindinis kanalas, kuriuo sugaunami trumpalaikiai paketai, o šio operatoriaus vartotojų bazė struktūriškai negali jo naudoti. Vienintelis likęs priešininkas yra automatinis nuskaitymas, pagal kurį sukalibruotas septyniolikos minučių langas.

Aukos struktūra ir išlaikymo trukmė yra tas pats faktas, pastebėtas du kartus. Tai taip pat paaiškina laiko juostos anomaliją: jei pasitraukimą lemtų skundų baimė, pirmiausia būtų atsisakyta ilgai gyvavusio populiaraus paketo. Taip nenutiko, nes skundai niekada nekyla.

Tas pats modelis, kitas operatorius

Proktoriaus operatorius nėra vienintelis, kuris tai daro, ir aiškiausias lygiagretusis veikimas atliekamas su nesusijusiu naudinguoju kroviniu.

Rugpjūčio 24–27 d. pasirodė keturi npm paketai, kurių pavadinimai buvo pasiskolinti iš dviejų veiksnių autentifikavimo įrankių. auth-otp, slaptasis raktas-2fa, slaptasis raktas2fa bei 2fa-slaptasis raktas — nešdamos šešiolika versijų. Kiekviena buvo paskelbta iš savo naujai užregistruotos paskyros (beayilol, jeanpaul686g, zzzalipay, dluuuuu), visi el. pašto adresai nepatikrinti, nė vienas neturi patvirtintos šaltinio kontrolės nuorodos, nė vienas neskelbia nieko kito. Kiekvieną atšaukė jo paties leidėjas.

Naudingoji apkrova neturi nieko bendra su egzamino programine įranga. Ji nuskaito naršyklės kredencialų saugyklas ir „Discord“ žetonus bei atlieka „Xbox Live“ autentifikavimo kopėčias prieš „Minecraft“ paleidimo priemonę, kad užfiksuotų atnaujinimo žetoną. Čia diegimo programa. is auka įprastąja prasme – todėl palyginimas yra naudingas, nes pristatymo elgesys yra identiškas nepaisant to.

Keturi ciklai vyko publikavimo tvarka: 274.9, 37.8, 37.6 ir 35.7 minutės: vienas ilgas pirmas bandymas, tada konvergavimas ties skaičiumi, kuris išlieka. Dar trys paketai vėl priklauso kitiems operatoriams ir rodo tą pačią išėmimo elgseną.

PaketasoperatoriusKairė stovinti
octopus-actionžvalgybos švyturys2.5 min
mt-ts-serverless-starteržvalgybos švyturys9.6 min
2fa-secretkey2FA priedangos vardai35.7 min
secretkey2fa2FA priedangos vardai37.6 min
secretkey-2fa2FA priedangos vardai37.8 min
auth-otp2FA priedangos vardai274.9 min
hex-encode-utilskitas724.2 min

Septyni paketai, mediana 37.8 minutės, nė vienas iš jų nesusijęs su egzaminų programine įranga.

Trys nesusiję naudingieji krūviai, trys nesusiję sąskaitų rinkiniai, viena bendra technika.

Kodėl langas užsidaro

2026 m. registro aplinkoje kažkas pasikeitė, ir akivaizdus veiksnys yra tas, kad nuskaitymas tapo greitesnis.

Iki šiol kenkėjiški paketai buvo aptinkami daugiausia po fakto: vartotojui ką nors pastebėjus, gavus pranešimą iš tolesnio serverio arba periodiškai tikrinant. Aptikimo delsa buvo matuojama dienomis. Tai nebėra vienintelis režimas. Beveik realiuoju laiku atliekama naujai paskelbtų paketų analizė – „Xygeni“ ankstyvojo įspėjimo apie kenkėjiškas programas sistema tarp vis didėjančio tokių sistemų rinkinio visoje pramonėje – sumažina atotrūkį tarp publikavimo ir patikrinimo iki daug trumpesnio.

Operatorius susiduria su dviem variantais. Apsunkinti naudingosios apkrovos atpažinimą arba sutrumpinti laiką, per kurį ją galima peržiūrėti. Antrasis variantas yra pigesnis, nereikalauja jokių inžinerijos darbų, o registras šį mechanizmą suteikia nemokamai: per npm 72 valandų publikavimo atšaukimo laikotarpį leidėjas gali vienašališkai pašalinti paketą, o pavadinimą galima pakartotinai naudoti vėliau. Pašalinimas operatoriui nieko nekainuoja.

Laikas sutampa. Abu aukščiau pateikti operatoriai konverguoja ties skaičiumi ir jį išlaiko, užuot dreifavęs, o tai labiau atrodo kaip suderintas parametras, o ne dėl patogumo. O parametras, ties kuriuo jie konvergavo – dešimtys minučių – yra priešcisbūtent tokią padėtį, kurioje jis turėtų būti, kad įveiktų automatinio patikrinimo reikalavimus, tuo pačiu paliekant paketą įdiegimą pakankamai ilgai, kad pasiektų savo auditoriją.

Tai lieka hipoteze. Laiko duomenys negali atskirti atsako į nuskaitymą nuo atsako į registro vykdymą ar nuo įprasto operacinio brendimo, kai šie operatoriai mokosi vieni iš kitų. Tai, ką galima pasakyti nedarant išvadų, yra siauresnė ir vis tiek naudinga: Ekspozicijos langas dabar pakankamai trumpas, kad bet kokia kontrolė, priklausanti nuo pakuotės patikrinimo po paskelbimo, lenktyniauja su operatoriaus nustatytu laiku. Valdikliai, kurie nepriklauso nuo patikrinimo – karantinas pagal amžių, išjungti diegimo scenarijai – neturi įtakos šiai rasei, todėl praktiškai juos verta rinktis.

Ką daryti su tuo

Karantinas pagal amžių. Niekas iš laikymo laiko lentelės neišliko trylika valandų. Politika, pagal kurią jokia priklausomybės versija negali būti įdiegta, kol ji neegzistuoja 72 valandas, būtų išskyrusi kiekvieną iš jų nieko neaptikus.

Pagal numatytuosius nustatymus išjungti diegimo scenarijus. –Ignoruoti scenarijus pašalina pristatymo mechanizmą, nuo kurio priklauso šiame korpuse esantys kredencialų vagiantys paketai. Tai nepadeda nuo įrankio, kurį vartotojas naudoja sąmoningai, kuris yra iš ankstocistikrai vertas supratimo skirtumas.

Dingimą traktuokite kaip saugumo įvykį. Įspėti, kai įdiegta priklausomybė nustoja veikti. Įrodymai saugomi jūsų užrakinimo faile, o ne registre.

Stebėkite turinį, o ne vardus. Šešios aukščiau pateiktos santraukos sutampa nepriklausomai nuo paketo pavadinimo, leidėjo paskyros ar versijos eilutės – kiekvienas šio operatoriaus parodytas laukas pasikeis. Registro pusės taisyklė, pagal kurią naujai užregistruota paskyra, per valandą atsiimanti savo vienintelį paketą, yra praneštinas modelis, būtų suveikė kiekvienam paketui, vien tik pagal metaduomenis.

O jei svarstote apie šios kategorijos įrangos diegimą: Ypatybės, kurias registrui sunku aptikti, yra tos pačios, dėl kurių jūs neturite jokių teisių gynimo priemonių. Nėra jokio leidėjo, kuris būtų laikomas atsakingu, nėra atnaujinimo kelio ir nėra įrašų apie tai, ką vykdėte.

rodikliai

TipasReikšmė
filėbin/kalamasha-tool.js — ne-standard šiukšliadėžės įėjimo taškas
SHA-2560c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd
SHA-256e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865
ProcesasSearchApp.exe parašyta šalia teisėtos „Electron“ vykdymo aplinkos
elgsenapowershell -ExecutionPolicy Bypass -File su windowsHide: true
elgsenataskkill /F /T nukreiptas į saugaus egzamino naršyklės procesą
metaduomenųTuščias prižiūrėtojų sąrašas šalia a time.unpublished įrašas
sąskaitosletol39119, so1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123, heytoshan
Registracijaogzmail.com, hutdot.com, ebflyai.com, prodbits.com – vienkartinio pašto domenai

Nuorodos

sca-tools-software-composition-analyses-tools
Prioritetizuoti, pašalinti ir apsaugoti savo programinės įrangos rizikas
Gaukite nemokamą paskyrą.
Nebūtina kreditinės kortelės.

Apsaugokite savo programinės įrangos kūrimą ir tiekimą

su „Xygeni“ produktų rinkiniu