Negoci arriscat: explicació de l'autoeliminació dels paquets npm

Negoci arriscat: els paquets anti-supervisió que s'esborren a si mateixos

TL; DR

Els paquets s'esborren sols. Durant quinze dies a l'agost, un operador de npm va publicar nou paquets amb nou noms de set comptes i en va retirar vuit personalment. El temps que es va deixar en blanc per a cadascun va caure de tretze hores a disset minuts. La tècnica no és només seva: set paquets més d'operadors no relacionats, que portaven càrregues útils completament diferents, van ser retirats pels seus propis editors amb una mitjana de 37.8 minuts. L'artefacte desapareix abans que s'executin la majoria dels processos defensius i la instal·lació ja s'ha produït.

Tot el que exposa el registre rota; la càrrega útil no. Tots nou van enviar un byte idèntic bin/ directori, els mateixos resums SHA-256 en tres noms de paquets i dos comptes, amb quinze dies de diferència. La identitat del contingut és l'únic senyal de seguiment que aquest operador no ha trencat, i l'únic paquet que mai no han retirat és la raó per la qual es va poder examinar res d'ell.

Les persones que ho instal·len no són víctimes i, de totes maneres, estan molt exposades. Aquesta eina no està dirigida a desenvolupadors: evita la supervisió remota d'exàmens mitjançant la captura de pantalla oculta, l'extracció de text en pantalla i les respostes retornades a una capa superposada, de manera que qui corre npm install és el beneficiari previst en lloc de l'objectiu. També executen un binari sense signar que desxifra el magatzem de galetes del navegador, des d'un compte que s'elimina en una hora. No poden rebre una correcció, no poden auditar més tard el que han executat i no poden informar de danys sense revelar per què l'han instal·lat.

Ecosistema: npm, mateix patró observat a PyPI. Període: Juny–agost de 2026.

La mesura

El temps de permanència és l'interval entre l'aparició i la desaparició d'un paquet, calculat a partir de les metadades del registre. Aquestes són mesures, no estimacions.

paquetPublicat (UTC)Esquerra dempeus
moidev2026-08-16 16:315 h 58 min
moidevx2026-08-17 03:2413 h 23 min
moidevz2026-08-26 03:3812 h 56 min
moideva2026-08-26 18:581 h 33 min
amicat2026-08-28 20:4817m
bmcat2026-08-28 21:1747m
eyevox2026-08-28 21:4421m
moidevh2026-08-31 03:2247m

Llegida en ordre de publicació, la finestra es contrau en més d'un factor de quaranta: de 13 h 23 min en la més ampla a 17 minuts en la més estreta. Els primers quatre paquets tenen una mitjana de vuit hores i mitja; els últims quatre tenen una mitjana de trenta-tres minuts. El 28 d'agost, es van publicar i retirar tres paquets en un sol interval de 77 minuts.

La contracció no és una deriva gradual. Es concentra entre el 26 i el 28 d'agost, i el que va canviar va ser l'estimació de l'operador de quant de temps pot aguantar un paquet amb seguretat.

Cada retirada aquí és iniciada per l'editor. El document de registre de cadascuna mostra una llista de mantenidors buida al costat d'un temps.inèdit registre: la signatura d'una despublicació en lloc d'una supressió. Un novè paquet, eyouss, mai es va retirar en absolut; és la raó per la qual es va poder examinar tot això.

Existeix un segon règim de retirada i no s'ha de confondre amb aquest. On només el versió de càrrega útil s'extreu i el paquet sobreviu, la mitjana és d'aproximadament 73 hores en 31 paquets. Aquests reemplaçaments arriben en lots amb script i deixen una closca buida: una paquet.json declarant un principal que no envia cap fitxer, l'única funció del qual és mantenir el nom. Aquest règim és de manteniment segons un horari. Aquesta és una finestra d'exposició sintonitzada.

Què sobreviu a l'eliminació

Nou d'aquests paquets són d'un sol operador: moidev, moidevx, moidevz, moideva, moidevh, amicat, bmcat, eyevox i eyoussEls noms no comparteixen cap convenció: ningú que faci un seguiment de la moidev stem n'hauria perdut més de la meitat, i es van publicar des de set comptes separats, gairebé tots registrats en dominis de correu electrònic d'un sol ús.

El que comparteixen és una entrada de manifest sense cap raó per existir:

"papera": { "": "bin/kalamasha-tool.js" } }

Vam conservar còpies de cinc abans de retirar-les. En totes cinc, la totalitat paperera/ el directori és idèntic en bytes:

DossierSHA-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

Dos senyals més coincideixen. Tres dels paquets es van publicar a les 03:24, 03:38 i 03:22 UTC els dies 17, 26 i 31 d'agost, una franja de setze minuts durant quinze dies i tres comptes separats. I dos d'aquests comptes es van registrar al mateix domini de correu electrònic d'un sol ús, cosa que els unia independentment del codi.

Els comptes

Aquests són els comptes d'editor npm que van enviar la càrrega útil, amb el paquet carregat per a cadascun i quant de temps va estar en repòs:

Compte d'editorpaquetDomini de correu electrònicEsquerra dempeus
letol39119moidev:1.0.0hutdot.com (d'un sol ús)5 h 58 min
so1d1a7i27moidevx:1.0.0ogzmail.com (d'un sol ús)13 h 23 min
lololololol435678eyiouss:3.0.21, 3.0.22, 4.0.1ogzmail.com (d'un sol ús)encara publicat
tagadob568moidevz:1.0.0ebflyai.com (d'un sol ús)12 h 56 min
tayihim489moideva:1.0.0prodbits.com (d'un sol ús)1 h 33 min
sahihai123amicat:1.0.0, bmcat:2.0.9, eyevox:1.0.0correu web de consum17m / 47m / 21m
heytoshanmoidevh:1.0.0correu web de consum47m

so1d1a7i27 i lololololol435678 compartiu el ogzmail.com domini de registre: l'enllaç que vincula el compte que encara allotja una còpia en directe amb el compte que va publicar sota el moidev tija dues setmanes abans. sahihai123 va publicar i retirar tres noms de paquets separats dins d'una única finestra de 77 minuts el 28 d'agost. heytoshan registrat, publicat moidevh, i el va retirar 47 minuts més tard; continua sent l'única publicació d'aquest compte.

Cap d'aquests comptes té el correu electrònic no verificat, no porta cap enllaç de control de font verificat i no ha publicat cap projecte no relacionat. Sis dels set ja no allotgen res.

No es va retirar mai cap paquet. eyiouss:4.0.1 s'ha publicat des del 16 d'agost i encara es podia resoldre en el moment d'escriure aquest article. Vuit artefactes eren irrecuperables; la campanya es va reconstruir completament a partir del que va quedar. Un operador que elimina reflexivament, finalment, en deixarà un en peu.

Què fa l'eina

eyiouss:4.0.1 es descriu a si mateix a npm com una "utilitat DOM d'alt rendiment i pont de diagnòstic per a aplicacions web modernes". És una eina de captura de pantalla i recuperació de respostes creada per executar-se sota la supervisió remota d'exàmens, i la font ho diu amb les seves pròpies paraules.

El llançador copia el temps d'execució d'Electron amb un nom de fitxer fals abans d'executar-lo i anomena el que està evitant:

// 🛡️ NOM BINARI STEALTH: NO ha de xocar amb el Testpad real! const STEALTH_NAME = 'SearchApp.exe';

La mateixa capçalera del fitxer l'anomena un Vigilant fantasma anti-Proctor i implementa un bucle de reaparició que retrocedeix més com més ràpid es tanca. En altres llocs, el procés augmenta la seva pròpia prioritat. per combatre la limitació de la CPU de la supervisió, treu l'aplicació d'examen del primer pla quan pren el focus i finalitza un procés secundari del navegador d'examen segur amb taskkill /F /T.

La captura s'executa mitjançant un script de PowerShell inclòs invocat amb la política d'execució desactivada i la finestra suprimida, amb el text en pantalla recollit en paral·lel a través de l'automatització de la interfície d'usuari de Windows. Les imatges i el text en cua s'envien a una sessió de model d'idioma en un navegador incrustat i la resposta es representa en una superposició sempre a la part superior. Aquesta connexió s'ajorna deliberadament i el codi n'explica el motiu: per evitar l'exposició permanent a NETSTAT.

El paquet també s'envia galetes_de_crom.ps1, dirigit EXTRACTOR DE GALETES DE CROM, que desxifra les galetes de Chrome i Edge mitjançant DPAPI i llegeix la base de dades de galetes de fins a quatre perfils de navegador. Indicat anteriormentcisely: no hem trobat aquest script invocat pel seu nom des de cap fitxer JavaScript enviat. El que sí que és present i accessible és la meitat consumidora, que injecta les galetes de sessió emmagatzemades al navegador incrustat.

La posició de les persones que l'instal·len

Ningú instal·la això per accident. No té cap funció fora d'un examen supervisat, i la seva sortida és una superposició de resposta a la pantalla de l'usuari. La descripció enganyosa del paquet no està dirigida a l'instal·lador en absolut, sinó que és una enganyosa dirigida al registre i a qualsevol que auditi la màquina posteriorment. L'instal·lador sap què està rebent; la descripció existeix, de manera que... registre de la instal·lació no ho reflecteix.

Les parts perjudicades són tercers que mai han tocat npm: la institució que organitza l'examen, els altres candidats i tots els que treballen aigües avall i que confien en el significat de les credencials.

Però l'instal·lador no és per tant segur, i aquesta és la part que val la pena explicar, perquè el model de paquet que desapareix és en si mateix el que crea l'exposició.

Estan executant un binari sense signar de ningú. uia_extract.exe naus compilades, sense font ni procedència de compilació, des d'un compte que ja no existeix. El mateix fitxer, mitjançant hash, ha estat tornat a publicar per letol39119, so1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123 i heytoshan durant quinze dies. No hi ha cap mantenidor a qui preguntar, cap repositori a llegir i cap historial a comprovar: totes les identitats que l'han enviat s'han suprimit.

Li han atorgat exactament les capacitats que necessita el programari maliciós. Un procés ocult, que s'executa sota un nom fals, que desxifra l'emmagatzematge de galetes del navegador, llegeix la pantalla contínuament, tanca el programari de seguretat i reapareix quan es tanca. Avui dia, el desxifrat de les galetes està limitat als dominis d'un proveïdor i serveix la sessió pròpia de l'usuari. Aquest abast és un canvi d'una sola línia, i res del model de lliurament el mostraria si canviés: un nom nou, un compte nou, una nova càrrega.

No poden rebre una reparació. El paquet es publica en una hora. No hi ha cap ruta d'actualització, cap avís i cap manera de saber més tard que la versió que han instal·lat és diferent de la que ha instal·lat el seu amic. El que hi hagi a la màquina s'hi queda.

No poden auditar el que han executat. El seu fitxer de bloqueig ara fa referència a un paquet que ja no es resol. Si més tard volguessin establir què hi havia a la seva màquina (després d'un incident o una disputa), el registre no té cap registre per proporcionar-los.

I no poden denunciar danys. Un usuari compromès per aquesta eina no pot presentar un informe d'abús sense revelar per què l'ha instal·lat. Això no és casual. Els informes d'abús del registre són un canal principal pel qual es detecten els paquets de curta durada, i la base d'usuaris d'aquest operador és estructuralment incapaç d'utilitzar-lo. L'únic adversari restant és l'escaneig automatitzat, contra el qual es calibra una finestra de disset minuts.

L'estructura de la víctima i el temps de permanència són el mateix fet vist dues vegades. També explica l'anomalia en la línia de temps: si la retirada fos impulsada per la por a les queixes, el paquet popular de llarga durada aniria primer. No va ser així, perquè les queixes mai arriben.

El mateix patró, un operador diferent

L'operador de supervisió no està sol en això, i el paral·lel més clar s'executa en una càrrega útil no relacionada.

Entre el 24 i el 27 d'agost, van aparèixer quatre paquets npm amb noms manllevats d'eines d'autenticació de dos factors. autorització-otp, clau secreta-2fa, secretkey2fa i 2fa-secretkey — amb setze versions entre elles. Cadascuna es va publicar des del seu propi compte recentment registrat (beayilol, jeanpaul686g, zzzalipay, dluuuuu), totes les adreces d'email sense verificar, cap amb un enllaç de control de font verificat, cap amb publicació de res més. Totes van ser retirades pel seu propi editor.

La càrrega útil no té res a veure amb el programari d'examen. Llegeix els magatzems de credencials del navegador i els tokens de Discord, i recorre una escala d'autenticació de Xbox Live contra el llançador de Minecraft per capturar un token d'actualització. Aquí l'instal·lador. is la víctima en el sentit ordinari, cosa que fa que la comparació sigui útil, perquè el comportament del lliurament és idèntic independentment.

Els quatre cicles es van executar en ordre de publicació a 274.9, 37.8, 37.6 i 35.7 minuts: un primer intent llarg, després convergència en una xifra que es manté. Tres paquets més pertanyen de nou a altres operadors i mostren el mateix comportament de retirada.

paquetOperadorEsquerra dempeus
octopus-actionfar de reconeixement2.5 min
mt-ts-serverless-starterfar de reconeixement9.6 min
2fa-secretkeyNoms de portada 2FA35.7 min
secretkey2faNoms de portada 2FA37.6 min
secretkey-2faNoms de portada 2FA37.8 min
auth-otpNoms de portada 2FA274.9 min
hex-encode-utilsun altre724.2 min

Set paquets, amb una mitjana de 37.8 minuts, cap d'ells relacionat amb programari d'examen.

Tres càrregues útils no relacionades, tres conjunts de comptes no relacionats, una tècnica compartida.

Per què la finestra es tanca

Alguna cosa va canviar a l'entorn del registre durant el 2026, i el candidat obvi és que l'escaneig es va accelerar.

Fins fa poc, els paquets maliciosos es trobaven principalment després del fet: per un usuari que detectava alguna cosa, per un informe posterior o per un rastreig periòdic. La latència de detecció es mesurava en dies. Aquest ja no és l'únic règim. Anàlisi gairebé en temps real dels paquets recentment publicats — Alerta precoç de programari maliciós de Xygeni entre un conjunt creixent d'aquests sistemes a tota la indústria, redueix la bretxa entre la publicació i la inspecció a quelcom molt més curt.

Un operador que s'enfronta a dues opcions. Fer que la càrrega útil sigui més difícil de reconèixer o escurçar el temps que està disponible per ser consultada. La segona és més barata, no requereix enginyeria i el registre proporciona el mecanisme de forma gratuïta: dins del període de 72 hores de despublicació de npm, un editor pot eliminar un paquet unilateralment i el nom es pot reutilitzar posteriorment. La retirada no costa res a l'operador.

El temps encaixa. Els dos operadors anteriors convergeixen en una xifra i la mantenen en lloc de desviar-se, que és el que sembla un paràmetre ajustat en lloc d'una qüestió de conveniència. I el paràmetre en què van convergir (desenes de minuts) es troba precisexactament on hauria de seure per superar una inspecció automatitzada i, alhora, deixar el paquet instal·lable el temps suficient per arribar al seu públic.

Això continua sent una hipòtesi. Les dades de temps no poden separar una resposta a l'escaneig d'una resposta a l'aplicació del registre, ni de la maduració operativa ordinària a mesura que aquests operadors aprenen els uns dels altres. El que es pot dir sense inferència és més limitat i encara útil: La finestra d'exposició ara és prou curta com per a què qualsevol control que depengui de la inspecció d'un paquet després de la publicació corregui contra un rellotge que estableix l'operador. Els controls que no depenen de la inspecció (quarantena per edat, scripts d'instal·lació desactivats) no es veuen afectats per aquesta raça, que és la raó pràctica per preferir-los.

Què fer al respecte

Quarantena per edat. Res de la taula de temps de permanència va sobreviure tretze hores. Una política que estableixi que cap versió de dependència no es pot instal·lar fins que no hagi existit durant 72 hores les hauria exclòs totes sense detectar res.

Desactiva els scripts d'instal·lació per defecte. -ignore-scripts elimina el mecanisme de lliurament del qual depenen els paquets de robatori de credencials en aquest corpus. No ajuda contra una eina que l'usuari executa deliberadament, que és precisrealment la distinció que val la pena entendre.

Tractar la desaparició com un esdeveniment de seguretat. Alerta quan una dependència instal·lada deixa de resoldre's. L'evidència encara resideix al fitxer de bloqueig, no al registre.

Fes un seguiment del contingut, no dels noms. Els sis resums anteriors coincideixen independentment del nom del paquet, el compte de l'editor o la cadena de versió; tots els camps que aquest operador ha demostrat que canviaran. Una regla del registre que un compte recentment registrat que retira el seu únic paquet en una hora és un patró notificable s'hauria activat en tots els paquets aquí, només en metadades.

I si esteu pensant en instal·lar alguna cosa d'aquesta categoria: Les propietats que dificulten la detecció d'un registre són les mateixes propietats que no et deixen cap recurs. No hi ha cap editor a qui responsabilitzar, cap ruta d'actualització i cap registre del que has executat.

indicadors

TipusValor
Dossierbin/kalamasha-tool.js — no-standard punt d'entrada del contenidor
SHA-2560c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd
SHA-256e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865
procésSearchApp.exe escrit al costat d'un temps d'execució legítim d'Electron
Comportamentpowershell -ExecutionPolicy Bypass -File amb windowsHide: true
Comportamenttaskkill /F /T dirigint-se a un procés de navegador d'examen segur
MetadadesLlista de mantenidors buida al costat d'un time.unpublished registre
Comptesletol39119, so1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123, heytoshan
Les inscripcionsogzmail.com, hutdot.com, ebflyai.com, prodbits.com — dominis de correu d'un sol ús

referències

sca-tools-software-composition-analyse-tools
Prioritzar, solucionar i protegir els riscos del programari
Obtén el teu compte gratuït.
No es requereix cap targeta de crèdit.

Assegura el desenvolupament i el lliurament del teu programari

amb el paquet de productes Xygeni