Chuỗi cung ứng phần mềm nguy hiểm từ npm SAP

Chuỗi cung ứng phần mềm nguy hiểm từ npm SAP

Chuỗi tấn công chuỗi cung ứng này nhắm vào hệ sinh thái nhà phát triển SAP thông qua các gói npm bị đầu độc, gây rủi ro bảo mật nghiêm trọng cho máy lập trình viên và pipeline CI. Mã độc giun Mini Shai-Hulud chạy âm thầm trước khi lệnh npm install hoàn tất, từ đó thu thập thông tin xác thực trên máy phát triển, nền tảng cloud và công cụ lập trình AI.

Tin tức bảo mật về các gói npm SAP bị đầu độc

Chiến dịch ảnh hưởng đến bốn gói chính thức do SAP phát hành gồm mbt, @cap-js/sqlite, @cap-js/postgres@cap-js/db-service. Đây là các gói nằm trong cây phụ thuộc của ứng dụng dựa trên CAP, được dùng rộng rãi trong SAP BTP.

Khi nhà phát triển hoặc pipeline CI chạy npm install trên phiên bản bị xâm nhập, một script ẩn tên setup.mjs được kích hoạt ở giai đoạn preinstall, trước khi cài đặt hoàn tất.

Script này tải Bun JavaScript runtime và thực thi payload đã làm rối mã có tên execution.js dung lượng 11,7 MB. Mã độc hoạt động mà không cần chạm vào Node.js, giúp che giấu hành vi trong quá trình cài đặt.

Phân tích Mini Shai-Hulud trong chuỗi cung ứng phần mềm

Nhóm phân tích tại Endor Labs xác định Mini Shai-Hulud là hậu duệ trực tiếp của biến thể Shai-Hulud được ghi nhận trước đó. Mã độc này dùng cùng bộ khởi động Bun v1.3.13, cùng họ thuật toán mã hóa tùy chỉnh ctf-scramble-v2 và cùng khóa PBKDF2 5012caa5847ae….

Các dấu hiệu dùng chung cho thấy cùng một tác nhân đe dọa đang triển khai chiến dịch mới nhắm vào hệ sinh thái phát triển CAP và MTA, nhưng với bề mặt thu thập thông tin xác thực hẹp hơn và từ khóa lan truyền khác.

Do các gói bị ảnh hưởng nằm trong dependency tree của ứng dụng CAP, bất kỳ máy nào đã cài phiên bản bị xâm nhập và lưu trữ GitHub token hoặc cloud credentials đều cần được xem là đã bị lộ toàn bộ bí mật trên host đó.

Hành vi của payload và cơ chế thu thập thông tin xác thực

Payload chạy song song 5 bộ thu thập thông tin xác thực. Bộ đầu tiên nhắm vào npm token bằng cách quét các tệp .npmrc trong thư mục home, thư mục gốc của dự án và biến môi trường CI.

Các token thu thập được sẽ được xác thực qua npm registry API để kiểm tra quyền publish, vì chỉ token có quyền publish mới cho phép giun tự nhân bản.

Bộ thu thập thứ hai và thứ ba quét GitHub và thông tin xác thực cloud. Trên host Linux, payload đọc /proc/{pid}/mem để lấy secret trong bộ nhớ của GitHub Actions.

Nó cũng rà soát tệp thông tin xác thực AWS, gọi GetCallerIdentity để lấy ngữ cảnh IAM, quét Google Cloud Secret Manager, đọc tệp JSON của Kubernetes service account và thu thập thông tin đăng nhập Azure Key Vault.

Bộ thu thập thứ tư nhắm vào AI coding tools. Payload kiểm tra 136 đường dẫn được mã hóa cứng cho cấu hình Claude Code như project/.claude/settings.json và tệp tác vụ của VS Code như project/.vscode/tasks.json, đồng thời quét trạng thái Cursor IDE, lịch sử shell, tệp .env và khóa riêng SSH.

Trong môi trường CI, nó quét hơn 25 nền tảng gồm Jenkins, TravisAzure Pipelines.

Mã hóa dữ liệu và cơ chế exfiltration

Dữ liệu thu thập được mã hóa bằng AES-256-GCM. Khóa mã hóa tiếp tục được bọc bằng RSA-4096 public key của kẻ tấn công trước khi tải lên một repository GitHub dead-drop được tạo từ chính tài khoản bị đánh cắp.

Quá trình này khiến thông tin nhạy cảm bị rò rỉ dữ liệu ngay cả khi chỉ một gói npm trong chuỗi cung ứng bị cài đặt ở trạng thái bị xâm nhập.

IOC và dấu hiệu cần kiểm tra

  • Gói npm bị ảnh hưởng: mbt, @cap-js/sqlite, @cap-js/postgres, @cap-js/db-service
  • Script ẩn: setup.mjs
  • Payload chính: execution.js
  • Kích thước payload: 11,7 MB
  • Runtime được tải: Bun v1.3.13
  • Chuỗi kỹ thuật liên quan: ctf-scramble-v2, PBKDF2 key 5012caa5847ae…
  • Điểm quét đáng chú ý: .npmrc, /proc/{pid}/mem, .claude/settings.json, .vscode/tasks.json, .env, khóa riêng SSH
  • Hạ tầng đích: repository GitHub dead-drop do tài khoản nạn nhân tạo ra

Kiểm tra và xử lý sau khi phát hiện xâm nhập

Nếu đã cài một phiên bản bị ảnh hưởng, cần coi sự kiện này là xâm nhập trái phép và lộ toàn bộ credential trên host đó. Biện pháp tối thiểu là gỡ từng gói bị ảnh hưởng và cài lại phiên bản sạch với cờ --ignore-scripts.

npm uninstall mbt @cap-js/sqlite @cap-js/postgres @cap-js/db-service
npm install --ignore-scripts

Cần tìm trên toàn bộ dự án các tệp execution.js có kích thước lớn hơn 5 MB, tệp .claude/settings.json chứa hook SessionStart, và mọi workflow format-check.yml không do nhóm của bạn tạo ra.

Việc thu hồi secret phải bao gồm npm publish token, GitHub PAT, AWS IAM keys, Google Cloud service account credentials, Azure client secrets, SSH private keys và toàn bộ nội dung tệp .env.

Kiểm soát dài hạn cho CI và chuỗi cung ứng npm

Để giảm rủi ro bảo mật, nên giới hạn npm OIDC trusted publishing cho một workflow cụ thể trên một nhánh cụ thể, thay vì toàn bộ repository.

Cần áp dụng --ignore-scripts trong các lần cài đặt CI và rà soát lifecycle hooks trong quá trình kiểm tra phụ thuộc. Cửa sổ phát hiện của chiến dịch chỉ khoảng 2 giờ, nên các biện pháp gỡ bỏ phản ứng đơn lẻ không đủ để bảo vệ hệ thống.