Sâu Shai-Hulud lây nhiễm các gói npm: tìm hiểu sâu về sự cố chuỗi cung ứng

Cập nhật lần cuối: 09/25/2025
  • Hàng trăm gói npm đã bị xâm phạm bởi một loại sâu tự sao chép có tên là Shai-Hulud, GitHub đã xóa hơn 500 phiên bản bị nhiễm.
  • Phần mềm độc hại đánh cắp bí mật (mã thông báo npm, GitHub PAT, khóa đám mây) và xuất bản lại các gói bị nhiễm bằng quyền xuất bản của nạn nhân.
  • Bằng chứng cho thấy mục tiêu nhắm vào Linux và macOS, lạm dụng TruffleHog và quy trình làm việc GitHub Actions đánh cắp dữ liệu.
  • Các bước ngay lập tức: xoay vòng mã thông báo, kiểm tra các phụ thuộc và kho lưu trữ GitHub, thực thi MFA/2FA và tìm kiếm IoC bao gồm lưu lượng bundle.js và webhook.site.

Cuộc tấn công sâu npm của Shai-Hulud

Những gì bắt đầu như một nỗi lo ngại về chuỗi cung ứng khác trong thế giới JavaScript đã leo thang thành một sự cố lớn ảnh hưởng đến hệ sinh thái npm. Các báo cáo từ nhiều nguồn xác nhận một chủng phần mềm độc hại tự lan truyền, được theo dõi như Shai‑Hulud, làm ảnh hưởng đến thông tin xác thực của nhà phát triển, tiết lộ mã và phát hành lại các gói bị nhiễm để duy trì quá trình lây nhiễm.

Mặc dù số lượng khác nhau tùy theo nguồn, nhưng sự đồng thuận là rõ ràng: chúng ta đang giải quyết hàng trăm bản phát hành bị nhiễm độc, bao gồm một thư viện được sử dụng rộng rãi với hàng triệu lượt tải xuống mỗi tuần. GitHub đã xóa hơn 500 phiên bản bị xâm phạm để ngăn chặn sự lây lan, và các nhóm bảo mật trên toàn thế giới đang kêu gọi các nhà phát triển luân phiên thông tin đăng nhập và rà soát kho lưu trữ và đường truyền của họ để tìm manh mối xâm nhập.

Chuyện gì đã xảy ra và tại sao nó lại quan trọng

Các cuộc điều tra cho thấy hoạt động này có thể bắt đầu bằng mồi nhử thu thập thông tin xác thực giả mạo npm, thúc giục người bảo trì "cập nhật" cài đặt MFA. Với quyền truy cập trong tay, kẻ tấn công đã triển khai một loại sâu chạy sau khi cài đặt, săn lùng bí mật và phát hành lại các bản dựng bị nhiễm dưới danh tính của nạn nhân—biến những người bảo trì đáng tin cậy thành kẻ khuếch đại cuộc tấn công.

Shai‑Hulud kết hợp hai ý tưởng nguy hiểm: tự động lan truyền và đánh cắp bí mậtNó lợi dụng token npm bị đánh cắp để xuất bản các phiên bản mới của gói tin và tận dụng token GitHub cùng các khóa đám mây (AWS, GCP, Azure) để di chuyển ngang hàng và đánh cắp dữ liệu. Sự kết hợp này làm tăng đáng kể phạm vi ảnh hưởng, cho phép một vụ xâm phạm lan rộng đến vô số người dùng hạ nguồn.

Các mục tiêu dường như bị lệch về phía các hệ thống giống Unix. Phân tích lưu ý rằng hầu hết logic độc hại thực thi trên Linux và macOS, dựa trên các kiểm tra môi trường, mặc dù giai đoạn khám phá bí mật (đặc biệt là với TruffleHog) có thể diễn ra rộng rãi hơn. Trọng tâm đó đã thu hẹp phạm vi hoạt động của sâu nhưng vẫn để lộ nhiều máy tính của nhà phát triển.

Các gói từ một số tổ chức đáng chú ý đã bị ảnh hưởng cùng với các mô-đun cộng đồng phổ biến. Trong một ví dụ nổi bật, @ctrl/tinycolor gói—được tải xuống hàng triệu lần mỗi tuần—đã bị lôi vào cuộc chiến, chứng minh mức độ lây nhiễm có thể ăn sâu vào biểu đồ phụ thuộc như thế nào.

minh họa thỏa hiệp gói npm

Cách thức hoạt động của sâu (phân tích kỹ thuật)

Tải trọng cốt lõi được vận chuyển dưới dạng một tệp JavaScript nặng, thường được đặt tên là bó.js (hơn 3 MB trong các mẫu quan sát). Nó được thực thi thông qua một hook sau khi cài đặt được thêm vào package.json, có nghĩa là mã độc sẽ tự động chạy ngay sau khi người dùng cài đặt gói từ npm.

Bên trong bundle.js là các mô-đun cho Tương tác GitHub API, SDK đám mây (AWS/GCP), các trình trợ giúp mạng và các quy trình để chạy TruffleHog nhằm phát hiện bí mật. Tập lệnh sẽ kiểm kê hệ điều hành, định vị mã thông báo npm và kiểm tra mã thông báo GitHub hợp lệ; nếu không tìm thấy, nó sẽ thoát—nếu không, nó sẽ bắt đầu trích xuất và sao chép.

Một điểm kỳ lạ đáng chú ý: một số gói bị nhiễm có chứa một kho lưu trữ có tên gói.tar thay vì quy ước đặt tên thông thường, một dấu hiệu giúp các nhà nghiên cứu đánh dấu các hiện vật bị xâm phạm. Các nhà phân tích cũng quan sát thấy một biến thể được thực thi như một hook tiền cài đặt; một trường hợp ban đầu được trích dẫn là ngx‑bootstrap 18.1.4, có thể đóng vai trò là bàn đạp ban đầu trong cuộc tấn công.

Sau khi chạy, phần mềm độc hại sẽ liệt kê các gói được nhà phát triển tải xuống nhiều nhất thông qua API tìm kiếm npm, giải nén từng tệp tarball, xóa bundle.js, chèn lệnh postinstall, tăng phiên bản và xuất bản lại lên npm với mã thông báo của nạn nhân. Điều này biến danh mục đầu tư của nhà phát triển thành phương tiện cho các đợt lây nhiễm tiếp theo.

Rò rỉ bí mật và quy trình làm việc GitHub

Để thu thập thông tin xác thực, Shai‑Hulud quét các mã thông báo npm, Mã thông báo truy cập cá nhân GitHub và khóa API đám mây (AWS, GCP, Azure). Sau đó, nó tạo một kho lưu trữ GitHub công khai có tên 'Shai‑Hulud' dưới tài khoản của nạn nhân, xác nhận một tệp dữ liệu (ví dụ: data.json) chứa các bí mật bị đánh cắp - thực chất là tiết lộ chúng ra thế giới.

Song song đó, các nhà nghiên cứu đã quan sát một góc độ khéo léo của GitHub Actions: con sâu tạo ra một nhánh có tên là 'shai‑hulud' trên các kho lưu trữ có thể truy cập và đẩy tệp quy trình làm việc (shai‑hulud‑workflow.yml). Được kích hoạt khi đẩy, quy trình làm việc sẽ thu thập các bí mật và chuyển chúng đến cơ sở hạ tầng của kẻ tấn công, đôi khi sau mã hóa Base64 kép để che giấu nội dung trong quá trình truyền tải.

Ngoài ra còn có bằng chứng về một tập lệnh di chuyển bản sao kho lưu trữ riêng tư/nội bộ từ các tổ chức mà nạn nhân có thể truy cập, lưu trữ lại chúng trong tài khoản của người dùng dưới dạng bản sao công khai. Mục tiêu dường như là đánh cắp mã nguồn tự động từ các dự án tư nhân, gia tăng áp lực lên các tổ chức bị ảnh hưởng.

Nhiều báo cáo lưu ý các hiện tượng lạ của sự hỗ trợ AI trong các tập lệnh bash (bình luận và thậm chí cả biểu tượng cảm xúc), cho thấy kẻ tấn công có thể đã sử dụng LLM để đẩy nhanh sự phát triển của các thành phần tự động hóa của phần mềm độc hại.

Phạm vi và các gói đáng chú ý

Qua các cuộc gỡ bỏ phối hợp, GitHub đã xóa Hơn 500 phiên bản bị xâm phạm để ngăn chặn sự lây lan của sâu. Mặc dù tổng số chính xác vẫn đang tiếp tục thay đổi, danh sách này trải dài trên nhiều hệ sinh thái và tổ chức, với tác động lan tỏa đến các nhà phát triển đã cập nhật trong thời gian hoạt động.

Trong số các gói và không gian tên được trích dẫn thường xuyên: @ctrl/tinycolor (hàng triệu lượt tải xuống hàng tuần), nhiều @crowdstrike/* các thành phần (chẳng hạn như commitlint và thư viện UI) và một loạt các mô-đun cộng đồng bao gồm ngx‑bootstrap, ng2‑tải lên tệp, ngx‑toastrvà nhiều hơn nữa. CrowdStrike cho biết nền tảng cốt lõi của họ vẫn không bị ảnh hưởng và các phím đã được xoay nhanh chóng sau khi phát hiện các mục độc hại trong sổ đăng ký công khai.

  • Các ví dụ liên quan đến wave: @ctrl/tinycolor; @crowdstrike/commitlint; @crowdstrike/foundry‑js; @crowdstrike/glide‑core; ngx‑bootstrap; ng2‑file‑upload; ngx‑toastr; @nativescript‑community/*; @teselagen/*; @things‑factory/*; và các ví dụ khác.
  • Các nhà nghiên cứu cũng thấy nhiều phiên bản độc hại trên mỗi gói trong một số trường hợp—có thể là do sâu lây lan qua nhiều tài khoản của người bảo trì trong cùng một dự án.

Phản hồi của nền tảng và những thay đổi về bảo mật

Các hành động ngay lập tức của GitHub bao gồm xóa các gói tin xấu đã biết từ npm và chặn các lượt tải lên khớp với Chỉ số Vi phạm (IoC). Công ty cũng đang triển khai các biện pháp kiểm soát xuất bản chặt chẽ hơn: xác thực hai yếu tố (2FA) bắt buộc đối với việc xuất bản cục bộ, các mã thông báo chi tiết có thời hạn sử dụng ngắn hơn (ví dụ: bảy ngày) và việc áp dụng rộng rãi hơn Xuất bản đáng tin cậy để giảm sự phụ thuộc vào những bí mật lâu dài.

Những thay đổi sắp tới sẽ loại bỏ các mã thông báo cổ điển cũ và 2FA dựa trên TOTP để xuất bản, mặc định không cho phép xuất bản mã thông báovà mở rộng các nhà cung cấp cho Trusted Publishing. GitHub đã thông báo về việc triển khai dần dần với tài liệu hướng dẫn di chuyển, nhận thấy rằng một số quy trình công việc sẽ cần điều chỉnh.

Các nhóm tình báo về mối đe dọa và ứng phó sự cố trên toàn ngành (bao gồm Unit 42, Kaspersky, Trend Micro và các nhóm khác) đã đã ban hành hướng dẫn và phát hiện trong khi chia sẻ IoC với các đối tác và liên minh để đẩy nhanh quá trình cập nhật bảo vệ.

Làm thế nào để giảm thiểu rủi ro ngay bây giờ

Hãy hành động nhanh chóng với giả định rằng bất kỳ máy phát triển nào đã cài đặt các gói npm gần đây đều có thể đã làm rò rỉ bí mật. Ưu tiên là chứa thông tin đăng nhập lạm dụng, dừng tính dai dẳng và loại bỏ các phụ thuộc bị nhiễm khỏi chuỗi xây dựng.

  • Xoay vòng mã thông báo npm, GitHub PAT/khóa SSH và thông tin đăng nhập đám mây (AWS/GCP/Azure) ngay lập tức; coi như mọi bí mật hiện có trên máy chủ của nhà phát triển đều bị xâm phạm.
  • Kiểm tra các phụ thuộc thông qua package‑lock.json/yarn.lock; xóa hoặc ghim khỏi các phiên bản bị xâm phạm đã biết; cài đặt lại từ các nguồn sạch.
  • Áp dụng MFA/2FA trên GitHub và npm; chuyển sang Trusted Publishing khi có thể để loại bỏ các mã thông báo tồn tại lâu dài khỏi vòng lặp.
  • Kiểm tra GitHub để tìm các kho lưu trữ công khai bất ngờ có tên 'Shai‑Hulud', các nhánh hoặc quy trình làm việc không quen thuộc và các lần chạy Hành động bất thường.
  • Bảo mật CI/CD với RBAC có đặc quyền thấp nhất, xác minh/ký hiện vật và quét SCA liên tục; xử lý tiêu thụ nguồn mở như một rủi ro được quản lý.

Mẹo săn tìm mối đe dọa (kiểm tra tín hiệu cao)

Tìm kiếm các kết nối đi đến webhook.site miền, đặc biệt là URI được quan sát thấy trong nhiều báo cáo. Trên các điểm cuối, hãy tìm kiếm sự hiện diện của bó.js trong thư mục tạm thời hoặc thư mục gói và cho tệp GitHub Actions có tên shai‑hulud‑workflow.yml.

  • Dữ liệu đo từ xa mạng: Nhật ký DNS/URL có chứa webhook.site; đánh dấu đường dẫn cụ thể bb8ca5f6‑4175‑45d2‑b042‑fc9ebb8170b7 nếu thấy.
  • Dữ liệu đo từ xa của tệp: tạo hoặc thực thi bundle.js; sự hiện diện của shai‑hulud‑workflow.yml trên máy chủ dành cho nhà phát triển Linux/macOS.
  • Quá trình đo từ xa: Lời cầu nguyện của TruffleHog nơi không mong đợi (lưu ý việc sử dụng hợp pháp có thể tồn tại ở một số tổ chức).

Các chỉ số thỏa hiệp (IoC)

Các manh mối về hồ sơ và chuỗi được tìm thấy trong các cuộc điều tra bao gồm bó.jsshai‑hulud‑workflow.yml, với chuỗi ký tự 'shai‑hulud' xuất hiện trong các nhánh, kho lưu trữ và quy trình làm việc.

  • Tệp: bundle.js; shai‑hulud‑workflow.yml
  • Chuỗi: shai‑hulud; package.tar
  • Hashes (selected): 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09; b74caeaa75e077c99f7d44f46daaf9796a3be43ecf24f2a1fd381844669da777; dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c; 4b2399646573bb737c4969563303d8ee2e9ddbd1b271f1ca9e35ea78062538db; C96FBBE010DD4C5BFB801780856EC228; 78E701F42B76CCDE3F2678E548886860
  • Mạng: https://webhook.site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7 (đã quan sát các biến thể và đường dẫn phụ)

Dòng thời gian và phân tích đang diễn ra

Các báo cáo cho biết khám phá ban đầu diễn ra vào giữa tháng 9 năm 2025, với các hành động ngăn chặn đỉnh điểm vào khoảng ngày 16–19 tháng 9GitHub và nhiều nhà cung cấp khác đã cập nhật các biện pháp bảo vệ, phát hiện và hướng dẫn. Hãy chờ đợi những phát hiện hồi tố tiếp theo khi các tổ chức hoàn tất việc đánh giá sự cố và mở rộng danh sách các phiên bản bị ảnh hưởng.

Một số bằng chứng cho thấy vụ việc được xây dựng dựa trên những thông tin rò rỉ bí mật trước đó, nhấn mạnh việc các token tồn tại lâu dài và thông tin xác thực được lưu trữ trong bộ nhớ đệm có thể gây ra làn sóng xâm phạm mới nhiều tháng sau đó. Điều này sẽ củng cố nỗ lực rút ngắn thời gian tồn tại của token và áp dụng các mô hình xuất bản giảm thiểu sự phát triển bí mật.

Không phải mọi báo cáo đều đồng ý về tổng số chính xác hoặc các gói đầu tiên trong chuỗi, nhưng bức tranh chung đều thống nhất: sâu npm tự sao chép điều đó đã vũ khí hóa niềm tin của nhà phát triển và quyền xuất bản tự động để mở rộng quy mô nhanh chóng—nhanh hơn nhiều nhóm có thể phát hiện chỉ bằng cách xem xét thủ công.

Sự kiện này minh họa cách các đường ống xây dựng hiện đại có thể nhanh chóng biến thành đường cao tốc cho phần mềm độc hại. Bởi thắt chặt xác thực, loại bỏ các mã thông báo tồn tại lâu dài khỏi đường dẫn, củng cố CI/CD và tích cực săn lùng IoC, các tổ chức có thể hạn chế rủi ro ngay hôm nay và khiến làn sóng tiếp theo khó thực hiện hơn nhiều.

bài viết liên quan: