Worm npm liên quan đến Keyv đầu độc hàng trăm gói thư viện, cài cắm Hook vào Claude Code và VS Code

Một loại worm npm đánh cắp thông tin xác thực xuất hiện lần đầu trong [email protected] đã lây lan qua hàng trăm gói thư viện thuộc nhiều tổ chức khác nhau vào ngày 4 tháng 8 năm 2026. SafeDep đã xác minh 353 phiên bản bị nhiễm độc trên 79 tên gói trong npm registry, trong khi Aikido báo cáo con số lên tới ít nhất 868 gói. Mã độc sử dụng script preinstall và các hook trong VS Code, Claude Code để chiếm đoạt khóa bí mật và token của nhà phát triển.
npm worm attack
Vụ tấn công chuỗi cung ứng nhắm vào hệ sinh thái npm

Một loại worm npm đánh cắp thông tin xác thực xuất hiện lần đầu trong phiên bản [email protected] đã lây lan ra ngoài các namespace Keyv và Cacheable, xâm nhập vào hàng trăm gói thư viện của nhiều tổ chức khác nhau vào ngày 4 tháng 8 năm 2026.

SafeDep đã xác minh 353 phiên bản bị đầu độc trên 79 tên gói trong npm registry. Hệ thống giám sát của họ ước tính quy mô thực tế có thể lên tới 442 phiên bản trên 353 tên gói, trong khi Aikido sau đó báo cáo có ít nhất 868 gói với 1.381 phiên bản bị ảnh hưởng. Hiện tại, cả hai con số lớn hơn này đều chưa thể được tái lập độc lập từ danh sách công khai hoàn chỉnh tại thời điểm báo cáo.

Cơ chế hoạt động của Worm đánh cắp thông tin

Bản phát hành độc hại sử dụng một script preinstall để chạy một gói bundle đánh cắp thông tin xác thực bên trong môi trường của nhà phát triển và môi trường tích hợp liên tục (CI). SafeDep và Socket cho biết nó có thể thu thập dữ liệu từ repository, registry của gói, các dịch vụ cloud và tài liệu khóa riêng (private-key), sau đó sử dụng quyền xuất bản npm có sẵn để tiếp tục đầu độc thêm nhiều gói khác.

Repository của Keyv cũng chứa các hook riêng biệt cho Claude Code và Visual Studio Code (VS Code), có thể thực thi mã độc ngay khi người dùng tin tưởng không gian làm việc (workspace) hoặc cho phép cấu hình dự án.

Socket khuyến cáo rằng bất kỳ máy trạm hoặc trình chạy (runner) nào đã thực thi phiên bản bị ảnh hưởng đều nên được coi là đã bị lộ thông tin xác thực. SafeDep khuyên các bên ứng cứu nên loại bỏ trình theo dõi thu hồi thông tin xác thực của mã độc trước khi thực hiện xoay vòng (rotate) các token và khóa bị lộ.

Việc thu hồi chính là kích hoạt của trình theo dõi; nếu xoay vòng khóa trước có thể khiến một trình xử lý cục bộ do kẻ tấn công cung cấp được thực thi.

npm 12 mặc định chặn các script vòng đời phụ thuộc (dependency lifecycle scripts) không được phê duyệt, nhưng các máy khách npm cũ hơn và các lộ trình cài đặt khác cho phép chạy các script này vẫn đối mặt với rủi ro.

Phân tích kỹ thuật các giai đoạn tấn công

Bản phát hành độc hại đầu tiên được xác nhận là [email protected]. Nó đã thêm lệnh node setup.mjs dưới dạng lệnh preinstall và bao gồm các tệp setup.mjsMath_Symbol.js trong gói, trong khi vẫn giữ nguyên mã thư viện đã biên dịch.

Giai đoạn một sẽ kiểm tra sự hiện diện của Bun, tải xuống phiên bản 1.3.13 từ các bản phát hành GitHub chính thức nếu cần, và chuyển tiếp quyền điều khiển cho một gói bundle đã biên dịch có dung lượng 727.680 byte.

Phân tích mã độc SafeDep
Nguồn: SafeDep

Theo phân tích của SafeDep, gói mã độc này sẽ thu thập thông tin từ GitHub, npm, cloud, Vault, Kubernetes, cơ sở dữ liệu và các khóa riêng tư. Nó cũng đọc bộ nhớ của trình chạy GitHub Actions, cài đặt trình theo dõi thu hồi token và mang theo bộ máy xuất bản npm. Socket đã giải mã riêng biệt mã nguồn dùng để sửa đổi, tạo phiên bản và tái xuất bản các gói bằng danh tính npm bị đánh cắp.

Sự thay đổi nhanh chóng của Registry

Hệ thống registry thay đổi quá nhanh khiến việc duy trì một danh sách cố định các gói bị gắn thẻ latest là rất khó khăn. Vào lúc 5:40 chiều giờ IST ngày 4 tháng 8, các trang gói npm cho thấy các bản phát hành cũ hơn đã được khôi phục làm phiên bản latest cho ít nhất chín gói, bao gồm [email protected], [email protected], và [email protected].

Do chiến dịch không thể được lập bản đồ chi tiết từng gói một cách độc lập, việc kiểm tra phơi nhiễm phải sử dụng tên gói chính xác, phiên bản đã giải quyết và tệp lockfile thay vì dựa vào danh sách các tag hiện tại.

Mối đe dọa từ Repository và Hook IDE

Repository này còn chứa một lộ trình thực thi thứ hai. Tệp .claude/settings.json của nó chứa một hook SessionStart gọi đến .vscode/setup.mjs. Tệp .vscode/tasks.json chứa một tác vụ Environment Setup với runOn: folderOpen gọi đến .claude/setup.mjs. Các tệp này tạo ra một đường dẫn để thực thi mã độc từ một repository đã được checkout, mặc dù chúng không chạy vô điều kiện trong mọi môi trường mặc định.

  • VS Code chặn các tác vụ tự động trong một không gian làm việc không đáng tin cậy và sẽ đưa ra cảnh báo trước khi cho phép.
  • Claude Code áp dụng sự tin tưởng của không gian làm việc cho các cài đặt dự án do repository cung cấp.

Tính đến chiều ngày 4 tháng 8, cả hai tệp hook vẫn hiện diện trên nhánh main. Tệp manifest core/keyv/package.json vẫn khai báo phiên bản 6.0.0 và giữ nguyên lệnh preinstall độc hại.

Nguồn gốc và Sự xác thực (Provenance)

Bản phát hành Keyv bị nhiễm độc mang theo chứng thực nguồn gốc OpenID Connect (OIDC) và Supply-chain Levels for Software Artifacts (SLSA) hợp lệ vì nó đã đi qua quy trình phát hành GitHub Actions chính thống của dự án. Chứng thực này xác nhận quy trình build là đúng, nhưng không thể đảm bảo rằng mã nguồn đầu vào là an toàn.

Bằng chứng cho thấy worm này có thể đã lây lan từ một danh tính xuất bản bị đánh cắp hoặc liên quan đến nhiều thông tin xác thực của các nhà xuất bản khác nhau bị xâm nhập riêng lẻ. Các chuyên gia bảo mật nhận thấy sự trùng lặp với họ mã độc Shai-Hulud, từng xuất hiện trong vụ xâm nhập gói lightning trên PyPI vào tháng 4.