Hacker không cần jailbreak AI: Plugin4Shell cho thấy chỉ cần chiếm một plugin, coding agent có thể tự kéo malware về máy
Plugin4Shell không tấn công mô hình AI mà đánh vào chuỗi cung ứng plugin: coding agent tin rằng nó đang cài đúng commit đã được duyệt, nhưng có thể nhận mã khác từ repository bị kiểm soát. Với cơ chế tự cập nhật, mã độc có thể được kéo xuống mà người dùng không cần cài lại plugin.
Muốn chiếm một coding agent, kẻ tấn công không nhất thiết phải jailbreak mô hình, chèn prompt độc hay thuyết phục AI tự chạy một lệnh nguy hiểm. Nghiên cứu mới mang tên Plugin4Shell chỉ ra một con đường đơn giản hơn: chiếm quyền kiểm soát repository đứng sau một plugin mà người dùng đã tin tưởng, rồi lợi dụng cách coding agent kiểm tra phiên bản để đưa mã khác xuống máy.
AIR Security công bố Plugin4Shell ngày 17/9/2026 sau khi cho biết đã dựng được proof-of-concept trên Claude Code, OpenAI Codex, GitHub Copilot và Gemini CLI. Điểm đáng chú ý là lỗ hổng nằm ở lớp phân phối plugin, không phải ở khả năng suy luận của mô hình AI. Theo báo cáo của AIR Security, các agent có thể yêu cầu đúng commit đã được marketplace ghim bằng SHA nhưng không kiểm tra lại rằng mã cuối cùng trên đĩa thực sự thuộc commit đó.
SHA pinning đáng lẽ phải khóa plugin vào đúng một phiên bản
Marketplace plugin thường phải giải một bài toán chuỗi cung ứng quen thuộc: tác giả có thể cập nhật repository sau khi plugin đã được duyệt. Một cách giảm rủi ro là pin plugin vào một commit SHA cụ thể. Commit hash đại diện cho một snapshot xác định của mã nguồn; về nguyên tắc, marketplace có thể duyệt snapshot đó rồi yêu cầu client chỉ cài đúng phiên bản đã duyệt.
Plugin4Shell cho thấy phần “chỉ cài đúng phiên bản” đã không được thực thi đến cùng. Theo AIR, Claude Code, Codex và Copilot dùng Git để lấy repository rồi chuyển sang revision được ghim, nhưng không xác minh trạng thái cuối cùng của working tree có đúng với commit SHA hay không. Vì Git có thể gặp trường hợp tên tham chiếu và object ID gây nhập nhằng, một repository do kẻ tấn công kiểm soát có thể khiến client nhận mã khác trong khi quy trình cài đặt vẫn trông như đã tuân theo pin.
Gemini CLI có một biến thể khác về cách tham chiếu Git được phân giải, nhưng lỗi logic vẫn giống nhau: hệ thống kiểm tra rằng nó đã yêu cầu revision đúng, chứ không xác minh kết quả cuối cùng có đúng revision đó.
Không cần chiếm marketplace, chỉ cần chiếm nguồn của plugin
Điều kiện khai thác quan trọng là kẻ tấn công phải kiểm soát repository của plugin. Điều đó có thể xảy ra theo hai hướng: tự đưa một plugin lành tính vào marketplace rồi đổi hành vi về sau, hoặc chiếm repository của một plugin hợp pháp đã có người dùng. Plugin4Shell không tự tạo ra quyền kiểm soát repository; nó làm hỏng lớp bảo vệ vốn được kỳ vọng sẽ hạn chế hậu quả nếu repository upstream bị chiếm.
Đây là khác biệt quan trọng so với prompt injection. Mô hình không cần bị “thuyết phục” làm điều sai. Client cài plugin mới là thành phần lấy code, giải nén hoặc checkout code và kích hoạt các thành phần của plugin. Nếu code bị thay thế bằng phiên bản độc hại, bước thực thi xảy ra ở lớp phần mềm bao quanh mô hình.
Ảnh hưởng thực tế phụ thuộc vào quyền mà agent và plugin đang có trên máy. Một coding agent thường được phép đọc project, sửa file, gọi tool, chạy shell hoặc truy cập các dịch vụ mà developer đã đăng nhập. Vì vậy, mã độc chạy trong ngữ cảnh đó có thể nhắm tới source code, token, SSH key, biến môi trường hoặc các hệ thống nội bộ mà tài khoản hiện tại được phép truy cập. Mức độ thiệt hại không giống nhau trên mọi máy, đặc biệt nếu agent chạy trong sandbox hoặc bị giới hạn quyền.
Vì sao có thể trở thành “zero-click”?
Phần nguy hiểm nhất không nằm ở lần cài plugin đầu tiên mà ở cập nhật nền. AIR cho biết Claude Code và Codex bật cơ chế tự cập nhật plugin trong các trường hợp liên quan, nên một plugin đã được cài từ trước có thể nhận phiên bản bị tráo mà người dùng không cần nhấn cài lại hay phê duyệt thêm. Đó là lý do nhóm nghiên cứu mô tả chuỗi này như một đường dẫn zero-click remote code execution.
Tuy vậy, phạm vi “zero-click” cần được hiểu chính xác. The Hacker News lưu ý rằng auto-update không có cùng cấu hình ở mọi agent và mọi marketplace. Báo này cũng xác nhận biến thể dựa trên tên branch dạng SHA không hoạt động trên GitHub, vì GitHub chặn kiểu tên đó; rủi ro nằm rõ hơn ở các host như Bitbucket hoặc Git server tự vận hành. Các marketplace mặc định mà họ kiểm tra chủ yếu trỏ về GitHub.
Điều này không làm mất ý nghĩa của lỗ hổng, nhưng nó cho thấy Plugin4Shell không đồng nghĩa với việc mọi plugin trên mọi coding agent đều có thể bị thay thế ngay lập tức. Muốn khai thác thành công vẫn cần đúng chuỗi điều kiện: kiểm soát upstream repository, backend Git cho phép kiểu nhập nhằng tương ứng và client chưa có bản vá hoặc cơ chế xác minh kết quả cuối cùng.
Claude Code và Codex đã vá, Copilot và Gemini CLI phức tạp hơn
AIR cho biết Anthropic đã khắc phục lỗi trong Claude Code 2.1.179, còn OpenAI sửa ở Codex 0.146.0. The Hacker News cho biết bản sửa công khai của OpenAI mô tả chính vấn đề Git có thể diễn giải một SHA được yêu cầu như tên branch và vì thế materialize một commit khác với commit được pin.
Với GitHub Copilot, AIR nói chưa có bản vá client tại thời điểm công bố. GitHub hiện có tài liệu cho Copilot CLI mô tả plugin marketplace và hỗ trợ pin nguồn bằng SHA, nhưng người dùng vẫn nên kiểm tra release note và phiên bản client thực tế thay vì giả định rằng marketplace tự giải quyết được lỗ hổng này.
Trường hợp Gemini CLI còn rắc rối hơn. Google đã công bố quá trình chuyển người dùng cá nhân từ Gemini CLI sang Antigravity CLI; tài khoản enterprise dùng Gemini Code Assist vẫn có lộ trình riêng. AIR nói Gemini CLI sẽ không nhận bản sửa cho Plugin4Shell và khuyến nghị chuyển sang Antigravity. Tuy nhiên, với môi trường enterprise còn tiếp tục dùng Gemini CLI, trạng thái vá cụ thể nên được xác nhận trực tiếp từ Google thay vì suy ra từ thông báo deprecate dành cho người dùng cá nhân.
Đây là bài toán chuỗi cung ứng phần mềm, không phải “AI mất kiểm soát”
Plugin4Shell đáng chú ý vì nó kéo coding agent trở lại một vấn đề rất cũ của phần mềm: code được duyệt có phải code thực sự chạy hay không. SHA pinning chỉ có giá trị khi client xác minh kết quả checkout cuối cùng khớp với SHA đã pin. Nếu bỏ qua bước đó, cơ chế bảo vệ có thể tồn tại trên giấy nhưng không đảm bảo tính toàn vẹn của mã trên máy.
Nó cũng cho thấy ranh giới an ninh của coding agent không dừng ở model. Plugin, skill, hook, MCP server, package manager, Git client và cơ chế auto-update đều có thể trở thành một phần của attack surface. Một hệ thống có model được căn chỉnh tốt vẫn có thể bị xâm nhập nếu lớp phân phối phần mềm phía dưới tin sai một nguồn code.
Đến ngày 18/9, The Hacker News cho biết Plugin4Shell chưa có CVE công khai và chưa thấy dấu hiệu đã bị khai thác trong thực tế. Vì vậy, đây hiện là một vulnerability được chứng minh bằng PoC và coordinated disclosure, không phải bằng chứng cho thấy một chiến dịch malware đang diễn ra trên diện rộng.
Việc cần làm trước mắt khá cụ thể: cập nhật Claude Code lên 2.1.179 hoặc mới hơn, Codex lên 0.146.0 hoặc mới hơn; kiểm kê plugin đang cài và nguồn repository của chúng; hạn chế auto-update hoặc plugin từ Git host không kiểm soát nếu client chưa có bản sửa; và chạy agent trong môi trường có quyền tối thiểu khi có thể. Quan trọng hơn, các nền tảng plugin cần coi việc xác minh revision sau checkout là một điều kiện bắt buộc, thay vì tin rằng đã “pin SHA” thì chuỗi cung ứng đã an toàn.