Chuỗi supply-chain compromise này ảnh hưởng đến 84 npm package artifacts trong namespace TanStack, với các phiên bản độc hại được phát hành lên npm registry vào khoảng 19:20 và 19:26 UTC. Đây là một cảnh báo CVE theo góc nhìn vận hành chuỗi cung ứng phần mềm, vì payload được nhúng nhắm vào môi trường CI, bao gồm GitHub Actions.
Theo phân tích từ Socket, phạm vi xâm nhập bao gồm 42 gói TanStack, mỗi gói có 2 phiên bản độc hại, trong đó có các thư viện được sử dụng rộng rãi như @tanstack/react-router, vốn có hơn 12 triệu lượt tải mỗi tuần. Do các gói này được dùng trực tiếp lẫn gián tiếp trong hệ sinh thái JavaScript, nguy cơ bảo mật và blast radius của cuộc tấn công này được đánh giá là rất lớn. Tham khảo thêm tại Socket advisory.
Cảnh báo CVE và mức độ ảnh hưởng
Mức độ nghiêm trọng được ghi nhận ở mức HIGH. Payload có khả năng exfiltrate nhiều loại bí mật nhạy cảm, bao gồm:
- AWS credentials
- GCP credentials
- Kubernetes credentials
- HashiCorp Vault credentials
- GitHub tokens
- SSH keys
- Nội dung .npmrc
Đây là một lỗ hổng CVE theo nghĩa thực chiến của chuỗi cung ứng: mã độc không khai thác memory corruption, mà tận dụng quy trình phát hành và cài đặt package để chạy mã trái phép trong môi trường phát triển và CI. Vì vậy, tác động chính là rò rỉ dữ liệu nhạy cảm và xâm nhập trái phép vào các hệ thống phụ thuộc vào workflow bị ảnh hưởng.
Phân tích payload trong router_init.js
Mỗi phiên bản bị chiếm quyền đều chứa một file mới tên router_init.js, dung lượng khoảng 2.3 MB. File này sử dụng kỹ thuật obfuscation mạnh, tương thích với phong cách của javascript-obfuscator, gồm:
- String-array rotation
- Hex-encoded identifier lookup như
_0x253b - Control-flow flattening trong state machine
while(!![]){} - Dead-code injection
Mẫu này khác rõ rệt so với các công cụ minify thông thường như Terser hoặc esbuild. Mục tiêu là làm khó quá trình phân tích tĩnh, che giấu chuỗi gọi hàm và luồng exfiltration trong cuộc tấn công mạng.
Các đặc trưng kỹ thuật đáng chú ý
Về hành vi, payload có các thành phần sau:
- Spawn-based daemonization kèm guard tái nhập
_DAEMONIZED - Truy cập trực tiếp các biến môi trường
GITHUB_*, bao gồm CI token và thông tin actor - Temp-directory staging với vòng đời đọc/ghi/xóa hoàn chỉnh
- Remote streaming và dispatch để gửi dữ liệu bí mật đã thu thập
Những dấu hiệu này phù hợp với mục tiêu remote code execution ở cấp workflow và đánh cắp thông tin xác thực trong quá trình build hoặc test.
Điểm chèn mã độc trong package.json
Bên cạnh file payload, các phiên bản bị sửa đổi còn thêm trường optionalDependencies trong package.json, trỏ tới một commit đáng ngờ trong repository TanStack/router với hash 79ac49eedf774dd4b0cfa308722bc463cfe5885c. Thông tin liên quan có thể xem tại GitHub issue.
Commit này không có lịch sử cha, và chỉ chứa:
package.jsontanstack_runner.jsđã được bundle
Đáng chú ý hơn, package.json đăng ký lifecycle hook prepare với lệnh:
bun run tanstack_runner.js && exit 1Điều này khiến mã độc tự động thực thi trên máy lập trình viên hoặc CI runner ngay trong quá trình cài đặt package. Đây là cơ chế điển hình của lỗ hổng zero-day trong supply chain khi không cần tương tác từ người dùng.
Chuỗi tấn công qua GitHub Actions
Phân tích hậu kiểm cho thấy chuỗi tấn công dựa trên ba kỹ thuật lạm dụng GitHub Actions:
- pull_request_target theo mô hình “Pwn Request”
- Cache poisoning qua ranh giới tin cậy fork-to-base
- Runtime memory extraction để trích xuất OIDC token từ tiến trình runner
Không có npm token nào bị đánh cắp. Thay vào đó, tác nhân phát hành độc hại được xác thực thông qua ràng buộc OIDC trusted-publisher của dự án, sau khi mã do kẻ tấn công điều khiển được thực thi trong pha test và cleanup của workflow, rồi đăng gói trực tiếp lên npm.
Cách khai thác này cho thấy cảnh báo CVE không chỉ nằm ở phần mềm được phát hành, mà còn ở toàn bộ chuỗi tin cậy của CI/CD, nơi token tạm thời và quyền publish có thể bị lạm dụng nếu workflow thiếu kiểm soát.
IOC và dấu hiệu nhận biết
Các IOC kỹ thuật có thể trích xuất từ sự cố này gồm:
- Gói bị ảnh hưởng:
@tanstack/* - Thời gian phát hành độc hại: khoảng
19:20 UTCđến19:26 UTC - File độc hại:
router_init.js - Commit đáng ngờ:
79ac49eedf774dd4b0cfa308722bc463cfe5885c - Hook độc hại:
preparechạybun run tanstack_runner.js && exit 1 - Chuỗi cấu hình đáng ngờ:
"@tanstack/setup": "github:tanstack/router#79ac49ee..."
Nếu phát hiện bất kỳ package version nào chứa chuỗi optionalDependencies nêu trên, cần xem đây là mã độc ransomware-style supply-chain payload theo nghĩa đánh cắp thông tin xác thực, dù không có hành vi mã hóa dữ liệu.
Ảnh hưởng hệ thống và biện pháp xử lý
TanStack đã đánh dấu toàn bộ 84 phiên bản bị ảnh hưởng bằng cảnh báo SECURITY và phối hợp để gỡ tarball độc hại ở cấp registry. Các cache entry của GitHub Actions cũng đã được xóa, đồng thời các thay đổi hardening đã được hợp nhất để tái cấu trúc workflow bị ảnh hưởng, thêm guard theo repository owner và ghim tham chiếu third-party action.
Bất kỳ developer nào đã cài một gói @tanstack/* trong khoảng 19:20–19:30 UTC cần coi host đó là có khả năng đã bị xâm nhập. Các bước xử lý tối thiểu gồm:
- Rotate toàn bộ cloud, GitHub và SSH credentials
- Audit cloud logs để tìm hoạt động bất thường
- Reinstall từ lockfile sạch, neo về phiên bản đã xác minh là an toàn
Trong bối cảnh an toàn thông tin và bảo mật mạng, sự cố này cho thấy cần kiểm tra chặt chẽ cả package dependency lẫn workflow CI/CD, đặc biệt khi package có lifecycle hook, optionalDependencies bất thường hoặc xuất hiện commit tham chiếu không có lịch sử rõ ràng.










