Bỏ qua để vào nội dung chính
Worm npm cắm hook vào .claude/settings.json: kiểm tra ngay

Worm npm cắm hook vào .claude/settings.json: kiểm tra ngay

Bởi Grace Sullivan
13 thg 10, 20264 phút đọc

Hai đợt worm npm năm 2026 ghi SessionStart hook vào .claude/settings.json và commit vào repo. Cách kiểm tra, xử lý đúng thứ tự và chặn đợt sau.

Bạn gỡ package độc hại khỏi package.json, chạy lại npm install, và nghĩ đã xong. Thực tế hook vẫn nằm trong .claude/settings.json và chạy lại mỗi lần bạn mở session.

Đây là mô hình tấn công của hai đợt worm npm trong năm 2026, theo bài phân tích trên dev.to dẫn lại các báo cáo từ Microsoft, Snyk và StepSecurity.

Chuyện đã xảy ra

Ngày 11/5/2026, kẻ tấn công khai thác điểm yếu trong cấu hình GitHub Actions của TanStack và lấy được token có quyền publish lên npm. Trong khoảng sáu phút, chúng đẩy 84 phiên bản độc hại qua 42 package @tanstack/*. Đợt thứ hai ngày 19/5 nhắm vào các package @antv qua một tài khoản maintainer bị chiếm. Bài viết dẫn các báo cáo đếm được hơn 170 package bị ảnh hưởng trên npm và PyPI, gồm cả SDK của Mistral AI, UiPath và Guardrails AI.

Payload chạy từ install script của package, thu thập GitHub token, npm token, cloud key và CI secret. Phần khác biệt nằm ở bước tiếp theo: nó ghi một SessionStart hook vào .claude/settings.json, trỏ tới script .claude/setup.mjs mà nó thả xuống. Nó cũng ghi .vscode/tasks.json với task chạy khi mở folder, làm phương án dự phòng.

Sau đó nó dùng chính các GitHub token vừa trộm để commit cấu hình đó vào mọi repository nó với tới được, với tiêu đề chore: update dependencies và tác giả là claude@users.noreply.github.com.

Tháng 6, biến thể tên Miasma bắt đầu từ tài khoản GitHub của một nhân viên Red Hat bị chiếm, publish 32 phiên bản độc hại dưới scope @redhat-cloud-services, rồi lan tới tổ chức GitHub của Microsoft. Hơn 70 repository của Microsoft bị gỡ offline. Miasma còn bỏ qua npm với một số mục tiêu: nó cắm runner thẳng vào repo công khai, kích hoạt khi repo được clone và mở bằng Claude Code, Gemini CLI, VS Code hoặc Cursor.

Một chi tiết đáng nhớ: các bản release độc hại có provenance hợp lệ, vì được publish bằng CI token thật. "Có chữ ký" không còn là bằng chứng an toàn.

Vì sao dialog trust không cứu bạn

Claude Code có hỏi trước khi tin một folder lạ. Nhưng theo bài viết, hook vẫn chạy khi bạn không thấy dialog: bạn đã tin folder cha nên project bên trong kế thừa quyền; project được tin từ trước và hook tới sau qua git pull; hoặc bạn chạy headless bằng claude -p và Agent SDK. Bài viết dẫn nghiên cứu của Oasis Security cho biết Cursor mặc định tắt Workspace Trust.

Kiểm tra máy bạn ngay

Bốn chỗ cần đọc trong mỗi repo trước khi để agent chạy:

  • .claude/settings.json — đọc từng command trong mục hooks, cả file ở ~/.claude/
  • Các file .js, .mjs, .cjs nằm trong thư mục .claude/
  • .vscode/tasks.json — tìm task có folderOpen
  • .mcp.json — mỗi command ở đây khởi chạy một chương trình

Thêm một lệnh git nhanh để soi chữ ký commit của worm:

git log --all --oneline --author='claude@users.noreply.github.com'

Nếu tìm thấy, thứ tự rất quan trọng

Ngừng mở agent trong folder đó, kể cả VS Code và Cursor. Rotate credential trước khi dọn: npm token, GitHub token, SSH key, cloud key và mọi CI secret máy đó chạm tới được. Làm từ một máy bạn tin tưởng, vì session bạn mở để dọn dẹp có thể trộm luôn key mới.

Sau đó mới xóa hook và script lạ, rồi dùng git revert chứ không phải git reset, để lịch sử sự cố còn lại cho cả team đọc.

Chặn đợt sau

Lớp phòng thủ rẻ nhất là tắt install script: đặt ignore-scripts=true trong ~/.npmrc. Bài viết cho biết pnpm bản gần đây đã chặn install script của dependency theo mặc định, và tùy chọn minimumReleaseAge giữ lại các phiên bản quá mới vài ngày. Cả hai đợt TanStack đều bị phát hiện trong vòng vài giờ, nên một độ trễ ngắn đã đủ để tránh.

Việc cần làm hôm nay: đọc .claude/settings.json trong ba repo bạn mở thường xuyên nhất.

Không spam, hủy đăng ký bất kỳ lúc nào.

Bài viết liên quan