Tấn Công Chuỗi Cung Ứng npm: Phishing Mục Tiêu Maintainer và Mã Độc JavaScript

Các tác nhân đe dọa đã tận dụng một chiến dịch phishing nhắm mục tiêu vào các maintainer gói npm, dẫn đến việc xâm phạm các thư viện công cụ JavaScript được sử dụng rộng rãi.

Chiến dịch Phishing nhắm mục tiêu Maintainer npm

Chiến dịch này, được báo cáo lần đầu vào ngày 18 tháng 7 năm 2025, sử dụng một tên miền typosquatted, npnjs.com, để giả mạo các thông tin liên lạc npm hợp pháp và lừa các nhà phát triển giao nộp các token xác thực của họ.

Phương thức Tấn công

Hoạt động nhiều giai đoạn này bắt đầu bằng các email tự động được thu thập từ siêu dữ liệu npm công khai, chẳng hạn như chi tiết đăng ký và thông tin maintainer. Điều này cho phép những kẻ tấn công lập danh sách mục tiêu các cá nhân có giá trị cao chịu trách nhiệm cho các repository phổ biến. Một khi thông tin đăng nhập được thu thập, kẻ tấn công khai thác các token npm bị đánh cắp để xuất bản các phiên bản gói độc hại trực tiếp lên npm registry, bỏ qua các repository GitHub và các quy trình đánh giá mã liên quan.

Kỹ thuật Stealthy

Cách tiếp cận này giúp các vụ xâm nhập đặc biệt lén lút, vì không có commit hoặc pull request tương ứng nào xuất hiện trong các hệ thống kiểm soát mã nguồn. Điều này làm trì hoãn việc phát hiện bởi các công cụ giám sát tự động, kéo dài thời gian tồn tại của mã độc trong hệ sinh thái.

Ảnh hưởng và Các Phiên bản Bị Compromise

Một trường hợp nổi bật của chiến dịch này liên quan đến hệ sinh thái Prettier, nơi các gói như eslint-config-prettiereslint-plugin-prettier đã bị xâm nhập. Các maintainer xác nhận rằng một email phishing từ tên miền giả mạo npnjs.com đã dẫn đến việc đánh cắp một token npm, cho phép xuất bản trái phép các bản phát hành bị nhiễm độc.

Cụ thể, các phiên bản như eslint-config-prettier 8.10.1, 9.1.1, 10.1.6, và 10.1.7; eslint-plugin-prettier 4.2.2 và 4.2.3; synckit 0.11.9; @pkgr/core 0.2.8; và napi-postinstall 0.3.1 đã bị tiêm các payload độc hại.

Chi tiết Payload và Cơ chế Khai thác

Các thay đổi này bao gồm các khai thác dành riêng cho Windows, cố gắng tải một file DLL, node-gyp.dll, thông qua tiện ích rundll32. Điều này có khả năng cho phép thực thi mã từ xa (RCE) trên các hệ thống bị ảnh hưởng. Thiết kế của malware tập trung vào các script post-installation (sau cài đặt), có thể thực thi mã tùy ý trong quá trình phân giải dependency trong môi trường Node.js. Điều này làm tăng rủi ro cho các bên tiêu thụ hạ nguồn phụ thuộc vào các trình quản lý dependency tự động như Dependabot hoặc Renovate.

Tác động đến Chuỗi Cung ứng Phần mềm Mở

Sự cố này làm nổi bật những lỗ hổng cố hữu trong chuỗi cung ứng phần mềm mã nguồn mở. Các công cụ như Prettier và tích hợp ESLint phổ biến trong hàng nghìn dự án, tạo điều kiện cho việc tự động hấp thụ các phiên bản được gắn thẻ “latest” thông qua các pipeline CI/CD. Sự cố này minh họa một kịch bản leo thang tấn công credential-stuffing kinh điển: phishing thu thập token, kẻ tấn công xuất bản các artifact giả mạo, và hệ sinh thái truyền bá malware thông qua các dependency không được ghim phiên bản cụ thể.

Tốc độ Lan truyền và Tầm quan trọng của Phản ứng

Cửa sổ phơi nhiễm chỉ kéo dài vài giờ cho thấy tốc độ mà các cuộc tấn công như vậy có thể lan truyền, có khả năng xâm phạm môi trường xây dựng và máy trạm của nhà phát triển trước khi các biện pháp giảm thiểu có hiệu lực.

Biện pháp Phản ứng và Giảm thiểu

Đối với Maintainer

Để phản ứng lại, maintainer bị ảnh hưởng đã nhanh chóng thu hồi token bị xâm phạm, xoay vòng tất cả các thông tin đăng nhập, ngừng sử dụng (deprecated) các phiên bản độc hại để ngăn chặn các bản nâng cấp tự động, và hợp tác với bộ phận hỗ trợ của npm để xóa các bản phát hành bị nhiễm độc khỏi registry.

Đối với Nhà phát triển và Tổ chức

Kiểm tra và Khôi phục

Đối với các nhà phát triển và tổ chức, các hành động tức thì bao gồm kiểm tra các file package lockfile để tìm các phiên bản dễ bị tổn thương đã được liệt kê và khôi phục về các phiên bản cơ sở an toàn, chẳng hạn như eslint-config-prettier 10.1.5 hoặc các phiên bản trước đó. Việc vệ sinh triệt để bao gồm xóa các thư mục node_modules, xóa cache npm, và cài đặt lại từ các nguồn đã xác minh.

Ví dụ về lệnh để xóa cache npm:

npm cache clean --force

Sau đó, xóa thư mục node_modules và cài đặt lại dependencies:

rm -rf node_modules
npm install

Biện pháp Phòng ngừa Chủ động

Một biện pháp phòng ngừa chủ động quan trọng là kích hoạt xác thực hai yếu tố (2FA) trên các tài khoản npm để ngăn chặn việc đánh cắp token. Gắn ghim phiên bản gói chính xác (pinning exact package versions) trong cấu hình sản xuất và CI sẽ giảm thiểu rủi ro từ các thẻ nổi (floating tags) như latest. Việc này đảm bảo rằng các bản cập nhật chỉ diễn ra sau khi được kiểm tra và phê duyệt.

Các công cụ bảo mật quét các hành vi bất thường, như các script cài đặt không mong muốn hoặc các binary nhúng, có thể cung cấp cảnh báo sớm. Điều này đã được chứng minh bởi các nền tảng giám sát npm để phát hiện mối đe dọa theo thời gian thực.

Khi chiến dịch này tiếp tục diễn ra, với kỳ vọng về các vụ xâm phạm maintainer bổ sung từ siêu dữ liệu bị cạo, hệ sinh thái npm phải đối mặt với một vector tấn công liên tục đòi hỏi cảnh giác cao độ và vệ sinh thông tin đăng nhập mạnh mẽ để ngăn chặn các gián đoạn chuỗi cung ứng tiếp theo.

Indicators of Compromise (IOCs)

Các phiên bản gói npm bị ảnh hưởng trong chiến dịch này bao gồm:

  • eslint-config-prettier:
    • 8.10.1
    • 9.1.1
    • 10.1.6
    • 10.1.7
  • eslint-plugin-prettier:
    • 4.2.2
    • 4.2.3
  • synckit:
    • 0.11.9
  • @pkgr/core:
    • 0.2.8
  • napi-postinstall:
    • 0.3.1

Tên miền Typosquatted được sử dụng:

  • npnjs.com