TL; DR
Xygeni-ის უსაფრთხოების კვლევის გუნდი გამოავლინა დახვეწილი npm ინფორმაციის მოპარვის კამპანია, რომელიც ორი მავნე პაკეტის მეშვეობით განხორციელდა: კონსოლელოფი მდე selfbot-lofy.
უახლესი ვერსია (consolelofy@1.3.0) ჩადგმულია 216 კბ AES-დაშიფრული დატვირთვა, რომელიც გაშიფრულია გაშვების დროს და შესრულებულია vm.runInNewContext()რადგან მავნე ლოგიკა სრულად დაშიფრულია, სტრიქონების შემოწმებაზე დამოკიდებული სტატიკური სკანერები ვერ აკვირდებიან მის ქცევას შესრულების დრომდე.
გაშიფვრის შემდეგ, ტვირთი, შიდა ბრენდინგით ნიქს სტილერი, მიზნები:
- Discord-ის ავტორიზაციის ტოკენები
- 50+ ბრაუზერის ავტორიზაციის მაღაზია
- 90+ კრიპტოვალუტის საფულის გაფართოება
- Roblox-ის, Instagram-ის, Spotify-ის, Steam-ის, Telegram-ის და TikTok-ის სესიები
- Discord-ის დესკტოპ კლიენტის მუდმივი მუშაობა
ორივე პაკეტის ყველა 20 ვერსია დაფიქსირდა და დადასტურდა, რომ ისინი მავნე იყო.
ამ npm Infostealer-ის ტექნიკური მიმოხილვა
ტრადიციული ინსტალაციის დროს გამოსაყენებელი მავნე პროგრამებისგან განსხვავებით, ეს კამპანია ეყრდნობა დრო გაშიფვრის მოდელი.
Არიან, იმყოფებიან:
- მავნე
preinstallorpostinstallhooks - ინსტალაციის დროს აშკარა ქსელური ზარები არ არის
- არ არსებობს უბრალო ტექსტის ავტორიზაციის შეგროვების ლოგიკა
მოდულის იმპორტირებისას დატვირთვა აქტიურდება. მავნე პროგრამა მთლიანად დაშიფრულია და მეხსიერებაში მხოლოდ გაშვების დროს ჩნდება.
ეს დიზაინი სპეციალურად გამორიცხავს პაკეტის ინსტალაციის დროს აღმოჩენას.
როგორ მუშაობს სინამდვილეში ეს npm Infostealer
სანამ გავაანალიზებთ, თუ რას იპარავს Nyx Stealer, უნდა გავიგოთ როგორ ხორციელდება.
ამ npm ინფორმაციის მპარავში არსებული მავნე ლოგიკა თანმიმდევრულ ნიმუშს მიჰყვება:
პატარა ჩამტვირთავი გაშიფვრავს დიდ დაშიფრულ დატვირთვას და დინამიურად ასრულებს მას Node.js VM კონტექსტში.
ეს დიზაინი განზრახ არის შექმნილი. თავდამსხმელი ფუნქციონალურობას მხოლოდ დაფარვის მიღმა არ მალავს, ისინი... მავნე კოდის სტატიკური ხილვადობიდან მთლიანად მოშორება.
მაღალი დონის შესრულების მოდელი
მაღალ დონეზე, შესაფუთი ოთხ რამეს აკეთებს:
- იღებს AES გასაღებს მყარი კოდირებული პაროლიდან SHA-256-ის გამოყენებით
- AES-256-CBC-ის გამოყენებით დიდი, თექვსმეტობით კოდირებული შიფრული ტექსტის გაშიფვრა
- ასრულებს გაშიფრულ JavaScript-ს გამოყენებით
vm.runInNewContext() - უზრუნველყოფს ქვიშის ყუთს, რომელიც კვლავ ავლენს ძლიერ გაშვების პრიმიტივებს.
ძირითადი ტექნიკის შეჯამება
| კომპონენტი | კონფიგურაცია / მნიშვნელობა |
|---|---|
| ალგორითმი | AES-256-CBC |
| გასაღების წარმოშობა | SHA-256 (საიდუმლო ფრაზა) |
| ინიციალიზაციის ვექტორი (IV) | 0x00-ის 16 ბაიტი |
| შესრულების | vm.runInNewContext(გაშიფრული, sandbox) |
კრიტიკულად, ქვიშის ყუთი გადის:
requireprocessBuffer- ქრონომეტრები
- მოდულის ექსპორტი
ეს ნიშნავს, რომ გაშიფრული დატვირთვა ინარჩუნებს სრულ შესაძლებლობას:
- სპაუნ პროცესები
- ფაილების წაკითხვა და ჩაწერა
- ქსელური ზარების განხორციელება
- ლოკალური აპლიკაციების შეცვლა
ეს არ არის შეზღუდული ვირტუალური მანქანა. ეს არის ვირტუალური მანქანა, რომელიც გამოიყენება როგორც შესრულების ბატუტი.
გაშვების დროის დაშიფვრის ნიმუში (ბირთვული შესრულების მექანიზმი)
დამტვირთავი პატარაა.
მავნე სხეული არ არის.
ქვემოთ მოცემულია შესრულების ნიმუში, რომელიც პაკეტში მდებარეობს:
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); } რატომ ეს თემა
გაშიფრული დატვირთვა:
- Does არ არსებობს npm პაკეტის შიგნით უბრალო ტექსტში
- უხილავია მარტივისთვის
grepან სტატიკური სტრიქონების სკანირება - მეხსიერებაში მხოლოდ შესრულების დროს მატერიალიზდება
- ასრულებს Node-ის სრული გაშვების შესაძლებლობებით
AES + VM შესრულების ეს კომბინაცია არის ძლიერი ქცევითი ინდიკატორი. npm ინფორმაციის მპარავი ცდილობს თავი აარიდოს სტატიკური შემოწმების პროცესს.
Სხვა სიტყვებით:
თუ პაკეტის წყაროს ხეს დაასკანირებთ, მიმპარავ მოწყობილობას ვერ ნახავთ.
თქვენ ხედავთ დეშიფრატორს.
რა ხდება დეშიფრაციის შემდეგ
შესრულების შემდეგ, Nyx Stealer იწყებს მონაცემთა შეგროვების პარალელურ ტალღებს.
ტალღა 1: ბრაუზერის ავტორიზაციის მონაცემების ამოღება
მავნე პროგრამა:
- NuGet CDN-დან Python-ის გაშვების პროცესის ჩამოტვირთვა
- კრიპტოგრაფიული ბიბლიოთეკების ინსტალაცია
- ქრომზე დაფუძნებული სერთიფიკატების მაღაზიების ექსტრაქტები
- DPAPI-ით დაცული საიდუმლოებების გაშიფვრა
მშობლიური ბმულების კომპილაციის ნაცვლად, ის იყენებს PowerShell-ს Windows DPAPI-ს პირდაპირ გამოსაძახებლად.
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'); } ეს მიდგომა:
- თავს არიდებს კომპილაციის არტეფაქტებს
- იყენებს Windows-ის მშობლიურ კრიპტო API-ებს
- ადმინისტრაციულ ინსტრუმენტებში ერევა
ეს არის ოპერაციული სისტემის დონის ავტორიზაციის გაშიფვრა და არა სკრაპინგი.
ტალღა 2: Discord-ის ტოკენის გაშიფვრა
მომპარავი პროტოკოლის მცოდნეა. ის იგებს 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'); } ოპერაციული ნაკადი:
- Discord-დან მასტერ-გასაღების ამოღება
Local State - DPAPI-ს საშუალებით მთავარი გასაღების გაშიფვრა
- AES-GCM ტოკენების ბლობების გაშიფვრა
- Discord API-სთან ტოკენების ვალიდაცია
- გაამდიდრეთ Nitro-თი, ბეიჯებით, გადახდის ინფორმაციით
ეს არ არის ზოგადი ავტორიზაციის მონაცემების გადაცემა. ეს არის პროტოკოლის გათვალისწინებით სესიის მიტაცება.
ტალღა 3: კრიპტოვალუტის საფულის ტარგეტირება
npm ინფორმაციის მპარავი ჩამოთვლის:
- 90+ ბრაუზერის საფულის გაფართოება
- 27 დესკტოპის საფულე
- ცივი საფულის ბილიკები
- Exodus-ის სათესლე ფაილები
თესლის გაშიფვრის მცდელობის მაგალითი:
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'); } წარმატების შემთხვევაში, საფულის კომპრომეტირება მყისიერი და შეუქცევადია.
ეს წარმოადგენს კამპანიის ყველაზე მაღალი ღირებულების მონეტიზაციის ვექტორს.
მდგრადობა Discord Desktop Injection-ის მეშვეობით
ავტორიზაციის შეგროვების შემდეგ, Nyx Stealer ცდილობს მუდმივი მონაცემების მოპოვებას ლოკალური მონაცემების შეცვლით. Discord კლიენტს.
სამიზნე:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js ოპერაციული თანმიმდევრობა
ინფორმაციის მტაცებელი ასრულებს შემდეგ ნაბიჯებს:
- წყვეტს Discord-ის პროცესების გაშვებას
- ავლენს დაინსტალირებულ Discord ვარიანტებს (Stable, Canary, PTB)
- გადაწერა
discord_desktop_core/index.js - თავდამსხმელის მიერ კონტროლირებადი webhook ლოგიკის ინექცია
- Discord-ის გადატვირთვა
ეს უზრუნველყოფს, რომ მომავალ Discord სესიებში ავტომატურად გაჟონონ ახალი ავტორიზაციის ტოკენები.
მნიშვნელოვანია, რომ ეს მუდმივობა არ არის დამოკიდებული დაგეგმილ ამოცანებზე ან რეესტრის მოდიფიკაციებზე. ის იყენებს აპლიკაციის დონის კოდის მოდიფიკაციას, რაც უფრო ფარული მიდგომაა.
მაშინაც კი, თუ მავნე npm პაკეტი მოგვიანებით წაიშლება, Discord კლიენტი კვლავ კომპრომეტირებული რჩება.
ტექნიკური შედარება: ლეგიტიმური Selfbot vs npm Infostealer
| კომპონენტი | ლეგიტიმური ბიბლიოთეკა | Nyx npm ინფორმაციის მპარავი |
|---|---|---|
| შიფრაცია | არა | სრული AES-დაშიფრული დატვირთვა |
| გაშვების დროის ვირტუალური მანქანა | არ არის საჭირო | vm.runInNewContext შესრულების |
| ავტორიზაციის წვდომა | მხოლოდ Discord API | ბრაუზერი, საფულეები, DPAPI |
| გარე ჩამოტვირთვები | არა | Python-ის გაშვების დრო NuGet-ის საშუალებით |
| არსებულ | არა | Discord-ის კლიენტის ინექცია |
| მონეტიზაციის | ბოტის ავტომატიზაცია | ავტორიზაციის გადაყიდვა |
მხოლოდ დაშიფვრის ფენა უკვე განასხვავებს ამ კამპანიას ტიპიური ღია კოდის ფორკისგან.
ლეგიტიმურ Discord სელფბოტს არ აქვს მიზეზი, დაშიფროს მთელი თავისი კოდის ბაზა, გამოიყენოს PowerShell DPAPI-ზე წვდომისთვის, ჩამოტვირთოს გარე გაშვების დრო ან შეცვალოს დესკტოპის აპლიკაციის შიდა ფუნქციები. როდესაც ეს შესაძლებლობები ჩნდება დამოკიდებულებაში, რომელიც აცხადებს, რომ ავტომატიზირებას ახდენს Discord-ის ურთიერთქმედებებს, არქიტექტურული შეუსაბამობის იგნორირება შეუძლებელი ხდება.
გამოძიების თვალსაზრისით, ეს npm ინფორმაციის მპარავი კვალს მრავალ ფენაზე ტოვებს. თუმცა, ყველაზე სანდო ინდიკატორები არ არის მყარი კოდირებული URL-ები ან კონკრეტული ფაილის ბილიკები, რადგან ისინი შეიძლება შეიცვალოს ვერსიებს შორის. ამის ნაცვლად, მდგრადი სიგნალები სტრუქტურულია.
პაკეტის დონეზე, ყველაზე ძლიერი საშიშროების ნიშანი არის დიდი დაშიფრული დატვირთვისა და გაშვების დროს გაშიფვრის შეფუთვის კომბინაცია, რომელიც მყისიერად სრულდება. vm.runInNewContext()მიუხედავად იმისა, რომ მხოლოდ დაშიფვრა თავისთავად მავნე არ არის, Discord-ის უტილიტის პაკეტში AES გაშიფვრის გამოყენება, რასაც მოჰყვება დინამიური ვირტუალური მანქანის შესრულება, ძალიან ანომალიურია.
ჰოსტის დონეზე, საეჭვო ნიმუშებს შორისაა DPAPI-ს გაშიფვრის მოულოდნელი აქტივობა, Node.js დამოკიდებულების კონტექსტიდან პროცესის წარმოქმნა და ლოკალური აპლიკაციის ფაილების მოდიფიკაცია, რომლებიც არასდროს უნდა შეიცვალოს მესამე მხარის ბიბლიოთეკების მიერ. ანალოგიურად, ქსელის დონეზე, განვითარების დამოკიდებულებით ინიცირებული გამავალი webhook სტილის კომუნიკაცია კიდევ ერთ მნიშვნელოვან ანომალიას წარმოადგენს.
სხვა სიტყვებით რომ ვთქვათ, აღმოჩენის ზედაპირი არ არის კომპრომეტირების ერთიანი ინდიკატორი. საფრთხეს ავლენს დაშიფვრის, გაშვების დროს შესრულების, ავტორიზაციის მონაცემებზე წვდომისა და მუდმივობის ქცევის კორელაცია.
Xygeni-ს გამოყენებით აღმოჩენა და შერბილება
ეს npm ინფორმაციის მპარავი იდენტიფიცირებული იქნა Xygeni-ს მავნე პროგრამების ადრეული გაფრთხილება (MEW) ფენიანი ქცევითი კორელაციის გზით, ვიდრე მარტივი ხელმოწერის შესაბამისობის გზით.
ცნობილი მავნე სტრიქონების ძიების ნაცვლად, MEW აფასებს სტრუქტურულ ანომალიებს მთელი წყაროს ხის მასშტაბით. ამ შემთხვევაში, აღმოჩენა წარმოიშვა რამდენიმე სიგნალის კონვერგენციის შედეგად: მოდულის შესვლის წერტილში ჩაშენებული AES გაშიფვრის რუტინა, ვირტუალური მანქანის კონტექსტში დაუყოვნებელი შესრულება და შესაძლებლობებისა და განზრახვის აშკარა შეუსაბამობა.
მნიშვნელოვანია, რომ ამ სიგნალებიდან არცერთი ცალ-ცალკე არ ადასტურებს მავნე განზრახვას. თუმცა, ერთად გაანალიზებისას, ისინი ავლენენ გაშვების დროს ქცევის დამალვის მცდელობას. ეს მრავალშრიანი მიდგომა მნიშვნელოვნად ამცირებს ცრუ დადებით შედეგებს და ამავდროულად ავლენს მაღალი სანდოობის მიწოდების ჯაჭვის საფრთხეებს.
გარდა ამისა, ეს შემთხვევა ასახავს, თუ რატომ არ არის საკმარისი მხოლოდ ინსტალაციის დროს შემოწმება. მავნე ლოგიკა არ არის სასიცოცხლო ციკლის სკრიპტებში. ის აქტიურდება მხოლოდ მოდულის ჩატვირთვის შემდეგ და ხილული ხდება მხოლოდ მეხსიერებაში გაშიფვრის შემდეგ. ამიტომ, ეფექტური დაცვა მოითხოვს დაშიფვრაზე ორიენტირებულ ანალიზს, ქცევითი ნიმუშების ამოცნობას და ინსტალაციის მოვლენების მიღმა დამოკიდებულების უწყვეტ მონიტორინგს.
რეესტრის გაუქმება რეაქტიულია. გაშვების დროის ანალიზი პრევენციულია.
რატომ არის მნიშვნელოვანი ეს npm ინფორმაციის მპარავი
Nyx Stealer წარმოადგენს npm-ზე დაფუძნებული მავნე პროგრამების სტრუქტურულ ევოლუციას.
ისტორიულად, ბევრი მავნე პაკეტი ეყრდნობოდა ინსტალაციის დროის ხილულ სკრიპტებს ან აშკარა ავტორიზაციის ამოღების საბოლოო წერტილებს. ამის საპირისპიროდ, ეს კამპანია შიფრავს თავის დატვირთვას, გადადებს შესრულებას გაშვების დროისთვის, იყენებს ლეგიტიმურ ოპერაციული სისტემის API-ებს და ამყარებს მუდმივობას სანდო აპლიკაციებში.
შესაბამისად, თავდამსხმელს არ სჭირდება npm ინფრასტრუქტურის ექსპლუატაცია. სამაგიეროდ, შეტევა წარმატებულია, რადგან დამოკიდებულების ინსტალაცია ნდობას გულისხმობს. დეველოპერები ვარაუდობენ, რომ ბიბლიოთეკის იმპორტი უსაფრთხო ოპერაციაა, განსაკუთრებით მაშინ, როდესაც ის პოპულარული ინსტრუმენტის სავარაუდო ფორკად წარმოგვიდგება.
ეკოსისტემების ზრდასთან და ფორკების გამრავლებასთან ერთად, ეს იმპლიციტური ნდობის საზღვარი სულ უფრო მიმზიდველი შეტევის ზედაპირი ხდება. ამიტომ, თანამედროვე npm ინფორმაციის მოპარვისგან დაცვა მოითხოვს არქიტექტურული ნიმუშების ამოცნობას და არა სტატიკური სტრიქონების ძიებას.
საბოლოო ჯამში, ეს კამპანია აძლიერებს კრიტიკულ გაკვეთილს software supply chain securityყველაზე საშიში საფრთხეები არ არის ის, რაც ერთი შეხედვით მავნედ გამოიყურება, არამედ ის, რაც სტრუქტურულად ლეგიტიმურად გამოიყურება მანამ, სანამ გაშვების დრო მათ ნამდვილ ქცევას არ გამოავლენს.




