Một hình minh họa trừu tượng được tạo ra trên nền xanh navy đậm: một chuỗi các khối trong mờ lồng vào nhau chạy từ trái sang phải, mỗi khối được đóng dấu bằng một con dấu màu xanh lơ phát sáng nhỏ. Gần giữa chuỗi, một khối đã được thay bằng một khối tối mang con dấu màu xanh lơ giống hệt, và chuỗi tiếp tục đi qua nó mà không bị gián đoạn. Những sợi tơ màu hổ phách mảnh rẽ nhánh xuống dưới từ khối tối đó, hướng tới một hàng nhỏ các ô đầu cuối tối ở đáy khung hình. Không có văn bản, số, người, nhãn hiệu hay logo tổ chức nào xuất hiện. Logo OrcaRouter được ghép vào góc dưới bên phải.
AI Safety Incidents

ChainDrop: nguồn gốc hợp lệ trong hơn 400 gói npm, và các hook Claude Code không cần cài đặt npm

Tác giả

Elias Hawthorne

Ngày đăng

Mô hình mới nhất · 20Xem tất cả mô hình →
Benchmark: Artificial Analysis · cập nhật hằng ngày
Quay lại tất cả bài viết

Vào 4 tháng 8 năm 2026 những kẻ tấn công đã chiếm đoạt tài khoản GitHub đứng sau keyv, một thư viện lưu đệm mà Elastic Security Labs cho biết đã được tải xuống hơn 600 triệu lần trong tháng trước đó. Wiz Research và Orca Security đều ghi nhận rằng các tệp độc hại đã được đẩy thẳng vào nhánh main của keyv, và rằng quy trình GitHub Actions của chính dự án sau đó đã build và phát hành bản phát hành bị nhiễm độc — nên nó đã đến được npm với provenance hợp lệ, thứ mà công cụ attestation của chuỗi cung ứng dùng để quyết định một gói là đáng tin cậy. Một con sâu tự lan truyền mà giới nghiên cứu gọi là ChainDrop sau đó đã dùng các token npm bị đánh cắp để lặp lại thủ thuật này trên các gói của những người duy trì khác: Elastic đếm được hơn 400 gói riêng biệt tính đến ngày 6 tháng 8, Microsoft Threat Intelligence mô tả chiến dịch tương tự vào ngày 4 tháng 8, và Cơ quan An ninh mạng Singapore đếm được hơn 1.300 phiên bản gói bị xâm phạm với tổng cộng 2 tỷ lượt tải xuống mỗi tháng. Cả Elastic và Microsoft đều mô tả các hook chạy lại khi một repository được mở trong Claude Code hoặc Visual Studio Code. Danh sách nguồn đầy đủ, mức độ nghiêm trọng và đánh giá độ tin cậy của bản ghi nằm trong kho lưu trữ sự cố AI, cùng với các mục nhập khác về chuỗi cung ứng npm và công cụ dành cho nhà phát triển được ghi nhận xung quanh nó.

Một quy trình phát hành hợp pháp đã tự ký vào sự xâm phạm của chính mình như thế nào

Wiz Research dựng lại những phút mở đầu: từ 09:00 UTC ngày 4 tháng 8 kẻ tấn công đã sử dụng một danh tính bị xâm phạm để đưa các payload duy trì IDE vào kho lưu trữ keyv, rồi ngay sau đó phát hành một phiên bản mới của keyv chứa payload. Wiz xác định bên bị xâm phạm là một tài khoản người bảo trì GitHub và cho biết nhiều gói trong hệ sinh thái keyv và cacheable cũng bị ảnh hưởng theo sau.

Bài viết phản ứng nhanh của Orca Security cụ thể hơn về đường dẫn ký. Theo đó, kẻ tấn công đã đẩy hai tệp độc hại — setup.mjs và Math_Symbol.js — trực tiếp lên nhánh chính và ngay lập tức phát hành phiên bản mới. Bởi vì những bản phát hành đó được xây dựng thông qua quy trình GitHub Actions của tài khoản bị xâm phạm, các phiên bản bị đầu độc đã được xuất bản lên npm với các chữ ký xuất xứ hợp lệ, bỏ qua các kiểm tra toàn vẹn chuỗi cung ứng tiêu chuẩn. Zscaler ThreatLabz, một nhóm nghiên cứu độc lập không nằm trong số các nguồn được trích dẫn trong hồ sơ, đi đến cùng kết luận và gắn mức độ cho nó: gói độc hại keyv 6.0.0 mang SLSA Build Level 3 xuất xứ hợp lệ vì kẻ tấn công đã kiểm soát kho mã nguồn. BleepingComputer, đơn vị đã đưa tin về chiến dịch trong ngày, ghi nhận cùng cơ chế — các tệp độc hại được đẩy trực tiếp lên nhánh chính của dự án, các bản phát hành mới được tạo ra, xuất xứ hợp lệ vì các bản dựng chạy qua quy trình GitHub Actions hợp pháp.

Phân tích của Microsoft bổ sung một chi tiết trông có vẻ mâu thuẫn nhưng thực ra không phải vậy. Trong giai đoạn lan truyền của worm, Microsoft Threat Intelligence phát hiện rằng nhiều phiên bản độc hại không có commit mã nguồn, pull request, tag hoặc bản phát hành hợp lệ tương ứng, điều này cho thấy những kẻ tấn công đã sửa đổi và công bố trực tiếp các tarball của gói thay vì xâm phạm từng kho mã nguồn công khai. Khi đọc cùng nhau, các nguồn tin mô tả hai chế độ ký bên trong một chiến dịch: các bản phát hành keyv đầu tiên đi qua quy trình CI thực sự của nạn nhân và mang theo các chứng nhận xác nhận điều đó, trong khi các bản phát hành sau của worm phần lớn được lắp ghép và công bố bằng token registry bị đánh cắp, không để lại bất kỳ dấu vết mã nguồn nào. Quan sát của chính Microsoft là mô hình tarball trực tiếp giải thích vì sao các bản phát hành độc hại thường xuất hiện dưới dạng một lần tăng phiên bản vá thông thường mà không có commit mã nguồn hoặc pull request tương ứng.

Bài học khó chịu được Zscaler nêu thẳng thừng: provenance xác thực quy trình build, chứ không xác thực danh tính của tài khoản hay tính toàn vẹn của hệ thống CI đang vận hành nó. Báo cáo cũng thừa nhận một lỗ hổng đáng lưu tâm với bất kỳ ai muốn tái dựng lại sự cố — cơ chế chiếm đoạt tài khoản chính xác mà kẻ tấn công đã dùng vẫn chưa được biết tại thời điểm phân tích.

Những gì chạy khi npm install: preinstall, Bun 1.3.13 và một bộ thu thập 300 mẫu

Elastic Security Labs mô tả tác nhân kích hoạt là preinstall hook trong package.json, lợi dụng một tính năng hợp pháp của npm chạy lệnh tùy ý trước khi gói hoàn tất cài đặt, không yêu cầu nạn nhân tương tác thêm. Hook này khởi chạy setup.mjs, tệp này kiểm tra xem runtime JavaScript Bun đã có sẵn hay chưa. Nếu chưa, dropper phát hiện nền tảng và kiến trúc của máy, tải Bun v1.3.13 từ trang phát hành chính thức, giải nén, dùng nó để thực thi payload, rồi xóa thư mục tạm để che giấu dấu vết. Wiz đã xác định một cách độc lập user agent Bun/1.3.13 thực hiện các lệnh gọi độc hại. Dropper là đa nền tảng, nhắm tới Linux, macOS và Windows.

Payload bị làm rối mã hóa rất nặng, và các nguồn có đôi chút khác biệt về kích thước của nó: Elastic cho nó ở mức 711 kilobyte, còn Orca Security cho là 728 KB. Nó sử dụng kỹ thuật làm phẳng luồng điều khiển và sơ đồ mã hóa chuỗi Base91, đồng thời mang các chuỗi theo chủ đề Dune — laza, kanly, ghola, mentat, lasgun, sietch, fedaykin, tleilaxu, sandworm, sardaukar, ornithopter, navigator — mà Elastic ghi nhận có những điểm tương đồng với các chiến dịch Shai-Hulud trước đó.

Bản mô tả hành vi của Microsoft bổ sung hai chi tiết đáng lưu ý. Payload trước tiên kiểm tra môi trường của nó và thoát trên các hệ thống dùng tiếng Nga, tránh các phiên bản trùng lặp, đồng thời khởi chạy một bản sao nền tách rời trên máy trạm của nhà phát triển; bên trong CI, nó vẫn gắn với công việc đang hoạt động để có thể truy cập bí mật của quy trình làm việc, thông tin xác thực của runner và quyền xuất bản OpenID Connect.

Bộ thu thập là nơi sự cố trở thành câu chuyện về công cụ AI thay vì câu chuyện thông tin xác thực chung. Elastic cho biết nó quét hơn 300 mẫu duy nhất trong các kho thông tin xác thực trên máy của nhà phát triển, và rằng việc nhắm mục tiêu đáng chú ý hướng đến thông tin xác thực công cụ AI: Anthropic, Claude, Codex, Cursor, OpenAI và Gemini. Nó cũng thu thập thông tin xác thực AWS, GCP, Azure và Alibaba Cloud, token truy cập cá nhân GitHub, token JWT và token phiên, token HashiCorp Vault, khóa riêng SSH, token tài khoản dịch vụ Kubernetes và token npm. Wiz báo cáo rằng danh sách mục tiêu đã được mở rộng gần 70% so với mã Mini Shai-Hulud trước đó mà nó dựa trên, với các bổ sung mới bao gồm kho thông tin xác thực tác nhân AI cho Claude, OpenAI, Codex, Cursor và Gemini, keystore tiền mã hóa cho Foundry, Solana và Monero, master.key của Jenkins, bí mật Argo CD và Harbor, cấu hình CLI Alibaba và Tencent, và /etc/shadow.

Cả Microsoft và Elastic đều mô tả cùng một thiết kế rò rỉ dữ liệu. Kết quả được tuần tự hóa thành JSON, nén bằng gzip và mã hóa bằng khóa AES-256-GCM được tạo ngẫu nhiên, và khóa đó được bọc bằng khóa công khai RSA của kẻ tấn công. Payload không gán cứng tên miền command-and-control của nó: Elastic cho biết nó truy vấn một hợp đồng thông minh Ethereum tại 0xE1f2395ee43e45A1556EC6438a88c31B83493103 để tìm nạp endpoint hiện tại trong thời gian chạy, nhờ đó có thể luân chuyển hạ tầng mà không cần động đến mã độc. Nếu việc đó thất bại, nó tìm một dấu hiệu được ký bằng mật mã — thebeautifulmarchoftime — trong lịch sử commit GitHub và xác thực tên miền với khóa RSA nhúng. Nếu cả hai đều thất bại, nó rò rỉ dữ liệu qua một repository GitHub công khai do chính tài khoản của nạn nhân tạo ra, được mô tả là "Shai-Hulud: Here We Go Again". Microsoft lưu ý rằng một đường dự phòng mã hóa token GitHub bị đánh cắp bằng Base64 kép thay vì mã hóa nó.

Việc phát tán phụ thuộc vào chất lượng token. Elastic báo cáo rằng sâu chỉ kích hoạt khi đợt quét thông tin xác thực tìm thấy một token npm có quyền ghi gói và khả năng xuất bản mà không cần xác thực hai yếu tố; sau đó nó tải xuống tarball mới nhất của từng gói có thể ghi, tự chèn chính nó, tăng phiên bản bản vá và phát hành lại. BleepingComputer bổ sung rằng mọi token đều được xác thực trong thời gian thực với điểm cuối whoami của registry trước khi bị đánh cắp. Chính quy trình đó đã biến một danh tính bị xâm phạm thành hàng trăm bản phát hành, và đó là lý do các phiên bản độc hại trông giống như những lần tăng bản vá thông thường.

An HTML card titled 'The first four hours, 4 August 2026', subtitled 'What the sources put where in the infection order, and the three counts the campaign is quoted with'. A four-step numbered column headed 'Infection order' reads: 1, 09:00 UTC: files pushed to main — attacker adds IDE persistence payloads to the keyv repository, then publishes a new keyv version, per Wiz Research; 2, the victim's CI builds the payload — keyv 6.0.0 reaches npm through the compromised account's own GitHub Actions workflow carrying valid provenance and a SLSA Build Level 3 attestation, per Orca Security and Zscaler ThreatLabz; 3, the worm republishes with stolen tokens — stolen npm tokens with write access and 2FA bypass bump patch versions, at peak roughly one infected package per second, per Elastic Security Labs and Zscaler ThreatLabz; 4, IDE hooks travel with the repos — a stolen GitHub App token commits .claude/settings.json and .vscode/tasks.json to up to 50 branches per accessible repository, per Elastic Security Labs. A right-hand panel headed 'Three counts, three units' shows: 400+, unique npm packages compromised by 6 August, per Elastic and Microsoft Threat Intelligence; 868, worm-reached packages across 1,381 versions, per Aikido via BleepingComputer and Orca Security; 1,300+, package versions with 2 billion monthly downloads, per CSA Singapore advisory AD-2026-009, 6 August. A footer reads: each figure is a snapshot taken while the campaign was still running; none of the cited sources claims a final total.

Con đường lây nhiễm không cần npm install

Phát hiện giúp chiến dịch này khác với các sâu npm trước đó là việc cài đặt không còn là con đường duy nhất để xâm nhập. Elastic mô tả hai đường thực thi bổ sung nhắm vào người dùng các công cụ lập trình AI. Một SessionStart hook trong .claude/settings.json chạy node .claude/setup.mjs khi một phiên Claude mới bắt đầu. Đối với VS Code, một folderOpen tác vụ trong .vscode/tasks.json chạy node .vscode/setup.mjs khi một kho lưu trữ bị nhiễm được mở. Phân tích của Microsoft liệt kê cùng bốn tệp — .claude/settings.json, .claude/setup.mjs, .vscode/tasks.json và .vscode/setup.mjs — và mô tả chúng là một con đường lây nhiễm thứ cấp có thể khởi động lại payload sau khi quá trình cài đặt npm ban đầu đã hoàn tất.

Điều kiện khiến điều này lan rộng đáng kể nằm ở thông tin xác thực bị đánh cắp. Khi một token GitHub App nằm trong số đó, Elastic báo cáo rằng worm commit các hook độc hại lên tối đa 50 nhánh trên mỗi kho lưu trữ có thể truy cập, đồng thời đưa .claude/settings.json và .vscode/tasks.json vào từng nhánh. Kết luận của Elastic là một nhà phát triển sao chép một trong các nhánh đó và mở nó có thể bị lây nhiễm chỉ bằng việc mở dự án — không có bước cài đặt gói nào, và do đó không hề có lớp phòng vệ dựa trên script cài đặt trong toàn bộ đường thực thi.

Đánh giá của Zscaler là các hook duy trì vẫn tồn tại sau khi gói bị gỡ bỏ và tự thực thi lại chỉ bằng cách mở dự án trong VS Code hoặc Claude Code, điều này vượt qua --ignore-scripts – biện pháp giảm thiểu mà nhiều nhóm đã áp dụng sau các worm npm trước đó. Theo đó, khuyến nghị của họ là: hãy coi các tệp cấu hình IDE và tác nhân AI — .claude/, .cursor/, .vscode/, .gemini/ — là mã thực thi, được đánh giá với cùng mức độ nghiêm ngặt như mã nguồn.

Có một dấu vết nhận dạng cho nửa phần liên quan đến repository của cuộc tấn công. Elastic báo cáo rằng các commit do worm tạo ra có thể được nhận diện qua tên tác giả claude và thông điệp commit chore: update config, và Wiz ghi nhận cùng chuỗi thông điệp. Elastic cho biết thêm rằng thông điệp commit còn mang theo token GitHub bị đánh cắp cùng với một chuỗi đe dọa — IfYouBlockThisAPIKeyItWillCrashTheLiveProductionServersOfAllThirdPartyClients — mà họ coi là nỗ lực đe dọa nhằm ngăn các nhà phát triển thu hồi token. Wiz ghi nhận cùng chuỗi đó trong các commit ban đầu, với thông điệp ngắn hơn được thay vào trên các commit đưa hook IDE vào.

A generated abstract illustration on a deep navy field: a tall repository-shaped block stands at centre, its face divided into thin horizontal branch lines. A narrow beam of pale light from an editor-shaped pane at upper left falls across the block, and where the beam touches one branch line, a small bright hook symbol appears and a thin amber thread runs down into a dark pool at the base. The other branch lines remain untouched and faintly lit. No text, numbers, people, brand marks or organisation logos appear. The OrcaRouter logo is composited in the bottom-right corner.

Các con số không khớp nhau, và đó không phải là một mâu thuẫn.

Mỗi con số được công bố về phạm vi ảnh hưởng đều gắn với một đơn vị đo khác nhau, và các đơn vị này không thể hoán đổi cho nhau. Elastic Security Labs, trong bài viết ngày 6 tháng 8, đếm được hơn 400 gói npm riêng biệt bị xâm phạm. Microsoft Threat Intelligence mô tả hơn 400 gói trải rộng trên nhiều nhà phát hành không liên quan đến nhau. Aikido, theo trích dẫn của BleepingComputer, đưa ra con số ít nhất 868 gói trên 1.381 phiên bản. Orca Security báo cáo 10 gói keyv và cacheable bị đầu độc trực tiếp với hơn 619 triệu lượt tải xuống mỗi tháng, sau đó là 868 gói bổ sung và 1.381 phiên bản mà sâu đã lan tới, với hơn 2 tỷ lượt cài đặt mỗi tháng. Bản tư vấn AD-2026-009 của CSA Singapore, ngày 6 tháng 8, ghi nhận hơn 1.300 phiên bản gói bị xâm phạm đại diện cho tổng cộng 2 tỷ lượt tải xuống mỗi tháng.

Đó là ba mẫu số khác nhau — số gói, phiên bản gói và lượng tải xuống hằng tháng — được lấy tại ba thời điểm khác nhau của một chiến dịch vẫn đang diễn ra. Cách Zscaler mô tả tốc độ lây lan giải thích vì sao chúng lại khác nhau: nó cho biết sâu đã tự lan truyền tới hơn 400 gói trong chưa đầy bốn giờ và, ở đỉnh điểm, phát hành khoảng một gói bị nhiễm mỗi giây. Việc coi một con số muộn hơn là sự hiệu chỉnh cho một con số trước đó sẽ là sai; mỗi con số là một ảnh chụp nhanh, và không nguồn nào được trích dẫn khẳng định một tổng số cuối cùng.

Số liệu về mức độ phổ biến của Elastic ở cấp độ thư viện là những con số được trích dẫn thường xuyên nhất và cũng ít gây nhầm lẫn nhất. Họ báo cáo riêng keyv đạt hơn 600 triệu lượt tải xuống trong tháng trước, flat-cache gần 580 triệu, cacheable-request hơn 137 triệu, cacheable hơn 30 triệu và cache-manager hơn 16 triệu. Khuyến cáo của CSA liệt kê các phiên bản cụ thể đã bị xâm phạm, trong đó có keyv 6.0.0, flat-cache 6.1.24, file-entry-cache 11.1.6, cacheable-request 13.0.20, cacheable 2.5.1, cache-manager 7.2.10, @cacheable/utils 2.5.1 và ecto 5.0.1.

Cái bẫy thu hồi

Các nhân viên ứng cứu đã cài đặt một phiên bản bị ảnh hưởng phải đối mặt với vấn đề thứ hai sau vấn đề đầu tiên. Elastic báo cáo rằng trong một đường dự phòng GitHub có điều kiện, payload cố gắng cài đặt một thành phần giám sát token để duy trì quyền truy cập thông tin xác thực và chứa một bộ xử lý phá hoại nếu token được giám sát bị thu hồi. Zscaler mô tả cơ chế này một cách chi tiết về mặt vận hành và gọi nó là bẫy thu hồi token: sâu máy tính cài đặt một tiến trình nền thăm dò API GitHub cứ sau 60 giây bằng token bị đánh cắp, và nếu token trả về lỗi 4xx — nghĩa là nạn nhân đã thu hồi nó — một payload phá hoại thứ cấp sẽ kích hoạt, mà tùy thuộc vào biến thể, có thể bao gồm thực thi mã từ xa hoặc xóa thư mục gốc của người dùng.

Wiz bổ sung rằng cơ chế dead-man's switch được kích hoạt một cách có chọn lọc dựa trên phản hồi từ máy chủ lệnh và điều khiển: kẻ vận hành có thể trả về một giá trị chỉ định lệnh nào sẽ được kích hoạt và token nào mà switch phải theo dõi để thu hồi. Wiz cũng lưu ý rằng trình giám sát tìm kiếm một phản hồi hợp lệ từ điểm cuối của người dùng, vì vậy bất kỳ loại token nào hợp lệ ở đó đều có thể đóng vai trò yếu tố kích hoạt.

Hệ quả thực tế được ghi lại bởi BleepingComputer và bởi hướng dẫn của Aikido mà bài viết trích dẫn: một máy trạm của nhà phát triển hoặc trình chạy CI/CD đã cài đặt phiên bản bị ảnh hưởng nên được coi là đã bị xâm phạm ngay cả khi gói đó sau đó đã bị gỡ bỏ, vì việc thực thi ở giai đoạn hai có thể đã làm lộ mã thông báo và làm suy yếu tính toàn vẹn của bản dựng. Hướng dẫn của Microsoft đi đến cùng kết luận từ phía bản dựng, cảnh báo rằng các tổ chức đã cài đặt một gói bị ảnh hưởng với các tập lệnh vòng đời được bật nên coi máy trạm hoặc trình chạy bản dựng là có khả năng đã bị xâm phạm và xây dựng lại các hệ thống bị ảnh hưởng cùng các sản phẩm đầu ra ở hạ nguồn từ các nguồn đáng tin cậy.

An HTML card titled 'Established, assessed, and not shown', subtitled 'The same five analyses, sorted by how strongly each claim is supported — not by how confidently it is written'. Three columns. ESTABLISHED lists: the keyv maintainer's GitHub account was compromised, files were pushed to main and a release was published on 4 August 2026; at least keyv 6.0.0 shipped through the victim's own CI with valid provenance and SLSA Build Level 3; a preinstall hook ran setup.mjs, which downloaded Bun v1.3.13 to execute an obfuscated payload; the collector scanned 300+ credential patterns including Anthropic, Claude, Codex, Cursor, OpenAI and Gemini; hooks in .claude/settings.json and .vscode/tasks.json run on session start and folder open; a GitHub App token extended the hooks to up to 50 branches per accessible repository; more than 400 unique packages were compromised within days; CSA Singapore published advisory AD-2026-009 on 6 August 2026. ASSESSED lists: attribution to the Mini Shai-Hulud family and a TeamPCP lineage; that the account takeover was the initial access route; that provenance must not be read as proof of safety, since it validates the pipeline and not the account; that IDE configuration files should be treated as executable code. NOT SHOWN lists: how the maintainer account was taken over, reported as unknown by Zscaler; any single final total, since the counts use packages, versions and downloads interchangeably; any confirmed reuse of a stolen AI-tooling credential against a provider account; who the operator is beyond vendor attribution; any remediation outcome, account recovery or enforcement action. A footer cites Elastic Security Labs, Microsoft Threat Intelligence, Wiz Research, Orca Security and CSA Singapore AD-2026-009.

Điều gì đã được xác lập, điều gì đang được đánh giá, và điều gì chưa ai chứng minh

Hồ sơ gốc cùng năm phân tích độc lập đều hội tụ về khía cạnh cơ học, và những luận điểm mang tính cơ học chính là phần vững chắc nhất trong toàn bộ tài liệu.

• Tài khoản GitHub của người duy trì keyv đã bị xâm phạm, và các tệp độc hại đã được đẩy trực tiếp vào nhánh main trước khi một bản phát hành được công bố, vào ngày 4 tháng 8 năm 2026 — được Wiz, Orca Security, BleepingComputer và CSA Singapore báo cáo nhất quán.

• Ít nhất keyv 6.0.0 đã đến được npm thông qua chính pipeline CI của nạn nhân, mang theo thông tin xuất xứ hợp lệ, với Zscaler nêu rõ một chứng thực SLSA Build Level 3. Đây là tuyên bố khiến sự cố trở nên đáng chú ý, và nó được xác nhận bởi ba tổ chức vốn không đồng tác giả công trình của nhau.

• Một hook preinstall đã thực thi setup.mjs, tệp này đã tải xuống Bun v1.3.13 và chạy một payload bị làm rối mã, quét hơn 300 mẫu thông tin xác thực, bao gồm cả thông tin xác thực của các công cụ lập trình AI — Elastic và Wiz đều đồng ý về cả phiên bản runtime lẫn danh sách thông tin xác thực nhắm mục tiêu AI.

• Các hook được ghi vào .claude/settings.json và .vscode/tasks.json sẽ thực thi khi bắt đầu phiên và khi mở thư mục, và một token GitHub App đã mở rộng phạm vi đó lên tối đa 50 nhánh trên mỗi kho lưu trữ có thể truy cập — phát hiện của Elastic, và là cơ sở cho tuyên bố của họ rằng một nhà phát triển có thể bị nhiễm khi mở một kho lưu trữ.

Hơn 400 gói riêng biệt đã bị xâm phạm chỉ trong vài ngày, và CSA Singapore, một cơ quan quản lý cấp quốc gia, đã công bố khuyến cáo AD-2026-009 vào ngày 6 tháng 8 năm 2026, liệt kê các phiên bản bị ảnh hưởng cùng các chỉ báo.

Điều mà các nguồn coi là đánh giá thay vì sự thật nên được gắn nhãn. Wiz mô tả payload là hậu duệ của dòng mã độc Shai-Hulud "Mini", được xây dựng trên các kho lưu trữ công khai Shai-Hulud-Open-Source do TeamPCP công bố, với một vài thay đổi quan trọng; Orca Security quy kết cuộc tấn công cho TeamPCP; Zscaler liên kết ChainDrop với TeamPCP và đặt nó trong một dòng phát triển kéo dài từ tháng 9 năm 2025. Đó là sự đồng thuận quy kết của các nhà cung cấp, chứ không phải điều mà một tài liệu sơ cấp được trích dẫn chứng minh về một cá nhân hay nhóm được nêu tên.

Ba điều mà không nguồn được trích dẫn nào chứng minh, và bài viết này không lấp đầy. Thứ nhất, cách tài khoản người bảo trì bị chiếm quyền: Zscaler nói rõ rằng cơ chế chính xác chưa được biết tại thời điểm phân tích của họ. Thứ hai, một tổng số cuối cùng duy nhất: các con số 400, 868 và 1,300 đếm số gói, số cặp gói-và-phiên bản và số phiên bản ở những thời điểm khác nhau, và không nguồn nào khẳng định chiến dịch đã kết thúc. Thứ ba, và quan trọng nhất đối với tuyên bố cụ thể về AI trong bản ghi này, không có nguồn được trích dẫn nào báo cáo một trường hợp đã được xác nhận về thông tin xác thực bị đánh cắp của Anthropic, Codex, Cursor, Gemini hoặc OpenAI bị phát lại đối với tài khoản của một nhà cung cấp. Những gì được ghi nhận là ý định và năng lực — một danh sách mục tiêu rõ ràng, và một bộ thu thập được xây dựng để tiếp cận danh sách đó — chứ không phải một vụ xâm nhập hạ nguồn đã được chứng minh vào hệ thống của một nhà cung cấp AI.

Điều gì đã thay đổi sau đó — và người ứng phó phải làm gì

Biện pháp khắc phục cụ thể nhất trong hồ sơ là một thay đổi nền tảng. Elastic khuyến nghị nâng cấp lên npm 12 trở lên, phiên bản này chặn các hook preinstall theo mặc định; hướng dẫn của Microsoft cũng độc lập khuyến nghị npm CLI v12 và tính năng min-release-age, tính năng này giữ các phiên bản mới lại đủ lâu để cộng đồng có thể phát hiện một sự xâm phạm trước khi nó đến được bản dựng.

Ngoài ra, các bước phản hồi mà các nguồn công bố có sự trùng lặp đáng kể.

• Elastic: thu hồi toàn bộ token GitHub, bao gồm cả token phiên trên các máy bị ảnh hưởng; thu hồi và tạo lại token npm, đặc biệt là token tự động hóa có quyền ghi và bỏ qua xác thực hai yếu tố; tìm kiếm trong các kho lưu trữ những commit trái phép có thông điệp chore: update config from claude@users.noreply.github.com; xoay vòng bí mật của cloud, Kubernetes, Vault, công cụ AI và CI/CD; bật xác thực hai yếu tố trên các tài khoản npm.

• Microsoft: xóa bộ nhớ đệm (cache) npm và yarn trên các endpoint bị ảnh hưởng và các máy chủ build, ghim (pin) các phiên bản đã biết là tốt, rà soát lockfile và các artefact để tìm những phiên bản bị xâm nhập, kể cả các tham chiếu bắc cầu (transitive), xây dựng lại các image gốc dùng chung và các golden build runner, đồng thời rà soát phạm vi token, phê duyệt workflow và nguồn gốc bản phát hành (release provenance) vì sự cố này khớp với hành vi lạm dụng pipeline CI/CD thông qua việc xuất bản qua OIDC.

• CSA Singapore: xóa các phiên bản bị ảnh hưởng khỏi môi trường phát triển, build và CI/CD; coi các hệ thống bị ảnh hưởng là đã bị xâm phạm và xây dựng lại chúng; luân chuyển thông tin xác thực; rà soát môi trường đám mây và mã nguồn để tìm truy cập trái phép; giám sát các chỉ dấu đã được công bố; và tăng cường kiểm soát danh sách cho phép, xác minh tính toàn vẹn và nguồn gốc.

• Zscaler: coi .claude/, .cursor/, .vscode/ và .gemini/ là mã thực thi, đồng thời ngừng coi chứng thực nguồn gốc SLSA hoặc Sigstore là bằng chứng an toàn — thay vào đó, kết hợp nó với việc phát hiện bất thường về hành vi phát hành, chẳng hạn như phát hành ngoài giờ, phát hành hàng loạt phiên bản và người phát hành lần đầu.

Hồ sơ không chứa kết quả khắc phục. Không có nguồn được trích dẫn nào báo cáo rằng các phiên bản độc hại đã được xóa hoàn toàn, tài khoản đã được khôi phục, có một vụ bắt giữ hoặc một hành động thực thi của cơ quan quản lý; khuyến cáo của CSA là thông báo dành cho lực lượng phòng thủ, không phải kết luận chống lại một bên.

Điều mà sự cố này thay đổi là cách phân loại. Một tệp cấu hình của công cụ dành cho nhà phát triển là một đường thực thi, và việc trình soạn thảo mở một thư mục là một sự kiện thực thi. Và chứng thực nguồn gốc là một tuyên bố về việc pipeline nào đã tạo ra một gói — không phải về việc ai đang giữ các khóa khi pipeline đó chạy, mà đó chính xác là lỗ hổng mà bản phát hành keyv đầu tiên đã rơi vào.