Kẻ tấn công đã đầu độc 84 phiên bản npm của TanStack trên 42 gói, đánh cắp token OIDC GitHub và khóa đám mây, đồng thời cài một công tắc tử thần có thể xóa sạch hệ thống của bạn.
Thời điểm của kẻ tấn công rất cụ thể. Một bản fork, một commit ẩn, một pull request không khác biệt, và sau đó gần tám giờ không có gì hiện ra.
Vào ngày 11 tháng 5, từ 19:20 đến 19:26 UTC, 84 phiên bản độc hại trải rộng trên 42 gói npm chính thức @tanstack đã được đẩy lên kho lưu trữ. Theo @IntCyberDigest trên X, riêng @tanstack/react-router đã có hơn 12 triệu lượt tải xuống hàng tuần. Đó là lý do nó trở thành mục tiêu phù hợp.
Cuộc Càn Quét Thông Tin Xác Thực Mà Không Ai Lường Trước
Tải trọng, một tệp bị làm rối có kích thước khoảng 2,3 MB có tên router_init.js, chạy ngay khi nhà phát triển hoặc pipeline CI thực thi npm install. AWS IMDS, GCP metadata, token tài khoản dịch vụ Kubernetes, token Vault, khóa SSH riêng tư. Nó đã quét qua tất cả.
Người duy trì TanStack, Tanner Linsley, xác nhận toàn bộ nhóm đã bật xác thực hai yếu tố (2FA). Theo báo cáo khắc phục được công bố trên tanstack.com, tất cả đều vô nghĩa. Chuỗi tấn công không cần bất kỳ thông tin đăng nhập npm nào.
Việc trích xuất dữ liệu chạy qua mạng Session/Oxen, cụ thể là filev2.getsession.org và seed1 đến seed3.getsession.org. Mã hóa đầu cuối. Không có máy chủ chỉ huy và kiểm soát do kẻ tấn công kiểm soát để chặn theo IP. Kịch bản sâu npm đánh cắp khóa tiền điện tử, được điều chỉnh và nâng cấp.
Cách Một PR Không Khác Biệt Đầu Độc Toàn Bộ Pipeline Phát Hành
Việc thiết lập bắt đầu từ một ngày trước đó. Một bản fork của TanStack/router, được đổi tên thành github.com/zblgg/configuration để tránh bị tìm kiếm trong danh sách fork, đã nhận được một commit độc hại vào ngày 10 tháng 5 lúc 23:29 UTC. Danh tính giả mạo: claude@users.noreply.github.com. Không phải sản phẩm của Anthropic. Một email được tạo ra.
PR #7378 được mở vào sáng hôm sau. Trình kích hoạt quy trình làm việc pull_request_target, một mẫu nguy hiểm đã được ghi nhận từ lâu, đã chạy các công việc benchmark bằng mã của bản fork. Điều đó là đủ.
Bộ nhớ cache pnpm store bị đầu độc được lưu dưới đúng khóa mà release.yml sẽ tìm kiếm sau này. Kẻ tấn công sau đó đã force-push PR trở lại thành một no-op không có tệp nào và đóng nó lại. Bộ nhớ cache tồn tại. Nhà nghiên cứu Adnan Khan đã ghi lại loại tấn công này vào năm 2024. Kẻ tấn công đã lấy gần như nguyên văn kỹ thuật này, kèm theo cả bình luận ghi nhận.
Khi người duy trì Manuel sau đó merge một PR không liên quan, sửa lỗi CSS.supports vào nhánh main, quy trình làm việc phát hành đã kích hoạt và khôi phục bộ nhớ cache bị đầu độc. Thông tin đăng nhập GitHub bị thu thập thông qua cùng phương pháp đánh cắp thông tin xác thực qua GitHub từng thấy trong các chiến dịch trước.
Công Tắc Tử Thần
Nhà nghiên cứu carlini, đăng trên issue GitHub #7383, đã phát hiện một thứ khác bên trong tải trọng. Một script được cài đặt như một dịch vụ systemd trên Linux và một LaunchAgent trên macOS, gọi api.github.com mỗi 60 giây với token bị đánh cắp. Nếu token đó bị thu hồi, script sẽ chạy rm -rf. Thư mục nhà của bạn, biến mất.
“Vui lòng cẩn thận khi thu hồi token,” carlini viết trong luồng. Chỉ dừng lại ở đó.
Nhà nghiên cứu bảo mật ahmadnassri lưu ý trên issue theo dõi rằng socket.dev đang theo dõi 84 PURL @tanstack riêng lẻ cùng với sâu đang lây lan sang 200 gói khác trở lên.
Thủ Thuật OIDC Khiến Mọi Thứ Trông Sạch Sẽ
Các phiên bản bị đầu độc mang theo chứng thực mật mã hợp lệ. Việc xuất bản đến từ liên kết nhà xuất bản đáng tin cậy OIDC của GitHub Actions cho quy trình làm việc phát hành TanStack/router. Đối với npm, các gói này trông giống hệt bất cứ thứ gì Linsley tự mình phát hành.
Đây là phần khiến các nhà phòng thủ bối rối. Tải trọng không cần token npm của ai cả. Nó tạo ra một token OIDC có khả năng xuất bản bằng cách đọc trực tiếp bộ nhớ của runner, định vị tiến trình GitHub Actions Runner.Worker thông qua mục nhập /proc và đổ nó ra. Cùng một script Python được sử dụng trong vụ xâm phạm tj-actions/changed-files vào tháng 3 năm 2025.
@IntCyberDigest mô tả trên X đây là sâu npm đầu tiên được ghi nhận đi kèm với chứng chỉ xác thực hợp lệ, đã ký.
Việc phát hiện đến từ bên ngoài. Nhà nghiên cứu ashishkurmi, làm việc cho StepSecurity, đã công khai cảnh báo trong vòng 20 phút kể từ khi xuất bản độc hại. Carlini đã gửi báo cáo trực tiếp đến npm ngay trước khi issue GitHub được đăng.
Các gói được xác nhận sạch: @tanstack/query, @tanstack/table, @tanstack/form, @tanstack/virtual, @tanstack/store. Bất kỳ ai đã cài đặt gói bị ảnh hưởng vào ngày 11 tháng 5 nên ngay lập tức luân chuyển thông tin xác thực AWS, GCP, Kubernetes, Vault, GitHub, npm và SSH.
Nhóm đã không dùng nữa (deprecated) tất cả 84 phiên bản và yêu cầu bảo mật npm gỡ các tệp tar (tarball) khỏi kho lưu trữ.





Để lại một bình luận