TeamPCP, nhóm tấn công đứng sau chuỗi tấn công chuỗi cung ứng gần đây, đã bị phát hiện có liên quan đến việc xâm nhập các gói npm và PyPI từ TanStack, UiPath, Mistral AI, OpenSearch và Guardrails AI như một phần của chiến dịch Mini Shai-Hulud mới.
Các gói npm bị ảnh hưởng đã được sửa đổi để bao gồm một tệp JavaScript bị làm rối ("router_init.js") được thiết kế để thu thập thông tin môi trường thực thi và khởi chạy một trình đánh cắp thông tin xác thực (credential stealer) toàn diện. Trình đánh cắp này có khả năng nhắm mục tiêu vào các nhà cung cấp đám mây, ví tiền điện tử, công cụ AI, ứng dụng nhắn tin và hệ thống CI, bao gồm cả GitHub Actions, theo các báo cáo từ Aikido Security, Endor Labs, SafeDep, Socket, StepSecurity và Snyk. Dữ liệu đánh cắp được chuyển về tên miền "filev2.getsession[.]org".
Việc sử dụng cơ sở hạ tầng Session Protocol là một nỗ lực có tính toán của kẻ tấn công nhằm trốn tránh sự phát hiện, vì tên miền này ít có khả năng bị chặn trong môi trường doanh nghiệp do nó thuộc về một dịch vụ nhắn tin phi tập trung, tập trung vào quyền riêng tư. Như một phương án dự phòng, dữ liệu mã hóa sẽ được đẩy lên các kho lưu trữ do kẻ tấn công kiểm soát dưới tên tác giả "[email protected]" thông qua GitHub GraphQL API bằng cách sử dụng các GitHub tokens bị đánh cắp.
Mã độc này cũng có khả năng thiết lập các cơ chế duy trì (persistence hooks) trong Claude Code và Microsoft Visual Studio Code (VS Code) để tồn tại sau khi khởi động lại và thực thi lại trình đánh cắp mỗi khi IDE được khởi chạy.
Hơn nữa, nó còn cài đặt dịch vụ gh-token-monitor để giám sát và đánh cắp lại các GitHub tokens, đồng thời chèn hai quy trình GitHub Actions độc hại để tuần tự hóa các bí mật của kho lưu trữ (repository secrets) thành đối tượng JSON và tải dữ liệu lên máy chủ bên ngoài ("api.masscan[.]cloud").
Sự thay đổi trong chiến thuật tấn công
Khác với làn sóng SAP trước đó, nơi các gói bị xâm nhập đã thêm một preinstall hook để kích hoạt chuỗi lây nhiễm, cụm TanStack mới nhất áp dụng một chiến lược khác bằng cách bao gồm một tệp JavaScript bên trong tệp nén của gói (tarball) và thêm một phụ thuộc tùy chọn (optional dependency) trỏ đến một gói được lưu trữ trên GitHub. Phụ thuộc GitHub này chứa một prepare lifecycle hook để thực thi mã độc JavaScript thông qua môi trường Bun.
Ngược lại, các bản cập nhật cho các gói Mistral AI tuân theo cách tiếp cận trước đó, thay thế nội dung của tệp "package.json" bằng một preinstall hook để gọi lệnh "node setup.mjs", lệnh này sẽ tải xuống Bun và chạy cùng một loại mã độc JavaScript.
TanStack sau đó đã truy nguyên vụ xâm nhập là do một chuỗi tấn công GitHub Actions liên quan đến trình kích hoạt "pull_request_target", kỹ thuật GitHub Actions cache poisoning, và trích xuất bộ nhớ runtime của token OIDC từ tiến trình runner của GitHub Actions. "Không có npm tokens nào bị đánh cắp và chính quy trình npm publish cũng không bị xâm nhập," TanStack cho biết.
Cụ thể, những kẻ tấn công được đánh giá là đã dàn dựng mã độc trong một bản fork GitHub thông qua một orphaned commit, chèn nó vào các tệp npm tarball đã xuất bản, sau đó chiếm quyền điều khiển quy trình "TanStack/router" hợp lệ của dự án để xuất bản các phiên bản bị xâm nhập với bằng chứng SLSA hợp lệ.
Lạm dụng Trusted Publishing và khả năng tự lây lan
Cuộc tấn công đáng chú ý ở chỗ nó lạm dụng tính năng xuất bản tin cậy (trusted publishing), cho phép mã do kẻ tấn công kiểm soát chạy trong một quy trình làm việc (workflow) tận dụng quyền OIDC của nó để "tạo ra" một token xuất bản ngắn hạn trong quá trình xây dựng (build) và sử dụng nó để xuất bản các gói mà không cần phải đánh cắp npm token.
Điều làm cho sâu máy tính này nổi bật là khả năng tự lây lan sang các gói khác bằng cách tìm kiếm một npm token có thể xuất bản với cài đặt bypass_2fa là true, liệt kê mọi gói được xuất bản bởi cùng một người bảo trì và đổi token OIDC của GitHub lấy token xuất bản cho từng gói để bỏ qua hoàn toàn các phương thức xác thực truyền thống.
"Orphaned commit này cũng đã kích hoạt một quy trình GitHub Actions chạy trên bề mặt quy trình TanStack/router hợp lệ," nhà nghiên cứu Peyton Kennedy từ Endor Labs cho biết. "Bởi vì cấu hình OIDC trusted publisher của kho lưu trữ đã cấp quyền tin cậy ở cấp độ kho lưu trữ thay vì giới hạn trong một nhánh được bảo vệ và tệp workflow cụ thể, quy trình chạy được kích hoạt bởi commit đó đã có thể yêu cầu một npm publish token hợp lệ trong thời gian ngắn."
Vụ xâm nhập chuỗi cung ứng TanStack đã được gán mã định danh CVE là CVE-2026-45321. Nó có điểm CVSS là 9.6 trên 10.0, mức độ nghiêm trọng cực kỳ nguy cấp. Sự cố đã ảnh hưởng đến 42 gói và 84 phiên bản trong hệ sinh thái TanStack.
"Cuộc tấn công đã xuất bản các phiên bản độc hại thông qua chính đường ống phát hành GitHub Actions của dự án bằng cách sử dụng các token OIDC bị chiếm quyền," nhà nghiên cứu Ashish Kurmi từ StepSecurity cho biết. "Trong một sự leo thang cực kỳ hiếm hoi, các gói bị xâm nhập mang các chứng thực bằng chứng SLSA Build Level 3 hợp lệ, biến đây trở thành sâu máy tính npm đầu tiên được ghi nhận tạo ra các gói độc hại có bằng chứng xác thực hợp lệ. Sâu này sau đó đã lan rộng ra ngoài TanStack sang các gói từ UiPath, DraftLab và các nhà bảo trì khác."
Các gói thư viện bị ảnh hưởng trên npm và PyPI
Ngoài TanStack, chiến dịch Mini Shai-Hulud cũng đã lan sang một số gói khác, bao gồm cả trên PyPI:
- [email protected] (PyPI)
- [email protected] (PyPI)
- @opensearch-project/[email protected], 3.6.2, 3.7.0, và 3.8.0
- @squawk/[email protected]
- @squawk/[email protected]
- @squawk/[email protected]
- @tallyui/[email protected], 1.0.2, và 1.0.3
- @tallyui/[email protected], 1.0.2, và 1.0.3
Microsoft, trong phân tích về gói mistralai độc hại trên PyPI, cho biết nó được thiết kế để tải xuống một trình đánh cắp thông tin xác thực từ máy chủ từ xa ("83.142.209[.]194"), bao gồm logic nhận biết quốc gia để tránh các môi trường ngôn ngữ tiếng Nga và một nhánh phá hoại được giới hạn địa lý (geofenced) có xác suất 1/6 thực thi lệnh rm -rf / khi hệ thống có vẻ như đang ở Israel hoặc Iran.
"Vụ xâm nhập [email protected] đặc biệt đáng chú ý vì mã độc thực thi ngay khi import," Socket cho biết. "Gói này kiểm tra các hệ thống Linux, tải xuống một tệp Python từ xa từ https://git-tanstack.com/transformers.pyz, ghi vào /tmp/transformers.pyz và thực thi bằng python3 mà không có sự kiểm tra tính toàn vẹn."
Hoạt động mới nhất này cho thấy chiến dịch tiếp tục lan rộng trên cả npm và PyPI, với các gói bị ảnh hưởng trải dài từ cơ sở hạ tầng tìm kiếm, công cụ AI, tự động hóa doanh nghiệp cho đến các hệ sinh thái CI/CD.