Nghiêm trọng: Tấn công chuỗi cung ứng mã độc NPM Axios

Vào ngày 30 tháng 3 năm 2026, một trong những thư viện JavaScript được sử dụng rộng rãi nhất thế giới đã bị biến thành vũ khí khi những kẻ tấn công làm nhiễm độc gói npm Axios, triển khai mã độc một cách âm thầm trên các máy của nhà phát triển chạy Windows, macOS và Linux. Sự kiện này đánh dấu một cuộc tấn công chuỗi cung ứng nghiêm trọng với quy mô lan truyền rộng lớn.
Với hơn 100 triệu lượt tải xuống hàng tuần, Axios là ứng dụng khách HTTP phổ biến nhất trong hệ sinh thái JavaScript. Điều này khiến cuộc tấn công chuỗi cung ứng này trở thành một trong những sự cố có tầm ảnh hưởng lớn nhất thuộc loại này.
Tổng quan về Cuộc Tấn công Chuỗi Cung Ứng Axios
Nguồn gốc và Quy mô Tấn công
Cuộc tấn công bắt đầu khi một tác nhân trái phép giành quyền kiểm soát tài khoản npm của Jason Saayman, người bảo trì chính dự án Axios. Địa chỉ email của tài khoản này đã bị thay đổi một cách âm thầm thành một địa chỉ ProtonMail do kẻ tấn công kiểm soát, cấp cho kẻ xâm nhập quyền truy cập cấp quản trị viên đầy đủ.
Sử dụng một token truy cập npm bị đánh cắp, kẻ tấn công đã phát hành thủ công hai phiên bản bị nhiễm độc — [email protected] và [email protected] — trong vòng 39 phút. Các phiên bản này bao gồm cả nhánh phát hành hiện tại và cũ.
Không có phiên bản nào khớp với bất kỳ commit, tag hoặc bản phát hành nào trong kho lưu trữ GitHub chính thức của Axios. Các nhà nghiên cứu Peter Girnus và Jacob Santos từ Trend Micro đã tiến hành kiểm tra pháp y về cuộc tấn công này, khám phá toàn bộ chuỗi lây nhiễm và mức độ thiệt hại của nó.
Phân tích của họ cho thấy mối đe dọa đã lan rộng đến các tổ chức trong các lĩnh vực chính phủ, tài chính, y tế, sản xuất, bán lẻ và công nghệ tại thời điểm điều tra. Dữ liệu từ xa cũng xác nhận việc khai thác tích cực trong cửa sổ tấn công.
Các Phiên bản Bị Ảnh hưởng
Cơ chế Triển khai Mã độc
Sự Xuất hiện của Phantom Dependency
Cả hai phiên bản bị nhiễm độc đều chứa một bổ sung mới duy nhất vào manifest gói của chúng: [email protected], một dependency “ma” (phantom dependency). Gói này không bao giờ được import hoặc tham chiếu ở bất kỳ đâu trong mã nguồn Axios — trên tất cả 86 tệp — và tồn tại hoàn toàn để kích hoạt hook postinstall tự động của npm trong quá trình cài đặt.
Cơ chế Kích hoạt Postinstall Hook
Khi hook này được kích hoạt, nó đã thả một Remote Access Trojan (RAT) đa nền tảng lên máy của nạn nhân. Sau khi thực thi, mã độc đã xóa script dropper của chính nó và thay thế bằng một mồi nhử sạch, khiến thư mục node_modules trông hoàn toàn bình thường.
Kỹ thuật Trốn tránh Phát hiện
Hoạt động này được dàn dựng một cách chính xác trong khoảng 18 giờ. Kẻ tấn công lần đầu tiên xuất bản một phiên bản mồi nhử sạch của plain-crypto-js để xây dựng lịch sử registry và tránh gây báo động. Sau đó, họ đã đăng ký máy chủ command-and-control (C2) vài giờ sau trước khi đẩy payload độc hại.
Cuộc tấn công này cũng đã bỏ qua các biện pháp bảo vệ OIDC Trusted Publisher của GitHub Actions — một cơ chế kiểm soát thường liên kết các bản phát hành npm với các quy trình làm việc CI đã được xác minh — bằng cách phát hành thủ công bằng một token bị đánh cắp, không để lại liên kết mã hóa hoặc tham chiếu gitHead trong metadata. Để tìm hiểu thêm về phân tích chuyên sâu, có thể tham khảo báo cáo từ Trend Micro: Phân tích cuộc tấn công Axios npm package.
Phân tích Mã độc và Các Biến thể
Kỹ thuật Che giấu của Dropper
Dropper, có tên setup.js, sử dụng hệ thống che giấu hai lớp để ẩn logic của nó khỏi các máy quét tự động. Lớp bên trong áp dụng thuật toán mã hóa XOR tùy chỉnh với khóa “OrDeR_7077” và một mẫu chỉ mục bậc hai để xáo trộn các chuỗi truy cập ký tự.
Lớp bên ngoài đảo ngược các chuỗi được mã hóa, khôi phục phần đệm base64 và chuyển kết quả qua mã hóa bên trong. Tất cả các tên module — bao gồm truy cập hệ thống tệp, thực thi shell và phát hiện nền tảng — đều được giải mã tại thời gian chạy thông qua các lệnh gọi require() động, khiến chúng trở nên vô hình đối với các công cụ phân tích tĩnh.
Triển khai RAT trên các Nền tảng
Khi chạy, dropper phát hiện hệ điều hành và khởi chạy payload phù hợp:
- Trên macOS: Nó tìm nạp một binary thông qua AppleScript và lưu nó dưới một đường dẫn mô phỏng daemon hệ thống của Apple.
- Trên Windows: Nó sử dụng VBScript launcher để chạy một PowerShell RAT hoàn toàn trong bộ nhớ, sử dụng một binary PowerShell được đổi tên thành Windows Terminal, không có payload nào được ghi vào đĩa.
- Trên Linux: Nó tải xuống một Python RAT và khởi chạy nó dưới dạng một tiến trình nền độc lập được gán cho PID 1, tồn tại sau phiên cài đặt npm.
Hạ tầng Command-and-Control (C2)
Máy chủ C&C, sfrclak[.]com, được đăng ký chỉ tám giờ trước khi payload hoạt động. Đây là một lựa chọn hạ tầng dùng một lần được thiết kế để hạn chế khả năng bị lộ của kẻ tấn công trong cuộc tấn công chuỗi cung ứng này.
Các Chỉ số Thỏa hiệp (IOCs)
Các tổ chức và nhà phát triển nên kiểm tra hệ thống của mình để phát hiện các chỉ số thỏa hiệp sau:
- Tên miền C2:
sfrclak[.]com - Phiên bản gói npm độc hại:
[email protected],[email protected] - Phantom Dependency:
[email protected] - Khóa giải mã dropper:
OrDeR_7077(đối với thuật toán XOR)
Biện pháp Khắc phục và Phòng ngừa
Để giảm thiểu rủi ro từ cuộc tấn công chuỗi cung ứng này và các lỗ hổng bảo mật tương tự trong tương lai, cần thực hiện các bước sau:
Hành động Khắc phục Ngay lập tức
Các nhà phát triển đã cài đặt các phiên bản bị ảnh hưởng nên ngay lập tức ghim lại phiên bản [email protected] hoặc [email protected] và xóa thư mục plain-crypto-js khỏi node_modules.
npm install [email protected]# Hoặcnpm install [email protected]# Sau đó, xóa thư mục plain-crypto-js:# Trên Linux/macOS:rm -rf node_modules/plain-crypto-js# Trên Windows (trong PowerShell):Remove-Item -Recurse -Force node_modules\plain-crypto-jsBất kỳ hệ thống nào phát hiện thấy các artifact của RAT nên được xây dựng lại từ một trạng thái đã biết là tốt, thay vì chỉ cố gắng làm sạch tại chỗ. Tất cả các thông tin đăng nhập có thể truy cập trong cửa sổ bị lộ — bao gồm npm tokens, cloud keys, CI/CD secrets và SSH keys — phải được xoay vòng ngay lập tức.
Tăng cường Bảo mật trong CI/CD
Sử dụng lệnh npm ci --ignore-scripts trong các pipeline CI/CD sẽ chặn các hook postinstall, loại bỏ đường dẫn thực thi cốt lõi mà cuộc tấn công này đã dựa vào.
npm ci --ignore-scriptsNgăn chặn ở Cấp độ Mạng
Chặn sfrclak[.]com ở cấp độ mạng cũng được khuyến nghị mạnh mẽ để ngăn chặn kết nối Command-and-Control.
Việc liên tục cập nhật và kiểm tra các dependency là chìa khóa để giảm thiểu rủi ro từ các cuộc tấn công chuỗi cung ứng. Cảnh giác với các thay đổi bất thường trong các gói npm và áp dụng các biện pháp bảo mật nghiêm ngặt là điều cần thiết để bảo vệ hệ sinh thái phát triển.







