Gần đây, cộng đồng NPM lại bùng phát một sự kiện tấn công lớn vào các gói NPM, sự kiện này có liên quan mật thiết đến sự kiện tấn công Shai-Hulud vào tháng 9 năm 2025. Mã độc trong các gói NPM lần này đánh cắp khóa phát triển, khóa API cũng như các thông tin nhạy cảm khác như biến môi trường, lợi dụng các khóa này để tạo kho công khai và tải lên những thông tin nhạy cảm đã bị đánh cắp.
SlowMist( Công cụ giám sát an ninh động và thông tin tình báo về mối đe dọa Web3 do tự phát triển MistEye phản hồi ngay lập tức, nhanh chóng cung cấp thông tin tình báo liên quan, mang đến sự bảo đảm an ninh quan trọng cho khách hàng.
Lấy gói @asyncapi/php-template@0.1.1 làm ví dụ, khi so sánh với phiên bản cũ @asyncapi/php-template@0.1.0, có thể thấy rằng phiên bản 0.1.1 đã thêm hai tệp js mới, đó là setup_bun.js và tệp bun_environment.js đã được làm mờ.
Trong setup_bun.js, trước tiên sẽ kiểm tra xem hệ thống đã cài đặt Bun chưa, nếu chưa cài đặt, nó sẽ tự động tải xuống và cài đặt Bun từ trang chính thức, đồng thời thiết lập đúng biến môi trường để tìm thấy tệp thực thi Bun.
Cuối cùng, sử dụng bun để thực thi tệp bun_environment.js, tệp bun_environment.js này là một tệp độc hại đã được làm mờ đi rất nhiều.
Sau khi phản giải một phần mã của script độc hại, có thể thấy aL0)( là hàm chính của toàn bộ script độc hại. Có thể thấy rằng script độc hại này thực hiện việc đánh cắp thông tin nhạy cảm, sẽ kiểm tra môi trường chạy xem có tồn tại các chứng chỉ như NPM hoặc GitHub hay không. Nếu phát hiện các chứng chỉ này, nó sẽ sử dụng chứng chỉ NPM để phát tán trong chuỗi cung ứng, và tất cả thông tin hệ thống và dữ liệu nhạy cảm đã thu thập sẽ được đóng gói lại và tải lên kho GitHub do kẻ tấn công kiểm soát, để sử dụng cho các mục đích sau này.
Lấy cắp chứng từ
AWS: Kịch bản độc hại này thực hiện các phương thức runSecrets)( và listAndRetrieveAllSecrets)(, phương thức runSecrets)( sẽ duyệt qua tất cả các thông tin đăng nhập đám mây có thể tìm thấy cũng như tất cả các khu vực có thể, tối đa hóa phạm vi quét; trong khi listAndRetrieveAllSecrets)( thực hiện “khai thác sâu” trong các thông tin đăng nhập và khu vực đã chỉ định, duyệt ra tất cả các Secret và lấy được nội dung rõ ràng mới nhất của chúng. Khi kết hợp cả hai, kẻ tấn công có thể xuất tất cả SecretString và SecretBinary có thể truy cập trong tài khoản AWS của nạn nhân một lần.
Phương pháp enumerateValidCredentials)( chủ yếu được sử dụng để thu thập toàn diện tất cả các khóa dịch vụ đám mây có thể sử dụng. Nó sẽ thử từng nguồn khác nhau như biến môi trường, tệp cấu hình, đăng nhập CLI, v.v. và mọi thông tin xác thực có thể xác minh thành công sẽ được ghi lại, để sử dụng trong việc đánh cắp bí mật trên đám mây sau này.
GCP: Phương pháp listAndRetrieveAllSecrets)( khác được triển khai trong kịch bản độc hại này chủ yếu nhắm đến mô-đun GCP, nó sẽ trước tiên liệt kê tất cả các Secret trong dự án GCP dựa trên Project ID đã chỉ định, sau đó trực tiếp xác định phiên bản mới nhất của mỗi Secret và gọi accessSecretVersion để đọc nội dung rõ ràng của nó. Cuối cùng, tất cả các bí mật đã thu thập được (như API Key, mật khẩu cơ sở dữ liệu, v.v.) sẽ được thu thập từng cái một.
Azure: Phương pháp listAndRetrieveAllSecrets)( được triển khai trong kịch bản độc hại này chủ yếu nhắm vào mô-đun Azure. Nó sẽ quét toàn bộ đăng ký thông qua Azure Resource Manager để tìm tất cả Key Vault; sau đó sử dụng thông tin xác thực đã nhận để kết nối từng Vault; cuối cùng liệt kê tất cả Secrets bên trong và gọi getSecret để lấy giá trị văn bản rõ ràng của từng bí mật.
Trong việc thực hiện đánh cắp thông tin nhạy cảm, các công cụ bảo mật hợp pháp cũng được sử dụng để tấn công nạn nhân. Trong phương pháp extractAndInstall)(, các tệp nhị phân của TruffleHog được giải nén và trích xuất, TruffleHog vốn được sử dụng để phát hiện và xác minh thông tin bí mật bị rò rỉ trong kho mã, chẳng hạn như khóa API và thông tin xác thực, đã bị kẻ tấn công sử dụng để quét toàn bộ hệ thống tệp của nạn nhân.
Kịch bản độc hại này thực hiện một hàm updatePackage###( để thực hiện việc lây lan chuỗi cung ứng NPM. Đầu tiên, nó sử dụng Token NPM bị đánh cắp để tải xuống mã nguồn của các gói NPM hợp pháp mà nạn nhân có quyền phát hành. Sau đó, nó sửa đổi tệp package.json, chèn lệnh kịch bản độc hại vào trường scripts. Đồng thời, nó cũng đưa kịch bản độc hại vào gói, tự động tăng phiên bản của gói lên 1 để kích hoạt cập nhật tự động của người dùng, đẩy gói NPM có kịch bản độc hại lên kho chính thức của NPM.
Sau khi đánh cắp thông tin, kẻ tấn công sẽ sử dụng GitHub Token đã bị đánh cắp để tạo một kho chứa có tên ngẫu nhiên dưới tài khoản của mình, và lấy mã thông báo đăng ký, làm cho máy tính của nạn nhân giống như một GitHub Actions Runner tự lưu trữ của kho chứa đó. Sau đó, kẻ tấn công cài đặt các quy trình làm việc độc hại trong kho chứa, khiến bất kỳ nhiệm vụ Actions nào được kích hoạt đều sẽ được thực thi trên máy của nạn nhân, từ đó đạt được khả năng thực thi mã từ xa.
Và tải thông tin bị đánh cắp này lên kho được tạo ra sau khi mã hóa base64 kép, mô tả của những kho được tạo ra này đều là “Sha1-Hulud: The Second Coming.”.
Sự tấn công vào kho NPM lần này kết hợp giữa sâu và chương trình tự quản lý với tính bền vững dài hạn, đồng thời sử dụng TruffleHog để tấn công. Nhóm an ninh Slow Fog khuyến nghị các nhà phát triển nên áp dụng chiến lược khóa phiên bản gói phụ thuộc khi xây dựng và phát hành các phiên bản mới. Nếu gói phụ thuộc có cập nhật an toàn hoặc chức năng cần thiết, nên thực hiện cập nhật thông qua quy trình kiểm tra an toàn nghiêm ngặt nội bộ và đồng bộ hóa cập nhật phiên bản khóa, tránh việc cập nhật mù quáng gây ra rủi ro mới.
Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
Phân tích tiêm nhiễm NPM — Tái hiện cuộc tấn công Shai-Hulud
Tác giả: Joker & Ccj
Bối cảnh
Gần đây, cộng đồng NPM lại bùng phát một sự kiện tấn công lớn vào các gói NPM, sự kiện này có liên quan mật thiết đến sự kiện tấn công Shai-Hulud vào tháng 9 năm 2025. Mã độc trong các gói NPM lần này đánh cắp khóa phát triển, khóa API cũng như các thông tin nhạy cảm khác như biến môi trường, lợi dụng các khóa này để tạo kho công khai và tải lên những thông tin nhạy cảm đã bị đánh cắp.
SlowMist( Công cụ giám sát an ninh động và thông tin tình báo về mối đe dọa Web3 do tự phát triển MistEye phản hồi ngay lập tức, nhanh chóng cung cấp thông tin tình báo liên quan, mang đến sự bảo đảm an ninh quan trọng cho khách hàng.
![])https://img-cdn.gateio.im/social/moments-159684ebd67ca55d47335ddbd42018c3(
![])https://img-cdn.gateio.im/social/moments-bd2aba046f0a86aca7e1abd2b72e9eed(
Trong khi đó, hệ thống sẽ lưu trữ ngay lập tức mẫu độc hại và tính toán các giá trị đặc trưng như SHA-256.
![])https://img-cdn.gateio.im/webp-social/moments-0c04f20f1376390bdc04bad915d660b6.webp(
Quá trình phân tích
Lấy gói @asyncapi/php-template@0.1.1 làm ví dụ, khi so sánh với phiên bản cũ @asyncapi/php-template@0.1.0, có thể thấy rằng phiên bản 0.1.1 đã thêm hai tệp js mới, đó là setup_bun.js và tệp bun_environment.js đã được làm mờ.
![])https://img-cdn.gateio.im/webp-social/moments-45994a147ca5cec569400f4833f14468.webp(
Đã thêm script preinstall vào package.json, để tự động thực thi setup_bun.js trước khi cài đặt các phụ thuộc.
![])https://img-cdn.gateio.im/webp-social/moments-45e344c5a0d73a61db9f267eae229bc6.webp(
Trong setup_bun.js, trước tiên sẽ kiểm tra xem hệ thống đã cài đặt Bun chưa, nếu chưa cài đặt, nó sẽ tự động tải xuống và cài đặt Bun từ trang chính thức, đồng thời thiết lập đúng biến môi trường để tìm thấy tệp thực thi Bun.
Cuối cùng, sử dụng bun để thực thi tệp bun_environment.js, tệp bun_environment.js này là một tệp độc hại đã được làm mờ đi rất nhiều.
![])https://img-cdn.gateio.im/webp-social/moments-44505da1b8a0d007a2a0c1cf3b0472ca.webp(
Sau khi phản giải một phần mã của script độc hại, có thể thấy aL0)( là hàm chính của toàn bộ script độc hại. Có thể thấy rằng script độc hại này thực hiện việc đánh cắp thông tin nhạy cảm, sẽ kiểm tra môi trường chạy xem có tồn tại các chứng chỉ như NPM hoặc GitHub hay không. Nếu phát hiện các chứng chỉ này, nó sẽ sử dụng chứng chỉ NPM để phát tán trong chuỗi cung ứng, và tất cả thông tin hệ thống và dữ liệu nhạy cảm đã thu thập sẽ được đóng gói lại và tải lên kho GitHub do kẻ tấn công kiểm soát, để sử dụng cho các mục đích sau này.
Lấy cắp chứng từ
AWS: Kịch bản độc hại này thực hiện các phương thức runSecrets)( và listAndRetrieveAllSecrets)(, phương thức runSecrets)( sẽ duyệt qua tất cả các thông tin đăng nhập đám mây có thể tìm thấy cũng như tất cả các khu vực có thể, tối đa hóa phạm vi quét; trong khi listAndRetrieveAllSecrets)( thực hiện “khai thác sâu” trong các thông tin đăng nhập và khu vực đã chỉ định, duyệt ra tất cả các Secret và lấy được nội dung rõ ràng mới nhất của chúng. Khi kết hợp cả hai, kẻ tấn công có thể xuất tất cả SecretString và SecretBinary có thể truy cập trong tài khoản AWS của nạn nhân một lần.
![])https://img-cdn.gateio.im/webp-social/moments-3c33d90aa4bd49b2d8304f07d9cf0c78.webp(
Phương pháp enumerateValidCredentials)( chủ yếu được sử dụng để thu thập toàn diện tất cả các khóa dịch vụ đám mây có thể sử dụng. Nó sẽ thử từng nguồn khác nhau như biến môi trường, tệp cấu hình, đăng nhập CLI, v.v. và mọi thông tin xác thực có thể xác minh thành công sẽ được ghi lại, để sử dụng trong việc đánh cắp bí mật trên đám mây sau này.
![])https://img-cdn.gateio.im/webp-social/moments-18502e3837d4a198101e4f71f742d424.webp(
GCP: Phương pháp listAndRetrieveAllSecrets)( khác được triển khai trong kịch bản độc hại này chủ yếu nhắm đến mô-đun GCP, nó sẽ trước tiên liệt kê tất cả các Secret trong dự án GCP dựa trên Project ID đã chỉ định, sau đó trực tiếp xác định phiên bản mới nhất của mỗi Secret và gọi accessSecretVersion để đọc nội dung rõ ràng của nó. Cuối cùng, tất cả các bí mật đã thu thập được (như API Key, mật khẩu cơ sở dữ liệu, v.v.) sẽ được thu thập từng cái một.
![])https://img-cdn.gateio.im/webp-social/moments-bad2067511f01dd442e955c89db61dc9.webp(
Azure: Phương pháp listAndRetrieveAllSecrets)( được triển khai trong kịch bản độc hại này chủ yếu nhắm vào mô-đun Azure. Nó sẽ quét toàn bộ đăng ký thông qua Azure Resource Manager để tìm tất cả Key Vault; sau đó sử dụng thông tin xác thực đã nhận để kết nối từng Vault; cuối cùng liệt kê tất cả Secrets bên trong và gọi getSecret để lấy giá trị văn bản rõ ràng của từng bí mật.
![])https://img-cdn.gateio.im/social/moments-9176712c5d0ed04eeb1ee93411f8af42(
Trong việc thực hiện đánh cắp thông tin nhạy cảm, các công cụ bảo mật hợp pháp cũng được sử dụng để tấn công nạn nhân. Trong phương pháp extractAndInstall)(, các tệp nhị phân của TruffleHog được giải nén và trích xuất, TruffleHog vốn được sử dụng để phát hiện và xác minh thông tin bí mật bị rò rỉ trong kho mã, chẳng hạn như khóa API và thông tin xác thực, đã bị kẻ tấn công sử dụng để quét toàn bộ hệ thống tệp của nạn nhân.
![])https://img-cdn.gateio.im/webp-social/moments-45e2049fa39e4d26acd79661c664ca21.webp(
) NPM chuỗi cung ứng truyền thông
Kịch bản độc hại này thực hiện một hàm updatePackage###( để thực hiện việc lây lan chuỗi cung ứng NPM. Đầu tiên, nó sử dụng Token NPM bị đánh cắp để tải xuống mã nguồn của các gói NPM hợp pháp mà nạn nhân có quyền phát hành. Sau đó, nó sửa đổi tệp package.json, chèn lệnh kịch bản độc hại vào trường scripts. Đồng thời, nó cũng đưa kịch bản độc hại vào gói, tự động tăng phiên bản của gói lên 1 để kích hoạt cập nhật tự động của người dùng, đẩy gói NPM có kịch bản độc hại lên kho chính thức của NPM.
![])https://img-cdn.gateio.im/social/moments-f2c1d619c8b8a125a018a4990e47e144(
) Cổng sau và C2
Sau khi đánh cắp thông tin, kẻ tấn công sẽ sử dụng GitHub Token đã bị đánh cắp để tạo một kho chứa có tên ngẫu nhiên dưới tài khoản của mình, và lấy mã thông báo đăng ký, làm cho máy tính của nạn nhân giống như một GitHub Actions Runner tự lưu trữ của kho chứa đó. Sau đó, kẻ tấn công cài đặt các quy trình làm việc độc hại trong kho chứa, khiến bất kỳ nhiệm vụ Actions nào được kích hoạt đều sẽ được thực thi trên máy của nạn nhân, từ đó đạt được khả năng thực thi mã từ xa.
![]###https://img-cdn.gateio.im/webp-social/moments-547cfd5eb9ee4614a975d1f574583495.webp(
Và tải thông tin bị đánh cắp này lên kho được tạo ra sau khi mã hóa base64 kép, mô tả của những kho được tạo ra này đều là “Sha1-Hulud: The Second Coming.”.
![])https://img-cdn.gateio.im/webp-social/moments-6bad80b5f904d7c25fa993600ff2a710.webp(
Sau khi giải mã, có thể thấy dữ liệu nhạy cảm bị rò rỉ của người dùng.
![])https://img-cdn.gateio.im/social/moments-73bf3f27df82dfd50c02ff7c42e746af(
![])https://img-cdn.gateio.im/webp-social/moments-aefb641fee19ee0ad471234e3d5aa081.webp(
![])https://img-cdn.gateio.im/social/moments-ea2062526e3489a6cfd6fcbebd94605c(
Tóm tắt
Sự tấn công vào kho NPM lần này kết hợp giữa sâu và chương trình tự quản lý với tính bền vững dài hạn, đồng thời sử dụng TruffleHog để tấn công. Nhóm an ninh Slow Fog khuyến nghị các nhà phát triển nên áp dụng chiến lược khóa phiên bản gói phụ thuộc khi xây dựng và phát hành các phiên bản mới. Nếu gói phụ thuộc có cập nhật an toàn hoặc chức năng cần thiết, nên thực hiện cập nhật thông qua quy trình kiểm tra an toàn nghiêm ngặt nội bộ và đồng bộ hóa cập nhật phiên bản khóa, tránh việc cập nhật mù quáng gây ra rủi ro mới.