TL; DR
Zwanzeg npm-Pakete, déi iwwer zwee Deeg Enn Juli an Ufank August 2026 publizéiert goufen, presentéiere sech als intern UI-Komponentbibliothéiken a gemeinsam Backend-Utilities. Keng vun hinnen implementéiert déi Funktionalitéit, déi se annoncéieren. Jidderee liwwert eng Stub-Klass, e README, deen de Pak als intern beschreift, an eng Datei mam Numm _polyfill.js.
Dat Interessantst ass, wou dës Datei hierkënnt. Et ass keen Installatiounshook — d'Manifestë deklaréieren guer keng Preinstallatioun, Installatioun oder Postinstallatioun. Amplaz gëtt déi lescht Zeil vun index.js liest: try { require("./_polyfill"); } catch (_) {}D'Payload leeft beim éischte Mol wou den Applikatiounscode de Pak importéiert. Installéiert mat --ignore-scripts, déi standard Rotschléi fir d'Belaaschtung vun der Versuergungskette beim Installatiounsprozess ze reduzéieren, verhënnert et net.
Waat _polyfill.js Dëst mécht et, ass eng plattformspezifesch ausführbar Datei vun engem vun dräi Cloudflare Workers Hosts ofzelueden, se an en temporärt Verzeichnis ënner engem zoufällegen Numm ze schreiwen, se als ausführbar ze markéieren an se getrennt vum Elterenprozess ze starten. Dës ausführbar Datei ass selwer e Loader: se zielt Endpoint-Sécherheetsprodukter no Prozessnumm op, kontrolléiert deen aktuellen Benotzernumm géint bekannt Analyseumfeldkonten, patcht d'AMSI- an ETW-Telemetrie-Interfaces am Speicher, installéiert Persistenz ënner dem Numm vun enger Windows Audiokomponent a luet eng drëtt binär Datei vun e puer Megabyte of. Déi drëtt Stuf kënnt verschlësselt un an ass entschlësselt an am Speicher ausgefouert anstatt op d'Festplack geschriwwe ze ginn.
Den 1. August, ongeféier véier Stonnen nodeems d'Packagen duerch eng manuell Iwwerpréiwung als béiswëlleg bestätegt goufen, goufen néngzéng vun den zwanzeg Nimm vun hirem eegenen Editeur an enger Sequenz vu fënnefanzwanzeg Sekonnen aus npm geläscht. Den 2. August gouf ee vun dësen Nimm erëm registréiert - vun engem anere Kont, mam selwechte Code. D'Liwwerinfrastruktur huet all dräi Etappen zerwéiert, wéi dëst geschriwwe gouf.
| Formulen | 20 npm Nimm, ~74 publizéiert Versiounen |
| Themen benennen | beaver-ui-* (13), accounts-* (3), plus afisha-storybook-default, bcore-bravo-eslint-config, arbocrate-sla-prober-arbocrate-sla-prober-core, a.poltoradnev-package-c |
| Iwwerleeung | Modulimport (require), keen npm Liewenszyklusskript |
| Stage 1 | _polyfill.js — Ofruffen a Start |
| Stage 2 | Statesch verlinkte Loader, UPX-gepackt op Linux; Endpoint-Sécherheets-Opzielung, AMSI/ETW-Patching, Persistenz |
| Stage 3 | beacon_linux.bin / beacon_mac.bin / update_win.exe, 4–13 MB; verschlësselt geliwwert, am Speicher ausgeführt |
| Quaien | Linux x64 an arm64, macOS universell, Windows x64 |
| Editeur | Zwee Konten, eng Codebasis |
| Status | 19 vun 20 Nimm net publizéiert vum Betreiber; 1 nei publizéiert a live; Liwwerinfrastruktur live |
Attack Anatomie
Etapp 1 - de Pak
All Member liwwert déiselwecht Form mat dräi Dateien. index.js exportéiert eng Klass mat engem init() dat e Boolesche Wäert setzt, a Versioun(), An engem konfiguréieren() dat en Optiounsobjekt zesummeféiert. Näischt anescht. VIRLIESEN.md gëtt eng Installatiounszeil, a verlaangen Zeil, an de Saz "Internt Pak. Kuckt CONTRIBUTING.md fir Richtlinnen" — Bäitrag.md ass net am Tarball.
_polyfill.js ass e bësse manner wéi 5 KB grouss a liest sech wéi normalen Infrastrukturcode. Et fänkt mat dräi Ëmfeldkontrollen un:
if (process.env.DISABLE_TELEMETRY ||
process.env.ANALYTICS_OPT_OUT ||
process.env.DO_NOT_TRACK)
return;Dës Variabelen sinn konventionell Dateschutzkontrollen. Hei kontrolléieren se ob e binärt Dokument erofgelueden an ausgeführt gëtt. Eng Maschinn déi setzt NET_VERFOLGEN gëtt komplett iwwersprangen.
Duerno kënnt e Stempel deen eemol leeft: eng Datei op /tmp/.analytics_state, oder Analysenzoustand ënner % TEMP% op Windows, deem seng Modifikatiounszäit mat enger Fënster vun 20,357 Sekonnen verglach gëtt. Bannent där Fënster geet de Modul direkt zréck, sou datt widderholl Importen während engem Build een Ofruffversuch amplaz vun Dosende produzéieren.
D'Destinatiounshosts sinn net als Literaler präsent. Si ginn zur Lafzäit aus Fragmenter zesummegesat:
["oob-worker.cf102-","baf.workers.d","ev"].join("")
Dräi Hoster ginn op dës Manéier gebaut a virum Gebrauch gemëscht, sou datt d'Reiefolleg jee no Ausféierung variéiert. D'Ofhuele vun engem Host ass en HTTPS GET, deen op IPv4 gepinnt ass mat engem ... Benotzer Agent of Node-Fetch/2.6 — e plausible Wäert fir en Node-Prozess ze emittéieren. Eng Äntwert ënner 1,000 Bytes gëtt verworf an den nächste Host gëtt probéiert.
Wann all dräi net funktionéieren, fällt de Modul zréck op DNS. Et stellt eng TXT-Ufro fir c. fir eng Chunkzuel ze kréien, dann Ufroen 0. duerch n. A Batches vun zéng, verkettet d'Äntwerten, an decodéiert d'Resultat mat base64. Dëse Wee dréit déiselwecht ausführbar Datei iwwer DNS TXT-Dateien, déi Ëmfeld iwwerliewen, wou ausgehend HTTP gefiltert gëtt, awer DNS-Resolutioun net.
Déi ofgeruff Bytes ginn op geschriwwen /var/tmp/.cache_<8-hex> op Unix, oder %TEMP%\dotnet_diag_<8-hex>.exe op Windows — en Dateinumm, deen als .NET Diagnostik-Artefakt liest. Op Unix kritt d'Datei de Modus 0755. De Start ass spawnen mat getrennt: richteg, stdio: "ignoréieren", an unref(), sou datt d'Kand den Node-Prozess iwwerlieft, deen et gestart huet; op Windows füügt d'Opruff derbäi windowsHide: true.
Zwee Detailer kompletéieren d'Bild. En Helfer definéiert als const _l = (…a) => process.stderr.write(“”) gëtt bei all Schrëtt vum Ofruff opgeruff - et schreift eng eidel Zeecheketten an verworf seng Argumenter, wouduerch d'Positioun besat gëtt, wou d'Logging wier. An all Pakett liwwert eng 81 KB Datei bei lib/telemetrie.js deem säin Headerkommentar en "Analytics SDK" mat "HTTPS Transport mat Endpunktrotatioun a Retry" an "DNS-baséierter Service-Discovery fir Failover" beschreift. Am aktuelle Build gëtt dat net verlaangt.
Etapp 2 - de Ladegerät
De Linux x64 Binär ass eng statesch verlinkt ELF, déi mat UPX 3.96 kompriméiert ass. De macOS Build ass eng universell Binärdatei, déi x86_64 an arm64 ofdeckt; de Windows Build ass eng ofgeschaaft PE32+ Konsolenausführbar Datei. All véier goufen ofgeruff a statesch ënnersicht; keng gouf ausgeführt.
D'Importen an d'Stringtabell vum Windows-Build beschreiwen säi Verhalen kloer. Et léist... AssDebuggerPresent, CheckRemoteDebuggerPresent, an NtQueryInformatiounsprozess, a liest SYSTEM\CurrentControlSet\Services\Disk\Enum — e Registrierungspad, deem seng Wäerter virtuell Diskcontroller identifizéieren. Et rufft op GetDiskFreeSpaceExW an GlobalMemoryStatusEx, am Aklang mat der Iwwerpréiwung, ob d'Ressourcen vum Host mat enger kuerzlieweger Analyseinstanz iwwereneestëmmen.
Et enthält eng Lëscht vu Benotzernimm: Aktuelle Benotzer, IT Administrator, Hong Lee, TESTBOX, hapubws, Milozs, schweier, Administrator, malware, Kontext, Virus, EmweltE puer vun dësen sinn Artefakte vun ëffentlech dokumentéierten Analyseumgebungen.
Et enthält och eng Lëscht vun Endpoint-Sécherheetsprodukter an hir Prozessnimm, opgezielt bis CreateToolhelp32Snapshot an Prozess32ÉischtW/Prozess32NächstW:
- CrowdStrike Falcon (
csfalconservice,CSFalconContainer) - Carbon Black (
cb.exe) - Zylanz (
cylancesvc.exe) - Bitdefender (
bdagent.exe) - Kaspersky (
avp.exe,kavfs.exe) - Trend Micro a Deep Security (
coreServiceShell,ds_agent.exe) - FireEye/Trellix (
xagt.exe) - Tanium (
taniumclient.exe) - Hitmanpro (
hmpalert.exe) - elastesche (
elastic-agent.exe,elastic-endpoint,filebeat.exe,winlogbeat.exe) - Wazuh an OSSEC (
wazuh-agent.exe,ossec-agent.exe) - Check Point
- Windows Defender
Zwee weider Symboler sinn do: AmsiScanBuffer, den Entréepunkt, deen Windows fir d'Scannen vun In-Memory-Inhalter opweist, an EtwEventWrite, d'Funktioun, iwwer déi Event Tracing fir Windows Eventer ophëlt. Béid sinn heefeg Ziler fir Modifikatiounen am Prozess, déi d'Telemetrie ënnerdrécken, déi dës Interfaces soss produzéiere géifen.
Persistenz erschéngt zweemol a Windows. D'Binärdatei gëtt kopéiert op %APPDATA%\Microsoft\Windows\Themes\SystemSoundsService.exe, an zwéi Mechanismen bezéie sech drop: e Wäert ënner SOFTWARE\Microsoft\Windows\Aktuell Versioun\Ausféieren, an eng geplangten Aufgab, déi als
schtasks /Create /F /SC ONLOGON
/TN "\Microsoft\Windows\Multimedia\SystemSoundsService"
/TR "\"%s\""
/RL HIGHESTDe Pfad, den Numm vun der Aufgab an den Numm vun der ausführbarer Datei spigelen all eng echt Windows-Audiokomponent erëm. /RL Héchst freet den héchste verfügbare Privilegienniveau un.
De macOS-Build follegt dem selwechte Muster mat plattformgerechten Nimm: et schreift eng Eegeschaftslëscht fir ~/Bibliothéik/LaunchAgents/com.apple.windowserver.helper.plist a setzt seng ausführbar op ~/.local/share/runtime/com.apple.runtimeEt kontrolléiert no /Applikatiounen/VMware Fusion.app an /Bibliothéik/Applikatiounsënnerstëtzung/VMware Tools.
D'Netzwierkkapazitéit ëmfaasst dräi Transporter: WININET.dll fir HTTPS mat engem https://%s:%d%s Format String, WS2_32.dll Steckdosen, an DNSAPI.dll mat DnsQuery_A nieft engem c.%s.%s format string — déiselwecht Chunk-Count-Ufroform déi déi éischt Etapp benotzt.
Déi uewe beschriwwe Beschreiwung ass dat, wat d'Importen, d'String- an d'Registrierungsweeër vum binäre Fichier bei der Inspektioun weisen. Eng ëffentlech Multi-Engine-Analyse vum selwechte Windows-Beispill füügt Detailer bäi, déi eng statesch Liesung vun enger Importtabell eleng net feststelle kann, an hei gëtt zougeschriwwen anstatt als Observatioun aus éischter Hand nei formuléiert. Dës Analyse bericht, datt d'AMSI- an ETW-Referenzen net nëmme geléist, mä och gepatcht sinn - AmsiScanBuffer in amsi.dll an EtwEventWrite in ntdll.dll — wat d'Scanning vum Inhalt am Speicher an d'Eventverfolgung fir de Prozess ënnerdréckt. Et mellt d'Anti-Analyse-Kontrollen als timingbaséiert zousätzlech zu CheckRemoteDebuggerPresent, an identifizéiert den GetThreadContext als Hardware-Breakpoint-Check uruffen, andeems d'Debug-Registere gelies ginn. Et mellt och e Single-Instance Mutex, Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9}, an Nimm SystemSoundsService als de Run-key-Wäert. Dee Mutex-Wäert war net zu de Strings, déi hei erëmfonnt goufen - den Extraktiounsfilter, deen benotzt gouf, huet verstäerkt Groussbuchstawen-Hexadezimal-Token ausgeschloss - an en ass an der Indikatortabell op Basis vun där ëffentlecher Analyse anstatt vun direkter Observatioun opgeholl.
Stage 3
De Loader referenzéiert op eng weider Rei vu Weeër op deeselwechten Hosten. All waren während der Analyse erreechbar: beacon_linux.bin bei 5.3 MB, beacon_mac.bin bei 13.3 MB, update_win.exe bei 10.3 MB, an arm.bin mat 4.3 MB. Dës goufen net ofgeruff, an hiert Verhalen ass onbekannt.
Fir de Windows-Pfad beschreift déi ëffentlech Analyse vum Loader, wéi déi drëtt Etapp gehandhabt gëtt: si gëtt iwwer WinINet ofgeruff, kënnt verschlësselt un, an am Speicher entschlësselt a reflektiv ausgefouert - Speicher gëtt zougewisen, Importen geléist, Ëmlagerunge veraarbecht, an d'Kontroll gëtt un en neien Thread weiderginn iwwer ... Thread erstellenAus deem Grond gëtt déi drëtt Stuf ni an de Dateisystem geschriwwen, sou datt d'Datei-baséiert Detektioun an d'Post-Incident-Disk-Forensik näischt dovunner ze recuperéieren hunn. Et bedeit och, datt d'Ofrufung vun de Bytes vum Liwwerhost chiphertext géif liwweren, net eng analyséierbar ausführbar Datei.
Timeline
All Zäitstempel sinn UTC a stamen aus den npm-Registrierungsmetadaten, déi d'Erstellung an d'Depublikatioun vu Paketen onofhängeg vun all Observateur ophuelen.
| Wéini | Waat |
|---|---|
| 2026-07-31 09:25:05 → 09:29:56 | Zéng Nimm erstallt, all ugefaange mat Versioun 0.0.1, ongeféier dräizéng Sekonnen auserneen. |
| 2026-08-01 09:38 → 11:29 | Existéierend Nimm klammen duerch opgeblosen Versiounsnummeren, 6.1.9 duerch 6.1.12, 9.9.9 duerch 9.9.12, 8.9.3 duerch 8.9.6, 5.4.6 duerch 5.4.9. |
| 2026-08-01 13:04:14 → 13:04:18 | Néng weider beaver-ui-* Nimm, déi an engem véiersekonnen Ausbroch erstallt goufen, all direkt an enger 12.x Versioun ouni Virgeschicht publizéiert goufen. |
| 2026-08-01 ~13:00–14:30 | Versiounen, déi bei manueller Iwwerpréiwung als béiswëlleg klasséiert goufen. |
| 2026-08-01 17:39:49 → 17:40:14 | Néngzéng vun den zwanzeg Nimm goufen innerhalb vu fënnefanzwanzeg Sekonnen net publizéiert, sequentiell, ongeféier 1.2 Sekonnen auserneen. |
| 2026-08-02 18:58:41 | a.poltoradnev-package-c nach eng Kéier ënner engem anere Maintenance-Kont erstallt, Versioun 0.0.2. |
| 2026-08-02 19:20:28 | Versioun 33.9.5 ënner dem selwechten Numm publizéiert. |
| 2026-08-02 20:14 | All dräi Liwwerhoster déi d'Stufen zwee an dräi zerwéieren; DNS-Fallback äntwert mat Chunk-Zuelen. |
Zwee vun dësen Artikelen sinn derwäert, sech méi genee unzekucken.
De Burst vun 13:04 huet néng Paketen an véier Sekonnen an d'Registrierung bruecht, jidderee mat enger eenzeger Versioun an den Zwielef an nee. 0.0.1 drënner. Versiounsnummeren op dëser Skala, op Nimm déi een Dag al sinn, beschreiwen keng Verëffentlechungsgeschicht.
D'Depublikatiounssequenz ass gläichermoossen mechanesch: néngzéng Nimm, fënnefanzwanzeg Sekonnen, gläichméisseg Ofstänn. npm notéiert dës als normal Depublikatiouns-Evenementer anstatt als de Placeholder, deen eng vum Registry initiéiert Entfernung hannerléisst, wouduerch d'Aktioun beim Publikatiounskonto anstatt beim Registry placéiert gëtt.
Indikatoren fir e Kompromëss
Hosts a Weeër sinn defangéiert. Se sollen net vun engem Produktiounssystem opgeléist oder ofgeruff ginn.
| Type | Wäert |
|---|---|
| Liwwerant | oob-worker[.]cf99-9b3[.]workers[.]dev |
| Liwwerant | oob-worker[.]cf102-baf[.]workers[.]dev |
| Liwwerant | oob-worker[.]cf103-070[.]workers[.]dev |
| DNS-Transport | tin[.]dl[.]well1[.]site (Linux x64), tina[.] (arm64), ldr[.] (macOS), win[.] (Windows) — Chunkzuel bei c.<domain>, Donnéeën op <n>.<domain> |
| Weeër vun der Etapp 2 | /pkg/package, /pkg/package-arm64, /pkg/loader_mac, /pkg/package.exe |
| Weeër vun der Etapp 3 | /pkg/beacon_linux.bin, /pkg/beacon_mac.bin, /pkg/update_win.exe, /pkg/arm.bin |
| Drop-Pfad (Unix) | /var/tmp/.cache_<8-hex> |
| Drop-Pfad (Windows) | %TEMP%\dotnet_diag_<8-hex>.exe |
| Persistenz (Windows) | %APPDATA%\Microsoft\Windows\Themes\SystemSoundsService.exeAufgab \Microsoft\Windows\Multimedia\SystemSoundsService; Wäert vum Run-Schlëssel SOFTWARE\Microsoft\Windows\CurrentVersion\Run\SystemSoundsService |
| Mutex (Windows) | Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9} |
| Persistenz (macOS) | ~/Library/LaunchAgents/com.apple.windowserver.helper.plist; binär bei ~/.local/share/runtime/com.apple.runtime |
| Stempel fir eemol ze lafen | /tmp/.analytics_state, %TEMP%\analytics_state (20,357 Sekonnen Fënster) |
| Ënnerschrëft ufroen | HTTPS GET, IPv4-gepinnt, User-Agent: node-fetch/2.6 |
| Datei vum Etapp 1 | _polyfill.js, SHA-256 392dc9ec85042ce1796bfa9b8c7bf6e05c7710579aab8b7b1eb73788683883af |
| Onreferenzéiert Datei | lib/telemetry.js, SHA-256 2266c9b8e199daebe31a9afcb61d9b0d76706b63c92312fc8223d22de42e63c7 |
| Etapp 2 (Linux x64) | SHA-256 7e486657f30594afda379b97030252a09a19fe8055e25c9e371544f59bd8e9e3 |
| Etapp 2 (Linux arm64) | SHA-256 aafc37589c0d21fb729761a1579ca3b278b95bce152aacfa29243ffd27f5eeb7 |
| Etapp 2 (macOS) | SHA-256 c214746c74cae8ece8bdaf69aa05da4db6ce013f9e77452d1eed1a002fd9ba00 |
| Etapp 2 (Fënsteren) | SHA-256 d632c2c0c7801c3da57cf849fe4b4ca8351d9a7fe73c31050bf5dbcc96a16791 |
Paketnimm
Attributioun a observéiert Verhalen
Zwee npm-Konten sinn involvéiert. Déi néngzéng net publizéiert Nimm goufe vun engem Kont publizéiert; a.poltoradnev-package-c gouf den 2. August ënner engem anere Kontnumm an enger anerer E-Mail-Domain nei registréiert. De Code ass a béide Fäll déiselwecht Ofstamung, an déi zweet Registréierung huet déiselwecht Liwwerhoster, déiselwecht DNS-Fallback-Domainen, déiselwecht Drop-Path-Konstruktioun an deeselwechte Run-One-Stempel.
Dat nei publizéiert Puer weist och, wéi et zesummegesat gouf. 0.0.2 an 33.9.5 sinn byte-identesch ausser der Versiounszeechekette an Package.json, An der index.js verschéckt als 0.0.2 deklaréiert konstante VERSIOUN = "33.9.5"Béid Artefakte goufen aus engem Quellbam geschnidden an duerno nummeréiert. Et gëtt keen 0.0.2 Entwécklungsgeschicht fir de 0.0.2 Verëffentlechung ze representéieren.
D'Versiounsnummeréierung iwwer de ganze Set follegt der selwechter Logik. Paketnimm an dëser Kampagne liesen sech als Saachen, déi an enger Organisatioun existéiere géifen, anstatt an engem ëffentleche Registry: e UI-Komponenteset, eng ESLint-Konfiguratioun, e SLA-Prober, e Pak, deen no enger Persoun benannt ass. Wann e Build eng Ofhängegkeet mam Numm léist an en ëffentlecht Registry niewent engem privaten consultéiert, ass déi méi héich Versiounsnummer déi, déi gewënnt. En Numm, deen erstallt gouf op 0.0.1 um Méindeg an droen 12.9.6 ass den Dënschdeg fir dee Verglach positionéiert.
Déi zwou Publikatiounswellen ënnerscheede sech och op eng Manéier, déi op eng Iteratioun hiweist. De fréiere Code huet seng Payload-Datei genannt. setup.js an huet fënnef Liwwerhoster opgezielt; déi aktuell Datei huet den Numm _polyfill.js an lëscht dräi op. Déi fréier Versioun huet déi geläscht Datei fënnef Sekonnen nom Start ewechgeholl, sou datt de Prozess vun engem geläschten Inode aus leeft; déi aktuell Versioun mécht dat net. Déi net referenzéiert lib/telemetrie.js bleift am Tarball iwwer béid, nach ëmmer verschéckt, net méi verkabelt.
Eng Observatioun iwwer d'Kill-Switche ass derwäert, am Viraus ze soen.cisely, well et géint eng üblech Liesung geet. DISABLE_TELEMETRY, ANALYTIK_OPT_OUT, an NET_VERFOLGEN ginn agehalen, a si gi gepréift ier iergendeng aner Saach geschitt. E Fuerscher, deem seng Analyseëmfeld eng vun hinne festleet, observéiert e Pak, deen iwwerhaapt näischt mécht.
Impakt a wat d'Verdeedeger maache kënnen
Déi praktesch Konsequenz vum Importzäit-Ausléiser ass enk a soll eleng genannt ginn. npm installéieren –ignore-scripts verhënnert datt Lifecycle-Skripter ausgeführt ginn, an dat ass e gudde Rot. Et huet hei keen Effekt, well dëse Code kee Lifecycle-Skript benotzt. D'Payload leeft wann Applikatiounscode, en Testlaf, e Bundler oder e Linter de Modul fir d'éischt importéiert. Op engem CI-Runner, deen installéiert an dann direkt baut, sinn déi zwee Sekonne vuneneen ewech.
Fir d'Juegd sinn déi dauerhaft Signaler strukturell anstatt wuertwiertlech. D'Hosts, den Dateinumm an d'Drop-Weeër änneren sech; dës Forme si méi schwéier ze variéieren:
- E Modul-Entréepunkt, deem seng lescht Ausso en ass probéiert { require("./x"); } catch (_) {} ronderëm eng Datei, déi net Deel vun der exportéierter API ass. E Pak mat engem echten Polyfill importéiert en uewen a benotzt säi Resultat. All Feeler vun engem Import ënnen an der Datei ze verschlécken ass keng Feelerbehandlung.
- Host Strings zesummegestallt vun .join("") aus enger Rei vu Fragmenter. Legitem Code huet kee Grond fir en Hostnumm iwwer Array-Elementer opzedeelen.
- E Pak, deem seng deklaréiert Ofhängegkeeten eidel sinn, awer déi no ... gräift Majo, dns, an Kand_prozess zum Zäitpunkt vum Import. Ofrufung plus Ausféierung an engem Package, deen eng UI-Komponent annoncéiert, ass déi ganz Erkenntnis.
- Versiounsnummeren, déi net mam Alter vun engem Pak iwwereneestëmmen. En Numm, deen virun Deeg fir d'éischt bei enger zweistelleger Haaptversioun publizéiert gouf, ouni tëschtzäiteg Verëffentlechungen, beschreift eppes anescht wéi seng Entwécklung.
- Schreift un / var / tmp or % TEMP% gefollegt vun engem Chmod bis 0755 an en ofgeleeëne Spawn. D'Sequenz ass kuerz, uerdentlech a selten guttméisseg zesummen.
Op Windows Hosten gëtt et zwou bëlleg, héichverlässeg Kontrollen. D'Persistenzartefakte sinn fix Strings a keng dovun gehéiert op e proppert System: eng geplangt Aufgab op \Microsoft\Windows\Multimedia\SystemSoundsService, e Run-key Wäert mam Numm SystemSoundsService, an eng ausführbar Datei mat deem Numm ënner %APPDATA%\Microsoft\Windows\Themen\Den echte Windows Audio Service ass op kenger vun dëse Plazen ze fannen. Zweetens benotzt de Loader e fixe Single-Instance Mutex, Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9}; seng Präsenz op engem Host ass en Indikator, an well de Loader e bestehenden Mutex als "scho lafen" behandelt, ass seng Virerstellung eng machbar Kuerzzäit-Inokulatioun, während d'Sanéierung geplangt ass.
D'Detektioun an der drëtter Stuf ass e méi schwéiert Problem a wäert sech kloer maachen. No der Erklärung, déi vun der ëffentlecher Analyse uginn gëtt, gëtt et entschlësselt a gemappt am Speicher anstatt op d'Festplack geschriwwe, sou datt d'Dateiscanning an d'Festplackforensik et net gesinn. Wat observéierbar bleift, ass den eegene Foussofdrock vum Loader - d'Persistenzentréeën, de Mutex an d'Outbound-Ufroen un d'Liwwerhosts oder d'DNS-TXT-Domänen.
Fir Ëmfeld, déi Ofhängegkeeten souwuel aus engem privaten wéi och aus engem ëffentlechen Registry opléisen, bleift d'Mitigatioun hei onverännert: intern Nimm vum Scope sou datt en ëffentlechen Numm se net erfëlle kann, a Resolutioun un den internen Registry fir dës Scopes festpinnen. Dat uewe beschriwwe Versiounsinflatiounsverhalen funktionéiert nëmme wou eng méi héich ëffentlech Versioun en Numm gewannen kann.
Schlussendlech ass d'Net-Publikatioun derwäert, suergfälteg ze liesen, anstatt se als Enn ze gesinn. Néngzéng Nimm sinn an fënnefanzwanzeg Sekonnen aus dem Register erauskomm an een ass een Dag méi spéit ënner engem neie Kont zréckkomm, ouni datt d'Liwwerinfrastruktur iwwerhaapt beréiert gouf. D'Läschen vu Paketen ass net d'Läschen vun der Operatioun; d'Hosts hunn all Etapp weider zerwéiert, während dëst geschriwwe gouf. All Ofhängegkeetsbam, deen ee vun dësen Nimm tëscht dem 31. Juli an dem 1. August opgeléist huet, soll als d'Méiglechkeet ugesi ginn, déi éischt Etapp auszeféieren, egal ob den Numm nach ëmmer existéiert oder net.
Referenze
- Multi-Engine Analyse vum Windows Loader — Quell fir den AMSI/ETW-Patching, d'reflektiv In-Memory-Ausféierung an d'Mutex-Detailer, déi uewe genannt goufen.
- Dokumentatioun vun npm-Skripten — d'Liewenszyklus-Evenementer, déi dës Kampagne net benotzt.
- Dokumentatioun fir d'Installatioun vun npm — Deckel –Ignoréieren-Scripten an säin Ëmfang.







