Bạn bảo agent sửa các lỗi. Một trong số đó do kẻ tấn công viết ra.
Một báo cáo lỗi Sentry giả mạo có thể lừa agent lập trình AI chạy mã của kẻ tấn công với toàn quyền của nhà phát triển, 85% số lần. Mối nguy thực sự không nằm ở đoạn mã được cài cắm; mà ở các thông tin xác thực đang sẵn có mà một agent bị chiếm quyền có thể chạm tới.
Một nhà phát triển mở agent lập trình AI và gõ yêu cầu bình thường nhất trên đời: "nhìn qua các lỗi Sentry chưa xử lý và sửa chúng nhé". Agent kéo danh sách lỗi về qua Sentry connector của nó, đọc issue đầu tiên, làm theo các bước khắc phục được ghi ngay trong báo cáo, và chạy các bước đó. Nửa phút sau, nó đã thực thi mã của kẻ tấn công trên máy của nhà phát triển, với toàn quyền của người đó, và không ai làm sai điều gì.
Đó là Agentjacking, được Tenet Security công bố trong tháng này, và chiêu thức này thành công 85% số lần với ba agent lập trình phổ biến nhất trên thị trường: Claude Code, Cursor và Codex [1][2].
Chuyện gì thực sự đã xảy ra
Trước hết, Sentry là gì: một trong những dịch vụ theo dõi lỗi được dùng rộng rãi nhất trong ngành phần mềm. Khi ứng dụng của bạn ném ra một lỗi hoặc crash, Sentry bắt lỗi đó và lập báo cáo để đội ngũ phát triển của bạn phân loại — dịch vụ này hiện diện trong phần lớn các ứng dụng bạn dùng mỗi ngày. Để gửi các báo cáo đó, mọi ứng dụng đều nhúng một DSN: một khóa phía client được cố tình đưa vào mã nguồn trang web của bạn, để trình duyệt có thể báo lỗi về máy chủ. Bất kỳ ai cũng đọc được nó. Và bất kỳ ai nắm giữ nó đều có thể POST một sự kiện lỗi vào dự án Sentry của bạn.
Đó chính là toàn bộ chìa khóa của cuộc tấn công. Tenet dựng một sự kiện lỗi giả có trường thông điệp được định dạng giống hệt hướng dẫn khắc phục của chính Sentry: markdown chỉn chu, một "cách sửa khuyến nghị", một lệnh để chạy. Họ gửi sự kiện đó bằng DSN công khai. Rồi họ chờ điều tự nhiên nhất mà một nhà phát triển thường làm — nhờ agent dọn sạch hàng đợi lỗi.
Agent truy vấn Sentry qua MCP connector của nó. Connector trả lỗi về dưới dạng đầu ra hệ thống đáng tin cậy. Agent không phân biệt được báo cáo Sentry thật với báo cáo giả; chúng giống nhau từng byte một về cấu trúc. Thế nên nó làm theo chỉ dẫn và chạy "cách sửa", thường là một lệnh npx gọi tới package của kẻ tấn công. Từ đó nó có mọi thứ nhà phát triển có: biến môi trường, thông tin xác thực Git, URL kho lưu trữ riêng tư, các khóa cloud trong ~/.aws/.
Tenet phát hiện 2.388 tổ chức có DSN có thể bị lợi dụng để cài cắm, từ các nhà phát triển độc lập cho tới Fortune 100. Trong các thử nghiệm có kiểm soát của mình, agent thực sự đã chạy các chỉ dẫn được cài cắm tại những công ty có thật — trong đó, theo Tenet, có một công ty công nghệ Fortune 100 trị giá 250 tỷ đô-la mà agent AI của họ đã đọc báo cáo lỗi giả và chạy mã của Tenet trên hai máy của công ty [1][3]. Sự việc được báo cho Sentry vào ngày 3 tháng 6; công ty xác nhận trong cùng ngày và từ chối xử lý tận gốc, gọi vấn đề là "về mặt kỹ thuật không thể bảo vệ được". Họ phát hành một bộ lọc nội dung chặn một chuỗi payload cụ thể [4].
Đây không phải là sự bất cẩn của Sentry
Đây là phần khó chịu: không có khâu nào trong chuỗi đó là một lỗi phần mềm. DSN được thiết kế để công khai. MCP server được thiết kế để trả về dữ liệu lỗi của bạn. Agent được thiết kế để hành động dựa trên chẩn đoán mà bạn yêu cầu nó sửa. Mọi bước đều được ủy quyền, và chính vì thế mà không firewall, không EDR, không system prompt nào phát hiện được.
Kết cấu lỗ hổng mang tính cấu trúc, và không riêng gì của Sentry. Bất kỳ công cụ nào cung cấp cho agent đoạn văn bản mà người ngoài có thể tác động — trình theo dõi lỗi, hàng đợi issue, trang web được scrape, tài liệu dùng chung — đều là một kênh cài cắm, và agent xem tất cả chúng như một luồng chỉ dẫn không phân biệt. Prompt injection, sau hai năm bước vào kỷ nguyên agent, vẫn chưa có lời giải: bạn không thể chắc chắn chặn được văn bản độc hại khỏi quá trình suy luận của mô hình. Hãy giả định rằng bạn sẽ không làm được.
Đoạn mã cài cắm không phải là thảm họa
Đây là phần đáng để ngẫm. Agentjacking trở thành báo động đỏ không phải vì agent bị lừa, mà vì điều mà agent bị lừa có thể chạm tới. Nó chạy với toàn bộ quyền truy cập sẵn có của nhà phát triển: mọi khóa trong môi trường, mọi tệp thông tin xác thực trên đĩa, cả bộ keyring chỉ cách một lệnh.
Bán kính tác động đó không phải là một quy luật tự nhiên. Đó là một cấu hình. Agent có quyền truy cập sẵn có vào tất cả vì đó là cách thông tin xác thực được lưu trữ hiện nay — tràn lan, nằm ngay trên máy, đọc được bởi bất kỳ tiến trình nào chạy ở đó. Bỏ điều đó đi, và chính cuộc chiếm quyền ấy sẽ đâm vào tường.
Được xây dựng cho tình huống này, một cách có chủ đích
Thông tin xác thực Clavitor không bao giờ nằm trong môi trường nơi agent chạy. Không có tệp ~/.aws/credentials để đọc, không có API key trong biến môi trường để đánh cắp, vì giá trị bí mật không bao giờ nằm ở nơi mã được thực thi — agent nhận được kết quả của việc dùng thông tin xác thực, chứ không phải bản thân thông tin xác thực. Nó chỉ chạm được đúng thứ mà thông tin xác thực được đặt tên để dùng, nên không thể liệt kê kho lưu trữ để tìm xem còn gì khác ở đó. Và quyền cấp có phạm vi rõ ràng và có thể thu hồi, nên một phiên bắt đầu hành xử như kẻ tấn công có thể bị cắt ngay giữa chừng.
Nói thẳng giới hạn: điều này không chặn được đoạn mã cài cắm, cũng không chặn agent bị chiếm quyền chạy một lệnh nào đó. Prompt injection chưa có lời giải và chúng tôi không tuyên bố giải quyết được nó. Thứ thay đổi là phần thưởng dành cho kẻ tấn công. Mã của kẻ tấn công vẫn chạy — và thấy một môi trường không còn gì sẵn có đáng để đánh cắp. Cuộc chiếm quyền thành công, còn vụ trộm thất bại.
Chúng tôi đã ghi lại những nguyên tắc mà một hệ thống thông tin xác thực phải tuân thủ khi chính agent có thể bị quay lại chống bạn, bắt đầu với việc bí mật không bao giờ sống ở nơi mã chạy, và agent chỉ chạm được đúng thứ nó được đặt tên. Đối chiếu hệ thống của bạn với các nguyên tắc đó: clavitor.ai/rules.
Bài học không phải là "vá Sentry"
Sentry không thể sửa được vấn đề này, và họ đã nói như vậy. Và công cụ bị đầu độc tiếp theo sẽ không phải là Sentry. Miễn là agent của bạn mang theo thông tin xác thực sẵn có, tràn lan, thì mọi công cụ đáng tin mà chúng đọc đều là một khẩu súng đã lên đòn, và prompt injection là cò súng mà bạn không thể khóa lại.
Bạn sẽ không chặn được văn bản độc hại tràn vào. Vậy thì hãy ngừng để thông tin xác thực trong tầm với của agent đọc chúng.
Clavitor (@clavitorai) là kho thông tin xác thực được xây dựng cho agent AI, và để đề phòng chính chúng. clavitor.ai
Nguồn tham khảo
[1] Tenet Security — "Agentjacking: hijacking coding agents with fake Sentry errors" (tỷ lệ thành công 85%; 2.388 tổ chức; cơ chế): https://tenetsecurity.ai/blog/agentjacking-coding-agents-with-fake-sentry-errors/
[2] The Hacker News — "Agentjacking Attack Tricks AI Coding Agents Into Running Malicious Code": https://thehackernews.com/2026/06/agentjacking-attack-tricks-ai-coding.html
[3] The New Stack — "A public Sentry key is all it takes to hijack Claude Code, Cursor, and Codex": https://thenewstack.io/agentjacking-sentry-mcp-attack/
[4] Infosecurity Magazine — "New 'Agentjacking' Attacks Could Hijack AI Coding Agents" (phản hồi của Sentry): https://www.infosecurity-magazine.com/news/agentjacking-attacks-hijack-ai/