Một chiến dịch lừa đảo tinh vi nhắm vào các nhà duy trì gói npm đã leo thang thành một cuộc tấn công chuỗi cung ứng nghiêm trọng, dẫn đến việc chiếm đoạt gói “is” phổ biến với khoảng 2.8 triệu lượt tải xuống hàng tuần. Cuộc tấn công này cho thấy mức độ phức tạp của các mối đe dọa mạng hiện nay, đặc biệt là trong môi trường phát triển phần mềm phụ thuộc vào các thư viện bên ngoài.
Chiến thuật Tấn công Ban đầu và Chiếm đoạt Tài khoản
Cuộc tấn công bắt đầu bằng các email lừa đảo (phishing) mạo danh địa chỉ [email protected] của npm. Các email này đã điều hướng nhà phát triển đến một miền typosquatting, npnjs.com, một trang web gần như tương tự với trang npmjs.com hợp pháp. Mục tiêu chính là thu thập thông tin đăng nhập thông qua một liên kết đăng nhập được mã hóa (tokenized login link).
Chiến dịch này được thực hiện một cách bán mục tiêu, tập trung vào các nhà duy trì có hồ sơ cao, bao gồm những người quản lý các gói có tổng cộng hàng chục triệu lượt tải xuống. Việc thiếu các bản ghi DMARC và SPF trên npmjs.org đã cho phép các email mạo danh vượt qua một số bộ lọc, trực tiếp đến hộp thư đến của nạn nhân. Điều này tạo điều kiện thuận lợi cho kẻ tấn công đánh cắp các token npm hợp lệ.
Khi các token này bị đánh cắp, kẻ tấn công đã sử dụng chúng để xuất bản các phiên bản độc hại của nhiều gói npm. Quá trình này tự động hóa việc phân phối mã độc thông qua cơ chế giải quyết phụ thuộc trong các quy trình làm việc của nhà phát triển và các đường ống CI/CD (Continuous Integration/Continuous Delivery). Điều này biến các thư viện đáng tin cậy thành phương tiện để nhúng tải trọng độc hại, một đặc điểm điển hình của tấn công chuỗi cung ứng.
Phân tích Mã độc JavaScript trong Gói ‘is’ – Một Mắt Xích trong Tấn Công Chuỗi Cung Ứng
Gói ‘is’, vốn cung cấp các hàm tiện ích cho việc kiểm tra và xác thực kiểu dữ liệu, đã bị sửa đổi trong các phiên bản 3.3.1 và 5.0.0. Các phiên bản này chứa một bộ tải mã độc JavaScript đa nền tảng. Bộ tải này, được phát hiện bởi máy quét AI của Socket, sử dụng kỹ thuật che giấu mạnh mẽ.
Mã độc sử dụng một bộ giải mã bảng chữ cái tùy chỉnh gồm 94 ký tự để tái tạo và thực thi tải trọng trong bộ nhớ thông qua hàm new Function. Kỹ thuật này giúp mã độc né tránh các công cụ pháp y dựa trên đĩa cứng, gây khó khăn cho việc phân tích và phát hiện. Sự phức tạp trong cách thức che giấu cho thấy sự tinh vi của tấn công chuỗi cung ứng này.
Cơ chế Hoạt động và Khai thác Hệ thống
Khi được kích hoạt trong môi trường Node.js (phiên bản 12 trở lên trên macOS, Linux hoặc Windows), mã độc sẽ tiến hành thu thập dấu vân tay của máy chủ. Nó truy vấn mô-đun os để lấy các chi tiết như tên máy chủ, nền tảng và kiến trúc CPU. Đồng thời, mã độc cũng thu thập tất cả các biến môi trường từ process.env.
Sau đó, nó tự động nhập thư viện ws để thiết lập kết nối WebSocket tới một điểm cuối do kẻ tấn công kiểm soát. Kết nối này cho phép đánh cắp dữ liệu và thực thi mã từ xa (Remote Code Execution) theo thời gian thực. Bất kỳ thông điệp WebSocket đến nào cũng được xử lý như JavaScript có thể thực thi được. Điều này cấp cho kẻ tấn công một shell tương tác với đầy đủ quyền truy cập hệ thống tệp và mạng, tương đương với tiến trình máy chủ bị xâm phạm.
Kẻ tấn công có thể thu thập các hiện vật nhạy cảm như tệp .npmrc, cấu hình Git remote và cả khóa SSH. Để duy trì quyền truy cập (persistence), mã độc tự ghi đè lên tệp index.js của gói, đòi hỏi việc đặt lại các tệp lockfile để loại bỏ hoàn toàn. Điều này nhấn mạnh nguy cơ của một cuộc tấn công mạng kiểu này khi kẻ xấu chiếm được quyền điều khiển.
Payload Chuyên biệt cho Windows: Scavenger
Quá trình kỹ thuật dịch ngược của Humpty’s RE Blog đã phát hiện ra một tải trọng bổ sung dành riêng cho Windows, được gọi là Scavenger. Payload này được ẩn trong các gói liên quan như eslint-config-prettier. Scavenger là một DLL (node-gyp.dll) sử dụng các kỹ thuật chống phân tích, các lệnh gọi hệ thống gián tiếp và giao tiếp C2 được mã hóa.
Mục tiêu của Scavenger là đánh cắp dữ liệu trình duyệt, bao gồm tiện ích mở rộng Chrome và bộ nhớ đệm phiên. Cách tiếp cận đa tải trọng này, với JavaScript cho khả năng tương thích rộng và DLL cho việc đánh cắp dữ liệu mục tiêu trên Windows, tối đa hóa phạm vi lây nhiễm. Điều này cho thấy sự linh hoạt và khả năng thích ứng của kẻ tấn công trong tấn công chuỗi cung ứng.
Các Gói npm Bị Chiếm Đoạt Khác và Tác Động Nghiêm trọng
Ngoài gói ‘is’, các gói npm khác cũng bị chiếm đoạt và chèn mã độc bao gồm:
eslint-plugin-prettiersynckit@pkgr/corenapi-postinstallgot-fetch
Các phiên bản độc hại của những gói này đã giới thiệu các bộ tải hoặc phần mềm đánh cắp thông tin tương tự. Tác động của cuộc tấn công chuỗi cung ứng này rất nghiêm trọng. Nhiều nhà phát triển bị ảnh hưởng trên Hacker News đã báo cáo việc Chrome bị giả mạo cờ bảo mật, nguy cơ bị xâm phạm thông tin đăng nhập và thậm chí phải thực hiện các biện pháp khắc phục cực đoan như thay thế toàn bộ SSD và cài đặt lại hệ điều hành. Các bản cập nhật phụ thuộc mù quáng đã được chứng minh là rất rủi ro. Mã độc có thể tồn tại ngay cả sau khi khôi phục đơn giản bằng cách giả mạo hệ thống và đánh cắp khóa.
Jordan Harband, một nhà duy trì gói ‘is’, đã xác nhận rằng sự thỏa hiệp của gói này bắt nguồn từ việc tài khoản của một đồng duy trì bị chiếm đoạt, có thể thông qua cùng một vector lừa đảo. Sự cố này cũng làm nổi bật những lỗ hổng trong cơ chế thông báo của npm, một yếu tố quan trọng trong việc phòng chống các cuộc tấn công chuỗi cung ứng tương lai.
Chỉ số Nhận diện Sự xâm nhập (IOCs)
Dựa trên phân tích, các chỉ số nhận diện sự xâm nhập (IOCs) liên quan đến cuộc tấn công mạng này bao gồm:
- Miền typosquatting được sử dụng trong tấn công Phishing:
npnjs.com - Các phiên bản gói npm độc hại:
is(phiên bản 3.3.1 và 5.0.0)eslint-config-prettiereslint-plugin-prettiersynckit@pkgr/corenapi-postinstallgot-fetch
- Tên tệp DLL của payload Scavenger:
node-gyp.dll
Biện pháp Phòng ngừa và Giảm thiểu Rủi ro
Để bảo vệ hệ thống khỏi các cuộc tấn công chuỗi cung ứng tương tự và tăng cường bảo mật mạng, các nhà phát triển và tổ chức được khuyến nghị thực hiện các biện pháp sau:
- Bật xác thực hai yếu tố (2FA): Áp dụng 2FA cho tất cả các tài khoản quản lý gói và hệ thống nhạy cảm để ngăn chặn việc chiếm đoạt tài khoản.
- Sử dụng token có phạm vi (Scoped tokens): Hạn chế quyền hạn của các token npm chỉ ở mức cần thiết cho các tác vụ cụ thể, giảm thiểu thiệt hại nếu token bị lộ.
- Sử dụng công cụ phát hiện mối đe dọa thời gian thực: Triển khai các công cụ như Socket’s GitHub App hoặc Safe npm CLI để phân tích và phát hiện hơn 70 chỉ số rủi ro chuỗi cung ứng.
- Thường xuyên kiểm tra và cập nhật phụ thuộc: Tránh các bản cập nhật phụ thuộc mù quáng. Thay vào đó, kiểm tra cẩn thận các thay đổi trong gói trước khi cập nhật.
- Áp dụng nguyên tắc ít đặc quyền nhất: Đảm bảo các hệ thống CI/CD và môi trường phát triển chỉ có các quyền cần thiết.
Việc nâng cao nhận thức về các kỹ thuật lừa đảo và tăng cường các biện pháp an ninh tổng thể là rất quan trọng để đối phó với những mối đe dọa mạng ngày càng tinh vi.










