Giới thiệu
Gần đây, một cuộc tấn công chuỗi cung ứng đã xảy ra đối với các gói npm, được gọi là cuộc tấn công Shai-Hulud. Các thông tin về cuộc tấn công này đã được nhiều phương tiện truyền thông và blog cảnh báo. Bài viết này sẽ cung cấp cho bạn cái nhìn tổng quan, các bước cần thực hiện để bảo vệ bản thân và những hướng dẫn chi tiết nếu bạn đã bị ảnh hưởng.
Cuộc tấn công Shai-Hulud là gì?
Cuộc tấn công này liên quan đến việc phát tán các gói độc hại chứa sâu (worm) kích hoạt khi cài đặt npm. Sâu này sẽ quét môi trường để tìm kiếm các thông tin nhạy cảm như tệp .npmrc, biến môi trường và tệp cấu hình nhắm vào các mã thông báo truy cập cá nhân (PAT) của GitHub và các khóa API của các dịch vụ đám mây như AWS, GCP và Azure. Những thông tin này sẽ bị lén lút gửi tới một máy chủ do kẻ tấn công kiểm soát. Malware này cũng tạo ra một kho lưu trữ công khai trên GitHub có tên "Shai-Hulud" dưới tài khoản của nạn nhân để lưu trữ các thông tin bị đánh cắp. Thêm vào đó, nó dùng mã thông báo npm đã bị xâm phạm để truy cập vào registry npm, lây nhiễm các gói khác mà nhà phát triển duy trì và phát tán các bản cập nhật độc hại, cho phép việc lây lan tự động và nhanh chóng.
Các bước phòng ngừa
Để bảo vệ mình khỏi cuộc tấn công này, bạn cần tuân thủ các quy trình cẩn thận trước khi cài đặt npm. Dưới đây là một số hướng dẫn cơ bản:
- Kiểm tra các phụ thuộc: Đảm bảo rằng bạn đã kiểm tra tất cả các phụ thuộc trong tệp package và package-lock của mình, bất kể trong môi trường phát triển cục bộ hay trong các pipeline CI/CD.
- Bật xác thực đa yếu tố (MFA): Bảo vệ tài khoản GitHub và npm của bạn bằng cách bật MFA.
Nếu bạn đã bị ảnh hưởng, hãy kiểm tra các kho lưu trữ GitHub của mình để tìm kho lưu trữ "Shai-Hulud" và các mã thông báo công khai bị lộ.
Kiểm tra an toàn npm
Một số hướng dẫn chi tiết từ các blog như Socket và StepSecurity đã giúp tôi tổng hợp các điểm quan trọng. Tôi cũng đã tạo ra một tệp json chứa danh sách tất cả các lỗ hổng đã được xác định. Thêm vào đó, tôi phát triển một script có thể sử dụng ngay lập tức trong kho chứa mà bạn có thể chạy cục bộ hoặc trong các pipeline CI/CD để kiểm tra các gói đã cài đặt so với danh sách các gói bị tổn thương. Script này cũng có thể được chạy trước khi cài đặt để xác minh xem các gói bạn sắp cài có an toàn hay không.
Trong tương lai, danh sách có thể sẽ mở rộng, vì vậy việc cài đặt npm cần được thực hiện cẩn thận. Ví dụ, hãy sử dụng npm ci
với cờ --ignore-scripts
để ngăn chặn việc thực thi các script sau cài đặt từ các gói độc hại không rõ nguồn gốc.
Kho lưu trữ npmSafeCheck cung cấp một script để kiểm tra các gói npm độc hại đã biết (ví dụ: liên quan đến cuộc tấn công chuỗi cung ứng Shai-Hulud) trước khi cài đặt hoặc nâng cấp các phụ thuộc. Nó cũng phát hiện nếu có bất kỳ gói bị xâm phạm nào đã được cài đặt trong dự án của bạn. Script này giúp giảm thiểu rủi ro từ các cuộc tấn công chuỗi cung ứng bằng cách xác minh phiên bản gói so với danh sách các gói đã bị xâm phạm tính đến ngày 20 tháng 9 năm 2025.
Hướng dẫn sử dụng
-
Nhân bản kho lưu trữ này hoặc tải xuống script
npmSafeCheck.sh
và tệpnpmMalwareChecklist.json
. -
Đặt script và tệp JSON vào thư mục gốc của dự án của bạn.
-
Chạy script TRƯỚC KHI thực hiện
npm install
hoặcnpm update
:sh npmSafeCheck.sh
Hoặc bạn có thể chạy nó như một script npm bằng cách thêm vào package.json
của bạn:
"scripts": {
"safe-check": "sh npmSafeCheck.sh"
}
- Nếu script phát hiện bất kỳ gói độc hại nào đã biết, nó sẽ đánh dấu và cung cấp hướng dẫn về các bước giảm thiểu.
- Bạn cũng có thể tham khảo một cơ sở dữ liệu các gói đã bị xâm phạm thay vì tệp JSON cục bộ.
- Ví dụ về cách tích hợp script này vào một pipeline CI/CD được cung cấp trong tệp
.github/workflows/ci.yml
.
Hướng dẫn hành động ngay lập tức
Nếu bạn đã cài đặt hoặc nâng cấp các gói và nghi ngờ rằng dự án của bạn có thể bị ảnh hưởng bởi cuộc tấn công Shai-Hulud, hãy thực hiện các hành động ngay lập tức sau:
-
Xóa
node_modules
và các tệp lock có phiên bản độc hạirm -rf node_modules package-lock.json yarn.lock
-
Dọn dẹp cache npm
npm cache clean --force
-
Thực hiện thử nghiệm để kiểm tra các gói sẽ được cài đặt, điều này sẽ không chạy bất kỳ script cài đặt nào nhưng sẽ cho thấy các gói sẽ được cài đặt
npm install --dry-run --ignore-scripts
-
Cài đặt lại chỉ các gói an toàn bằng cách sử dụng npm install với cờ
--ignore-scripts
npm install --ignore-scripts <safe-package>@<safe-version>
-
Tránh các lệnh như
npm audit fix
vànpm upgrade
vì chúng cũng sẽ cài đặt các gói ngầm -
Ghi nhớ các phiên bản đã biết tốt bằng cách sử dụng package-lock.json và sử dụng
npm ci
cho các cài đặt trong tương lainpm ci --ignore-scripts
-
Tìm kiếm các kho hoặc workflows hoặc nhánh có tên Shai-Hulud trong các kho lưu trữ GitHub công khai của bạn và các dấu hiệu xâm phạm, như hash bundle.js, các cuộc gọi mạng nghi ngờ, các cuộc gọi hàm hoặc thực thi quy trình.
-
Dọn dẹp các kho bị nhiễm (các nhánh và workflows 'shai-hulud'). Tham khảo từ: Step Security
# Kiểm tra và xóa workflow backdoor rm -f .github/workflows/shai-hulud-workflow.yml # Tìm các nhánh 'shai-hulud' nghi ngờ trong tất cả các kho lưu trữ git ls-remote --heads origin | grep shai-hulud # Xóa bất kỳ nhánh độc hại nào được tìm thấy git push origin --delete shai-hulud
-
Đánh giá các môi trường (các tác nhân CI/CD, máy tính của lập trình viên) đã cài đặt các phiên bản bị ảnh hưởng để tìm kiếm các xuất bản trái phép hoặc đánh cắp thông tin xác thực.
-
Thay đổi mã thông báo npm và các thông tin bí mật khác nếu các gói này đã có trên các máy có thông tin xác thực xuất bản.
-
Bật xác thực đa yếu tố trên GitHub và npm.
-
Kiểm tra cơ sở hạ tầng đám mây để phát hiện xâm phạm.
-
Giám sát nhật ký mạng để phát hiện khai thác hoạt động.
-
Giám sát nhật ký cho các sự kiện xuất bản npm hoặc sửa đổi gói bất thường.
-
Xác minh nguồn gốc gói tại đây.
Các giải pháp phòng ngừa khác
Một số giải pháp phòng ngừa khác mà tôi tìm thấy bao gồm @aikidosec/safe-chain và provenance-action.
Kết luận
Cuộc tấn công chuỗi cung ứng Shai-Hulud là một lời nhắc nhở quan trọng về việc cần phải đề cao cảnh giác trong việc quản lý và cài đặt các gói npm. Hãy chắc chắn rằng bạn thực hiện các bước phòng ngừa cần thiết và luôn cập nhật các thông tin mới nhất từ cộng đồng lập trình viên để bảo vệ dự án của mình khỏi nguy cơ bị xâm phạm.
Câu hỏi thường gặp (FAQ)
1. Làm thế nào để biết dự án của tôi có bị ảnh hưởng không?
Bạn có thể kiểm tra các kho lưu trữ của mình trên GitHub để tìm kiếm các nhánh hoặc workflows liên quan đến "Shai-Hulud" và thực hiện kiểm tra gói npm theo hướng dẫn đã đề cập.
2. Tôi có thể tìm thấy danh sách các gói bị xâm phạm ở đâu?
Danh sách các gói bị xâm phạm có thể được tìm thấy trên các blog bảo mật như Socket và StepSecurity hoặc bạn có thể sử dụng tệp JSON mà tôi đã tạo ra.
3. Tôi nên làm gì nếu tôi phát hiện ra gói độc hại?
Hãy xóa gói đó ngay lập tức và thực hiện các bước khôi phục như đã đề cập trong hướng dẫn hành động ngay lập tức.