Làn sóng malware mới trên npm: Chỉ cần cài package là mất dữ liệu

Tổng quan
Trong những năm gần đây, các cuộc tấn công chuỗi cung ứng phần mềm (software supply chain attack) đang trở thành một trong những mối đe dọa nghiêm trọng nhất đối với hệ sinh thái phát triển phần mềm hiện đại. Thay vì tấn công trực tiếp vào hệ thống mục tiêu, kẻ tấn công tập trung vào các thành phần phụ thuộc (dependencies) mà lập trình viên sử dụng hàng ngày. Khi một dependency bị cài cắm mã độc, tác động của nó có thể lan rộng tới hàng nghìn dự án phần mềm khác nhau.
Một ví dụ điển hình cho xu hướng này là chiến dịch PhantomRaven, nhắm vào hệ sinh thái npm – hệ thống quản lý package phổ biến nhất cho Node.js. Trong chiến dịch này, kẻ tấn công đã phát tán hàng chục package độc hại thông qua nhiều tài khoản npm khác nhau nhằm đánh cắp thông tin nhạy cảm từ môi trường phát triển của lập trình viên. Các package này được thiết kế để trông giống như các thư viện hợp lệ hoặc những package có thể được lập trình viên vô tình cài đặt khi tìm kiếm dependency cho dự án của mình.
Điểm đáng chú ý của PhantomRaven là việc sử dụng kỹ thuật Remote Dynamic Dependencies (RDD). Thay vì chứa trực tiếp mã độc trong package npm, các package này chỉ đóng vai trò như một “loader”, sau đó tải payload từ máy chủ bên ngoài trong quá trình cài đặt.
Trong các phần tiếp theo, bài viết sẽ đi sâu vào phân tích luồng hoạt động của chiến dịch PhantomRaven, nguyên nhân gốc rễ của lỗ hổng bị khai thác, các kỹ thuật khai thác được sử dụng, cũng như việc ánh xạ các hành vi tấn công với framework MITRE ATT&CK để làm rõ toàn bộ bức tranh của chiến dịch này.
Nguyên nhân chiến dịch
Thiếu kiểm soát dependency từ URL bên ngoài: Điều này có nghĩa là npm cho phép dependency được định nghĩa bằng remote URL, dẫn đến việc: code độc hại có thể được tải runtime và không bị kiểm tra bởi registry scanner.
Thiếu xác minh package: Một điểm đặc biệt trong hệ sinh thái npm đó là nó có tới hàng triệu package và bất kỳ ai cũng có thể publish package. Điều này đã vô tình tạo điều kiện cho attacker phát tán package giả mạo.
Sự phụ thuộc vào AI gợi ý thư viện: Một số package được thiết kế theo kỹ thuật slopsquatting. Tức là attacker đăng ký package với tên mà AI có thể “hallucinate” sau đó developer tin tưởng AI và cài đặt package.
Luồng tấn công
Như đã đề cập phía trên thì ở giai đoạn đầu, kẻ tấn công đăng tải hàng loạt package độc hại lên npm registry thông qua nhiều tài khoản khác nhau. Các package này thường được đặt tên theo kỹ thuật slopsquatting, tức là sử dụng những tên giống thư viện phổ biến hoặc giống các package có thể được AI gợi ý.
Ví dụ chúng có thể giả mạo các thư viện liên quan đến: Babel plugins, GraphQL tooling, ESLint configuration, developer utilities. Điều này làm tăng khả năng developer vô tình cài đặt các package độc hại khi tìm kiếm dependency cho dự án.
Tiếp đến sẽ là quá trình cài đặt package độc hại. Tại đây các Developer đã tin tưởng và cài đặt package bằng lệnh: npm install <package>.
Trong chiến dịch PhantomRaven, các package này chứa một kỹ thuật đặc biệt gọi là Remote Dynamic Dependencies (RDD). Thay vì khai báo dependency từ npm registry, package sẽ chỉ định dependency trỏ tới URL bên ngoài do attacker kiểm soát.
Ngay sau khi npm install được thực thi nó sẽ thực hiện một loạt các hành vi liên tiếp từ việc, đọc package.json, phát hiện dependency trỏ tới URL, tự động tải package từ server attacker rồi sau đó cài đặt dependency đó vào môi trường local. Như vậy, payload độc hại không tồn tại trong npm registry, mà được tải trực tiếp từ server của attacker trong quá trình cài đặt.
Sau khi dependency được tải xuống, mã độc sẽ được thực thi thông qua npm lifecycle scripts, thường là: preinstall, install hoặc postinstall. Những script này sẽ chạy tự động trong quá trình cài package mà không cần sự tương tác của người dùng. Payload trong PhantomRaven gần như giống nhau giữa các đợt tấn công, trong quá trình nghiên cứu cho thấy 257/259 dòng code của malware là giống nhau giữa các wave của chiến dịch. Điều này cho thấy attacker tập trung vào thay đổi hạ tầng phân phối hơn là thay đổi payload.
Sau khi thực thi, malware bắt đầu thu thập thông tin từ môi trường của developer. Thông tin đầu tiên mà kẻ tấn công nhắm đến chính là "cấu hình developer". Tại đây malware sẽ thực hiện đọc file hai file quan trọng: ~/.gitconfig và ~/.npmrc. Đây được coi là lưu trữ email developer, npm authentication token và git credential. Malware cũng kiểm tra environment variables để tìm token hoặc secret.
Một mục tiêu quan trọng khác của PhantomRaven là các token dùng trong pipeline DevOps. Malware tìm kiếm credential liên quan đến: GitHub Actions, GitLab CI, Jenkins, CircleCI. Hiểu cách khác là khi chiếm được những thứ này, kẻ tấn công sẽ có thể: truy cập repository, sửa pipeline build và nguy hiểm nhất đó là chèn mã độc vào phần mềm phát hành.
Ngoài credential, malware cũng thu thập thông tin hệ thống nhằm xác định nạn nhân: IP address, hostname, hệ điều hành rồi phiên bản Node.js mà nạn nhân đang dùng. Thông tin này giúp attacker phân loại nạn nhân và điều chỉnh payload theo một cách phù hợp mà chúng mong muốn.
Một chiến dịch tấn công nào cũng vậy, sẽ đều có hệ thống máy chủ C2 - nơi mà kẻ tấn công nhận lệnh cũng như gửi thông tin. Sau khi đã lấy được thông tin cần thiết chúng sẽ thiết lập các phương thức: HTTP GET request, HTTP POST request, WebSocket connection để kết nối C2 Server.
Việc sử dụng nhiều phương thức truyền dữ liệu giúp malware có khả năng duy trì kết nối ngay cả khi một giao thức bị chặn cũng như vượt qua các cơ chế giám sát mạng. Sau khi nhận được dữ liệu đánh cắp, attacker có thể: truy cập repository private, đánh cắp source code, chỉnh sửa pipeline CI/CD, chèn backdoor vào phần mềm build. Điều này biến PhantomRaven từ một cuộc tấn công vào developer cá nhân thành một cuộc tấn công chuỗi cung ứng phần mềm quy mô lớn.
Mapping MITRE ATT&CK
| Tactic | Technique | Description |
|---|---|---|
| Initial Access | T1195 – Supply Chain Compromise | Phát tán package độc hại trên npm |
| Execution | T1059 – Command and Script Interpreter | Script JavaScript chạy khi cài dependency |
| Discovery | T1082 – System Information Discovery | Thu thập thông tin hệ thống |
| Credential Access | T1552 – Unsecured Credentials | Truy xuất token từ config files |
| Collection | T1005 – Data from Local System | Thu thập dữ liệu developer |
| Exfiltration | T1041 – Exfiltration Over C2 Channel | Gửi dữ liệu tới server attacker |
| Command and Control | T1071 – Application Layer Protocol | Sử dụng HTTP/WebSocket |
Kết luận
Chiến dịch PhantomRaven cho thấy sự tiến hóa của các cuộc tấn công chuỗi cung ứng trong hệ sinh thái open source. Bằng cách kết hợp slopsquatting, Remote Dynamic Dependencies, và data harvesting scripts, attacker có thể âm thầm đánh cắp dữ liệu developer ngay trong quá trình cài đặt package.
Trong bối cảnh npm chứa hàng triệu dependency, chỉ một package độc hại cũng có thể dẫn đến compromise toàn bộ chuỗi phát triển phần mềm.
Do đó, việc kiểm soát dependency, giám sát hành vi cài đặt và bảo vệ token DevOps là yếu tố quan trọng để giảm thiểu rủi ro từ các chiến dịch tương tự.
Khuyến nghị
Kiểm tra và xác minh package trước khi cài đặt
Số lượng lượt tải xuống (downloads): Các package phổ biến thường có lượng download lớn và ổn định.
Repository nguồn: Kiểm tra xem package có liên kết tới repository GitHub hoặc GitLab hợp lệ hay không.
Lịch sử cập nhật: Package đáng tin cậy thường có lịch sử commit rõ ràng và maintainer hoạt động.
Maintainer uy tín: Tránh cài đặt package được publish bởi tài khoản mới tạo hoặc ít thông tin.
Hạn chế sử dụng dependency từ URL bên ngoài
Chỉ sử dụng dependency từ npm registry chính thức
Không sử dụng dependency từ URL không xác minh
Kiểm tra file
package.jsoncủa các package mới cài
Bảo vệ token và thông tin xác thực
Không lưu token trực tiếp trong file cấu hình
Sử dụng secret manager hoặc environment vault
Thiết lập token expiration
Xoay vòng token định kỳ (token rotation)
Giám sát hành vi network trong quá trình cài đặt
Trong nhiều trường hợp, malware sẽ kết nối tới server attacker ngay khi package được cài đặt.
Do đó nên:
Giám sát lưu lượng mạng trong quá trình
npm installPhát hiện kết nối tới domain lạ
Chặn request tới domain không nằm trong whitelist.
Nâng cao nhận thức bảo mật cho developer
Các tổ chức nên đào tạo developer về:
Rủi ro từ supply chain attack
Cách nhận diện package độc hại
Cách bảo vệ token và secret.
IOCs
Malicious Domain
packages.storeartifact.com
npm.jpartifacts.com
package.storeartifacts.com
npm.artifactsnpm.com
URL / Phishing
https://airtable.com/appz4nCLxGPcHqdBW/shr9uFgyeZIubJlPV/tbl1eP2Yz0wiJb546/viwB5oWwcsH08FjVm
https://airtable.com/appremzEfrzMpskzA/shrWcQ3t3TCDXLzti/tblSZUfjjtIthEsRo/viwTONuWd3KMfQU0
MD5
AC89EE798372724756025B6EF400BDDD
328BE455C1BD821A4F04194B8C905C6D
AF24E5FCEBA310E0953FA34AE40B75E5
685017977342F93705E4A99B256D0B18
SHA1
1C0BB37868D0208128EB99D0D2DD994DCC45F46F
58EC6F2D933DAE3D4685CF5B318D13E564308FBC
C1AF38C04ED6D848904D99CBC322ABE6014B04F0
AF387331734F4575F6ED7FE3F919E70F6781A8B5
SHA256
6F78E06CB72FD69F93F8E7A38F8F0B9A146F99DDA0C9C8729886C522D0CE18C9
BFAEA094A6908594813CC0D8F257A602143D041A2CAFEAF1E18F19AE0642E489
53638DD5FD06CABBB6CDA83908BF5205A6AFBAFF500135607B0ACBFB18321F57
C227036E15FDC1AE368034AB737EC330C9B3CC029470C4C72B5324B4D9303A1F
IP C2 Server
54.173.15.59
100.26.42.247
13.219.250.107
54.227.45.171






