Tấn công chuỗi cung ứng phần mềm: Nguy hiểm lan rộng

Tấn công chuỗi cung ứng phần mềm: Nguy hiểm lan rộng

Tấn công chuỗi cung ứng phần mềm mới đây đã làm lộ ra rủi ro an ninh mạng nghiêm trọng khi hơn 170 gói npm2 gói PyPI bị chèn mã độc nhằm đánh cắp thông tin xác thực. Các gói bị nhiễm được tải xuống hơn 200 triệu lần mỗi tuần, khiến phạm vi ảnh hưởng trở nên rất lớn.

Tấn công chuỗi cung ứng phần mềm qua npm và PyPI

Chiến dịch này tập trung vào thư viện phát triển được sử dụng phổ biến trong môi trường lập trình và CI/CD pipeline. Mã độc được nhúng vào các gói hợp lệ để chạy âm thầm trên máy nhà phát triển và hạ tầng build.

Điểm đáng chú ý của tấn công chuỗi cung ứng phần mềm là payload không chỉ đánh cắp secret tại một điểm, mà còn tự lan truyền bằng cách dùng chính các credentials thu được để lây sang gói khác.

Cơ chế xâm nhập ban đầu

Nhóm tấn công lợi dụng một workflow trong môi trường GitHub release cho phép mã từ nhánh fork chạy trong ngữ cảnh repository có quyền cao hơn. Từ đó, họ tạo được foothold mà không gây cảnh báo tức thời.

Sau khi xâm nhập, một bản ghi build cache đã bị đầu độc. Khi workflow phát hành sau đó khôi phục cache này, mã độc được kích hoạt trong hoạt động build tưởng như bình thường.

Hành vi của payload độc hại

Mã độc lấy GitHub Actions identity token từ bộ nhớ runner, sau đó đổi token này lấy npm publishing credential. Tiếp theo, nó chèn mã độc vào các package khác, tăng version và phát hành lại lên registry công khai.

Trong biến thể npm, payload còn quét những package mà tài khoản nạn nhân có quyền phát hành, sửa nội dung và đẩy phiên bản nhiễm độc mới. Đây là hành vi mang tính worm-like, tức tự nhân rộng qua chuỗi tin cậy.

Phân tích tấn công chuỗi cung ứng phần mềm trong GitHub Actions

Trong chuỗi tấn công, mã độc có thể yêu cầu OIDC token cho npm registry và đổi nó thành publishing token. Cơ chế này cho phép nó hoạt động dưới cùng danh tính workflow hợp lệ mà nhà phát triển thường dùng.

Vì vậy, package bị nhiễm có thể vẫn xuất hiện như đến từ nguồn tin cậy, trong khi bên trong đã chứa loader hoặc JavaScript obfuscated phục vụ đánh cắp dữ liệu.

Phạm vi thông tin bị nhắm đến

Payload của npm được thiết kế để thu thập nhiều loại secret phổ biến trong môi trường phát triển và cloud.

  • GitHub tokens
  • npm credentials
  • AWS access keys từ biến môi trường và metadata service
  • Kubernetes service account tokens
  • HashiCorp Vault tokens
  • SSH keys
  • Docker credentials
  • Generic API keys

Trong môi trường cloud, mã độc truy vấn EC2 metadata service để lấy trực tiếp thông tin IAM role credentials.

Biến thể PyPI và cơ chế kích hoạt

Hai gói PyPI bị xâm nhập sử dụng cơ chế import-time trigger. Chỉ cần import package trong một script Python là loader có thể chạy.

Loader sau đó tải xuống payload từ máy chủ từ xa. Theo phân tích, payload đã phát triển thành một credential stealer nhắm vào cloud providers, Kubernetes, Vault, password managers và các công cụ dành cho developer.

Thực thi, mở rộng và exfiltration

Một điểm nguy hiểm của tấn công chuỗi cung ứng phần mềm này là cách exfiltration dựa trên chính hạ tầng tin cậy. Mã độc tạo một repository công khai bằng token bị đánh cắp, commit các gói credential đã mã hóa và dùng tên chiến dịch như một nhãn theo dõi.

Các commit chứa token bị đánh cắp còn đi kèm thông điệp đe dọa. Ngoài ra, malware duy trì một background monitor kiểm tra trạng thái token theo chu kỳ 60 giây.

Dead-man switch và nguy cơ wipe

Nếu token bị thu hồi, malware lập tức kích hoạt lệnh xóa dữ liệu trên máy bị ảnh hưởng. Vì vậy, quy trình xử lý phải xóa toàn bộ persistence trước khi xoay vòng credential.

JFrog khuyến nghị cô lập máy bị ảnh hưởng và các runner CI/CD trước khi thực hiện bất kỳ hành động thu hồi token nào.

IoC và dấu hiệu liên quan

  • Chuỗi commit/repository được tạo dưới token bị đánh cắp và gắn nhãn chiến dịch.
  • Thông điệp commit chứa cảnh báo nhằm ngăn revoke token.
  • Dependabot-like branch bất thường không khớp với hành vi automation thông thường.
  • Commit author hiển thị dạng [email protected] trong các repository cần rà soát.
  • Package npm/PyPI bị cập nhật phiên bản bất thường kèm loader hoặc obfuscated JavaScript.

Ghi chú: IP addresses và domains trong tài liệu gốc được defang để tránh truy cập ngoài ý muốn. Khi cần phân tích, chỉ re-fang trong môi trường threat intelligence như SIEM, MISP hoặc VirusTotal.

Biện pháp xử lý và khắc phục

Trước khi xoay vòng bất kỳ token nào, cần đảm bảo mọi cơ chế persistence đã được loại bỏ hoàn toàn. Điều này bao gồm file khởi động, background service và các tác vụ tự động liên quan.

Sau khi làm sạch, cần xoay vòng toàn bộ credential có nguy cơ bị lộ trong tấn công chuỗi cung ứng phần mềm.

  • GitHub tokens
  • npm tokens
  • AWS credentials
  • Kubernetes service accounts
  • Vault tokens
  • SSH keys

Đồng thời, cần rà soát repository để phát hiện các commit, branch và workflow bất thường. Một số dấu hiệu bao gồm package bị republish ngoài chu kỳ bình thường, workflow chạy lại từ cache không mong đợi, hoặc import package PyPI gây kết nối ra ngoài ngay khi tải module.

Tài liệu tham khảo

Tham khảo thêm từ JFrog Research: Shai-Hulud: Here We Go Again.

Tham khảo hệ quy chiếu an ninh về lỗ hổng và điều phối cảnh báo tại NVD.

Tấn công chuỗi cung ứng phần mềm dạng này cho thấy mức độ rủi ro an ninh mạng không nằm ở riêng package bị nhiễm, mà ở khả năng tận dụng chuỗi tin cậy để mở rộng phạm vi xâm nhập, đánh cắp secret và phát tán sang nhiều môi trường phát triển khác nhau.