Chuyện gì đã xảy ra
Ngày 4/8/2026, Aikido ghi nhận tài khoản GitHub của maintainer đứng sau keyv bị chiếm. Kẻ tấn công dùng quyền đó để đẩy file độc hại thẳng lên main và phát hành version mới cho nhiều package npm cùng họ cache như keyv, flat-cache, file-entry-cache, cacheable-request, cacheable và cache-manager.
Điểm nguy hiểm là release vẫn đi qua GitHub Actions và có provenance hợp lệ. Với người tiêu thụ package, dấu hiệu ký phát hành không đủ để chứng minh an toàn khi chính tài khoản và đường phát hành đã bị chiếm.
Payload làm gì
Các package bị đầu độc được thêm script preinstall. Khi người dùng chạy npm install với version bị ảnh hưởng, setup.mjs tải Bun rồi chạy Math_Symbol.js. File JavaScript này được obfuscate và tập trung vào hai việc: đánh cắp credential và tự lan truyền.
Những nguồn bị quét gồm npm token trong .npmrc, GitHub token, OIDC token trên GitHub Actions runner, AWS credential, Kubernetes service account, Vault token, Stripe/Slack token, SSH/private key, file .env, Terraform state, Docker config, và nhiều file cấu hình IDE. Payload mã hóa dữ liệu trước khi đưa lên hạ tầng công khai do attacker kiểm soát, nên việc thấy repository drop point không đồng nghĩa có thể đọc lại secret đã mất.
Cơ chế tự lan
Nếu lấy được npm token có quyền publish, payload liệt kê package mà token có thể phát hành, tải tarball hiện tại, tăng patch version, thêm preinstall hook, nhét payload vào rồi publish lại. Nếu lấy được GitHub token phù hợp, nó còn có thể commit vào nhiều branch, thêm hook vào cấu hình VS Code hoặc Claude Code để chạy lại payload khi dev mở repo hoặc dùng phiên coding agent.
Aikido ghi nhận ít nhất 434 package qua 1.381 version bị ảnh hưởng trong bản nội dung được trích xuất. Con số lượt cài hàng tháng rất lớn, nhưng dev nên đọc nó như chỉ báo phạm vi dependency, không phải số máy chắc chắn đã bị lộ secret.
Dev nên làm gì
Kiểm tra lockfile cho keyv, flat-cache, file-entry-cache, cacheable-request, cacheable, cache-manager và package liên quan. Nếu môi trường dev hoặc CI đã chạy npm install trong cửa sổ rủi ro, hãy coi token trên môi trường đó là có khả năng lộ và rotate.
Nên audit lifecycle scripts, đặc biệt package bỗng nhiên thêm preinstall hoặc postinstall. Với CI, hạn chế secret mặc định, dùng token ngắn hạn, chia quyền publish theo package, và tách môi trường build khỏi môi trường có quyền phát hành. Bài học chính không mới: supply chain không cần exploit app của bạn nếu nó có thể chạy code ngay lúc cài dependency.