TL; DR
Pakkerne sletter sig selv. I løbet af femten dage i august udgav en npm-operatør ni pakker under ni navne fra syv konti og trak otte af dem tilbage personligt. Det vindue, der hver især fik lov til at stå, faldt fra tretten timer til sytten minutter. Teknikken er ikke kun deres: syv yderligere pakker fra uafhængige operatører, der bærer helt forskellige nyttelaster, blev trukket tilbage af deres egne udgivere med en median på 37.8 minutter. Artefaktet er væk, før de fleste defensive processer kører, og installationen er allerede sket.
Alt, hvad registreringsdatabasen eksponerer, roterer; nyttelasten gør ikke. Alle ni blev leveret en byte-identisk bin/ mappe, de samme SHA-256-fordøjelser på tværs af tre pakkenavne og to konti, med femten dages mellemrum. Indholdsidentitet er det eneste sporingssignal, som denne operatør ikke brød, og den enkelte pakke, de aldrig trak tilbage, er grunden til, at noget af den overhovedet kunne undersøges.
De personer, der installerer det, er ikke ofre og er alligevel slemt udsatte. Dette værktøj er ikke rettet mod udviklere: det eliminerer fjernovervågning af eksamener gennem skjult skærmoptagelse, tekstudtrækning på skærmen og svar, der returneres til et overlay, så den, der løber npm install er den tilsigtede modtager snarere end målet. De kører også en usigneret binær fil, der dekrypterer deres browsers cookielager fra en konto, der sletter sig selv inden for en time. De kan ikke modtage en rettelse, kan ikke senere revidere, hvad de har kørt, og kan ikke rapportere skade uden at afsløre, hvorfor de installerede det.
Økosystem: npm, samme mønster observeret på PyPI. Periode: Juni–august 2026.
Målingen
Dwell-tiden er intervallet mellem en pakkes fremkomst og forsvinden, beregnet ud fra registreringsdatabasens egne metadata. Disse er målinger, ikke estimater.
| Pakke | Udgivet (UTC) | Venstrestående |
|---|---|---|
moidev | 2026-08-16 16:31 | 5h 58m |
moidevx | 2026-08-17 03:24 | 13h 23m |
moidevz | 2026-08-26 03:38 | 12h 56m |
moideva | 2026-08-26 18:58 | 1h 33m |
amicat | 2026-08-28 20:48 | 17m |
bmcat | 2026-08-28 21:17 | 47m |
eyevox | 2026-08-28 21:44 | 21m |
moidevh | 2026-08-31 03:22 | 47m |
Læst i udgivelsesrækkefølge krymper vinduet med mere end en faktor fyrre - fra 13 timer og 23 minutter på det bredeste tidspunkt til 17 minutter på det smalleste tidspunkt. De første fire pakker varer i gennemsnit otte en halv time; de sidste fire varer i gennemsnit treogtredive minutter. Den 28. august blev tre pakker udgivet og trukket tilbage inden for et enkelt tidsrum på 77 minutter.
Sammentrækningen er ikke en gradvis afdrift. Den er koncentreret mellem 26. og 28. august, og det, der ændrede sig, var operatørens estimat af, hvor længe en pakke sikkert kan holde.
Enhver tilbagetrækning her er udgiverinitieret. Registreringsdokumentet for hver viser en tom vedligeholderliste ved siden af en tid.upubliceret optegnelse — underskriften af en afpublicering snarere end en fjernelse. En niende pakke, Øjne, blev aldrig trukket tilbage overhovedet; det er grunden til, at alt dette kunne undersøges.
Der findes en anden udbetalingsordning, som ikke bør forveksles med denne. Hvor kun nyttelastversion bliver trukket tilbage, og pakken overlever, er medianen cirka 73 timer på tværs af 31 pakker. Disse erstatninger ankommer i scriptede batches og efterlader en tom skal - en pakke.json erklære en main der ikke sender nogen fil — hvis eneste funktion er at bevare navnet. Det regime er husholdning efter en tidsplan. Dette er et indstillet eksponeringsvindue.
Hvad overlever sletningen
Ni af disse pakker er én operatør: moidev, moidevx, moidevz, moideva, moidevh, amicat, bmcat, eyevox og ØjneNavnene deler ingen konvention — ingen sporer moidev stem ville have overset mere end halvdelen af dem – og de blev offentliggjort fra syv separate konti, næsten alle registreret på engangs-e-mail-domæner.
Det, de deler, er en manifest indgang uden nogen eksistensgrund:
"spand": { "": "bin/kalamasha-tool.js" } } Vi beholdt kopier af fem af dem, før de blev fjernet. På tværs af alle fem, hele beholder/ mappen er byte-identisk:
| File (Felt) | SHA-256 |
|---|---|
bin/kalamasha-tool.js | 0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd |
bin/uia_extract.exe | e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865 |
bin/chrome_cookies.ps1 | 21b61ec810331850d72423c40c5448e6cd310c4cfad6aed54f92cd7e7cac5f3a |
bin/stealth_capture.ps1 | c9baf5897c03b941c54f736df5af9243ad28794a9e69746d41d4f4a34065589c |
bin/uia_extract.py | c20b38c63efd9221930095c54b42cdd5adffa1972c44c4578226cbe1e4dbac3e |
bin/uia_get_text.ps1 | 4a3f3ada0bdf13aa8e89edb8af817c7816296147dae5be25f169ff960d28a87c |
To yderligere signaler stemmer overens. Tre af pakkerne blev udgivet kl. 03:24, 03:38 og 03:22 UTC den 17. august, 26. august og 31. august – et seksten minutters bånd over femten dage og tre separate konti. Og to af disse konti var registreret på det samme engangs-e-maildomæne, hvilket bandt dem sammen uafhængigt af koden.
Regnskaberne
Dette er de npm-udgiverkonti, der sendte nyttelasten, med hver pakke, der blev uploadet, og hvor længe den blev stående:
| Udgiverkonto | Pakke | E-maildomæne | Venstrestående |
|---|---|---|---|
letol39119 | moidev:1.0.0 | hutdot.com (engangs) | 5h 58m |
so1d1a7i27 | moidevx:1.0.0 | ogzmail.com (engangs) | 13h 23m |
lololololol435678 | eyiouss:3.0.21, 3.0.22, 4.0.1 | ogzmail.com (engangs) | stadig udgivet |
tagadob568 | moidevz:1.0.0 | ebflyai.com (engangs) | 12h 56m |
tayihim489 | moideva:1.0.0 | prodbits.com (engangs) | 1h 33m |
sahihai123 | amicat:1.0.0, bmcat:2.0.9, eyevox:1.0.0 | forbruger webmail | 17m / 47m / 21m |
heytoshan | moidevh:1.0.0 | forbruger webmail | 47m |
so1d1a7i27 og lololololol435678 dele ogzmail.com registreringsdomæne — linket, der forbinder den konto, der stadig er vært for en livekopi, til den konto, der blev udgivet under moidev stilk to uger tidligere. sahihai123 offentliggjorde og trak tre separate pakkenavne tilbage inden for et enkelt vindue på 77 minutter den 28. august. Heytoshan registreret, udgivet moidevh, og trak den tilbage 47 minutter senere; det er fortsat den eneste offentliggørelse fra den beretning.
Hver af disse konti er ikke-e-mailbekræftede, har intet verificeret kildekontrollink og har ikke udgivet noget urelateret projekt. Seks af syv hoster ikke længere noget.
Én pakke blev aldrig trukket tilbage. eyiouss:4.0.1 har været udgivet siden 16. august og kunne stadig løses på tidspunktet for skrivningen. Otte artefakter kunne ikke gendannes; kampagnen blev fuldstændig rekonstrueret ud fra den, der blev stående. En operator, der sletter refleksivt, vil stadig i sidste ende lade én blive stående.
Hvad værktøjet gør
eyiouss:4.0.1 beskriver sig selv på npm som et "højtydende DOM-værktøj og diagnostisk bro til moderne webapplikationer". Det er et værktøj til skærmbilleder og hentning af svar, der er bygget til at køre under fjerneksamensovervågning, og kilden siger det med sine egne ord.
Startprogrammet kopierer Electron-runtime'en under et falsk filnavn, før det køres, og navngiver det, den undgår:
// 🛡️ STEALTH BINÆRT NAVN: Må IKKE kollidere med den rigtige Testpad! const STEALTH_NAME = 'SearchApp.exe';
Den samme fils header kalder det en Anti-Proctor Ghost Watchdog og implementerer en respawn-løkke, der trækker sig tilbage, jo hurtigere den dræbes. Andre steder hæver processen sin egen prioritet. at bekæmpe CPU-throttling ved proctoring, skubber eksamensapplikationen ud af forgrunden, når den tager fokus, og afslutter en Safe Exam Browser-underproces med taskkill /F /T.
Optagelsen kører via et medfølgende PowerShell-script, der kaldes med udførelsespolitikken deaktiveret og vinduet undertrykt, hvor tekst på skærmen indsamles parallelt via Windows UI Automation. Billederne og teksten i køen sendes til en sprogmodelsession i en integreret browser, og svaret gengives i et altid-på-top-overlay. Denne forbindelse udskydes bevidst, og koden angiver årsagen: for at undgå permanent NETSTAT-eksponering.
Pakken sendes også chrome_cookies.ps1, på vej Krom cookie-ekstraktor, som dekrypterer Chrome- og Edge-cookies via DPAPI og læser cookiedatabasen fra op til fire browserprofiler. Angivet førcisely: Vi fandt ikke det script, der blev kaldt ved navn, fra nogen af de leverede JavaScript-filer. Det, der er til stede og tilgængeligt, er den forbrugerhalvdel, som indsætter gemte sessionscookies i den integrerede browser.
Stillingen af de personer, der installerer det
Ingen installerer dette ved et uheld. Det har ingen funktion udover en overvåget eksamen, og dets output er et svar, der overlægges på brugerens egen skærm. Den vildledende pakkebeskrivelse er slet ikke rettet mod installationsprogrammet – det er en forsmag rettet mod registreringsdatabasen og alle, der reviderer maskinen bagefter. Installationsprogrammet ved, hvad de får; beskrivelsen eksisterer, så... optage af installationen afspejler det ikke.
De parter, der lider skade, er tredjeparter, der aldrig har rørt npm: institutionen, der afholder eksamen, de andre kandidater og alle efterfølgende, der er afhængige af, at legitimationsoplysningerne betyder noget.
Men installationsprogrammet er derfor ikke sikkert, og det er den del, der er værd at uddybe, fordi selve modellen med den forsvundne pakke er det, der skaber eksponeringen.
De kører en usigneret binærfil fra nobody. uia_extract.exe Skibe samlet, uden kilde og uden byggeproveniens, fra en konto, der ikke længere eksisterer. Den samme fil, via hash, er blevet genudgivet af letol39119, so1d1a7i27, lololololol435678, tagadob568, tayhim489, sahihai123 og Heytoshan over femten dage. Der er ingen vedligeholder at spørge, intet arkiv at læse og ingen historik at kontrollere – enhver identitet, der sendte den, slettede sig selv.
De har givet den præcis de funktioner, malwaren har brug for. En skjult proces, der kører under et falsk navn, dekrypterer browserens cookielager, læser skærmen kontinuerligt, afslutter sikkerhedssoftware og genopliver, når den afsluttes. I dag er cookiedekrypteringen begrænset til én leverandørs domæner og betjener brugerens egen session. Dette omfang er en ændring på én linje, og intet ved leveringsmodellen ville afsløre det, hvis den ændrede sig - et nyt navn, en ny konto, en ny upload.
De kan ikke få en løsning. Pakken er blevet afpubliceret inden for en time. Der er ingen opdateringssti, ingen vejledning og ingen måde at finde ud af senere, at den version, de installerede, var forskellig fra den, deres ven installerede. Det, der er på maskinen, forbliver der.
De kan ikke revidere, hvad de har kørt. Deres låsefil refererer nu til en pakke, der ikke længere kan løses. Hvis de senere ville finde ud af, hvad der var på deres maskine – efter en hændelse eller en tvist – har registreringsdatabasen ingen optegnelse at give dem.
Og de kan ikke anmelde skader. En bruger, der er kompromitteret af dette værktøj, kan ikke indgive en misbrugsrapport uden at afsløre, hvorfor de installerede det. Det er ikke tilfældigt. Rapporter om misbrug i registreringsdatabasen er en primær kanal, hvorigennem kortlivede pakker fanges, og denne operatørs brugerbase er strukturelt ude af stand til at bruge den. Den eneste tilbageværende modstander er automatiseret scanning - som et sytten minutters vindue kalibreres i forhold til.
Offerstrukturen og opholdstiden er den samme kendsgerning set to gange. Det forklarer også anomalien i tidslinjen: hvis tilbagetrækningen var drevet af frygt for klager, ville den langlivede populære pakke gå først. Det gjorde den ikke, fordi klagerne aldrig kommer.
Det samme mønster, en anden operator
Proctoring-operatøren er ikke alene om dette, og den klareste parallel kører på en urelateret nyttelast.
Mellem 24. og 27. august dukkede fire npm-pakker op under navne lånt fra tofaktorgodkendelsesværktøjer — autorisation-otp, hemmelignøgle-2fa, hemmelignøgle2fa og 2fa-hemmelig nøgle — med seksten versioner tilsammen. Hver version blev udgivet fra sin egen, nyligt registrerede konto (beyilol, jeanpaul686g, zzalipay, dluuuuu), alle e-mailadresser er ubekræftede, ingen med et bekræftet kildekontrollink, ingen udgiver noget andet. Alle blev trukket tilbage af deres egen udgiver.
Nyttelasten har intet at gøre med eksamenssoftware. Den læser browserlegitimationsoplysninger og Discord-tokens og bruger en Xbox Live-godkendelsesstige mod Minecraft-launcheren for at indsamle en opdateringstoken. Her er installationsprogrammet is offeret i almindelig forstand – hvilket er det, der gør sammenligningen nyttig, fordi leveringsadfærden er identisk uanset hvad.
De fire cyklusser løb i publiceringsrækkefølge med varigheden 274.9, 37.8, 37.6 og 35.7 minutter: ét langt første forsøg, derefter konvergens mod et tal, der holder. Tre yderligere pakker tilhører igen andre operatører og viser den samme udbetalingsadfærd.
| Pakke | Operatør | Venstrestående |
|---|---|---|
octopus-action | rekognosceringsfyr | 2.5 min |
mt-ts-serverless-starter | rekognosceringsfyr | 9.6 min |
2fa-secretkey | 2FA-dæknavne | 35.7 min |
secretkey2fa | 2FA-dæknavne | 37.6 min |
secretkey-2fa | 2FA-dæknavne | 37.8 min |
auth-otp | 2FA-dæknavne | 274.9 min |
hex-encode-utils | Andet | 724.2 min |
Syv pakker, median 37.8 minutter, ingen af dem relateret til eksamenssoftware.
Tre uafhængige nyttelaster, tre uafhængige sæt konti, én fælles teknik.
Hvorfor vinduet lukker sig
Noget ændrede sig i registrets miljø i løbet af 2026, og den oplagte mulighed er, at scanningen blev hurtigere.
Indtil for nylig blev skadelige pakker primært fundet bagefter: ved at en bruger bemærkede noget, ved en downstream-rapport eller ved en periodisk scanning. Detektionslatens blev målt i dage. Det er ikke længere det eneste regime. Næsten realtidsanalyse af nyligt offentliggjorte pakker — Xygenis egen tidlige advarsel om malware blandt et voksende sæt af sådanne systemer på tværs af branchen — mindsker kløften mellem offentliggørelse og inspektion til noget meget kortere.
En operatør, der står over for en version, har to muligheder. Gøre nyttelasten sværere at genkende, eller forkorte den tid, den er tilgængelig til gennemsyn. Den anden er billigere, kræver ingen ingeniørarbejde, og registreringsdatabasen stiller mekanismen til rådighed gratis: inden for npm's 72-timers afpubliceringsvindue kan en udgiver ensidigt fjerne en pakke, og navnet kan genbruges bagefter. Tilbagetrækning koster operatøren ingenting.
Timingen passer. Begge operatorer ovenfor konvergerer på et tal og holder det i stedet for at drive, hvilket er, hvordan en afstemt parameter ser ud snarere end et spørgsmål om bekvemmelighed. Og den parameter, de konvergerede på - ti minutter - sidder forud.cishvor den skulle sidde for at bestå en automatiseret inspektion, samtidig med at pakken stadig er installerbar længe nok til at nå ud til sin målgruppe.
Dette forbliver en hypotese. Timingdata kan ikke adskille et svar på scanning fra et svar på registerhåndhævelse eller fra almindelig operationel modning, da disse operatører lærer af hinanden. Hvad der kan siges uden inferens er snævrere og stadig nyttigt: Eksponeringsvinduet er nu kort nok til, at enhver kontrol, der er afhængig af inspektion af en pakke efter offentliggørelse, kører om kap med et ur, som operatøren indstiller. Kontrolelementer, der ikke afhænger af inspektion — karantæne efter alder, deaktiverede installationsscripts — påvirkes ikke af den pågældende race, hvilket er den praktiske grund til at foretrække dem.
Hvad skal man gøre ved det
Karantæne efter alder. Intet i tabellen over opholdstid overlevede tretten timer. En politik om, at ingen afhængighedsversion kan installeres, før den har eksisteret i 72 timer, ville have udelukket hver og en af dem uden at detektere noget.
Deaktiver installationsscripts som standard. –Ignorér-scripts fjerner leveringsmekanismen, som pakkerne i dette korpus, der stjæler legitimationsoplysninger, er afhængige af. Det hjælper ikke mod et værktøj, som brugeren kører bevidst, hvilket er præcisden forskel, der er værd at forstå.
Betragt forsvinden som en sikkerhedshændelse. Advarsel, når en installeret afhængighed ikke længere løser problemet. Din låsefil, ikke registreringsdatabasen, er der, hvor beviserne stadig findes.
Spor indhold, ikke navne. De seks ovenstående oversigter matcher uanset pakkenavn, udgiverkonto eller versionsstreng — alle felter, som denne operator demonstrerede, vil blive ændret. En regel på registreringssiden om, at en nyregistreret konto trækker sin eneste pakke tilbage inden for en time, er et rapporteringspligtigt mønster, ville have aktiveret alle pakker her, alene på metadata.
Og hvis du overvejer at installere noget i denne kategori: De egenskaber, der gør det svært for et register at fange, er de samme egenskaber, der giver dig ingen klageadgang. Der er ingen udgiver at holde ansvarlig, ingen opdateringssti og ingen registrering af, hvad du har kørt.
Indikatorer
| Type | Værdi |
|---|---|
| File (Felt) | bin/kalamasha-tool.js — ikke-standard indgangspunkt for bin |
| SHA-256 | 0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd |
| SHA-256 | e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865 |
| Proces | SearchApp.exe skrevet ved siden af en legitim Electron-runtime |
| Adfærd | powershell -ExecutionPolicy Bypass -File med windowsHide: true |
| Adfærd | taskkill /F /T målrettet mod en Safe Exam Browser-proces |
| Metadata | Tom vedligeholdelsesliste ved siden af en time.unpublished optage |
| Konti | letol39119, so1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123, heytoshan |
| Registrering | ogzmail.com, hutdot.com, ebflyai.com, prodbits.com — engangs-mail-domæner |
Referencer
- npm fjerner offentliggørelse af politik — det 72-timers vindue, inden for hvilket en udgiver kan fjerne en pakke uden indgriben.







