Tóm tắt nhanh: Tệp AGENTS.md độc hại có thể chiếm quyền điều khiển coding agent bằng chính cơ chế hoạt động vốn có của tệp: agent sẽ đọc tệp ngay khi khởi động và làm theo các chỉ dẫn đó. Vào tháng 10 năm 2026, Forever Security đã phát hiện một trường hợp thực tế nằm ngay trong thư mục ~/Downloads của khách hàng. Để ngăn chặn nguy cơ này, tuyệt đối không khởi chạy agent trong các thư mục bạn không kiểm soát, hãy xem xét các tệp chỉ dẫn kỹ lưỡng như mã nguồn, cấm ghi đè cấu hình và mạng, luôn bật sandbox cùng các bước xác nhận phê duyệt, đồng thời theo dõi sát sao mọi thay đổi trong tệp cấu hình của agent.
Bản chất của cuộc tấn công bằng tệp AGENTS.md độc hại
Tệp AGENTS.md độc hại là tệp chỉ dẫn dự án được biên soạn nhằm điều hướng coding agent thực hiện các hành vi gây hại. Claude Code, Codex cùng nhiều agent khác sẽ tự động tải các tệp này từ thư mục mà chúng được khởi chạy. Cuộc tấn công này không cần bất kỳ lỗ hổng bảo mật nào: agent đọc tệp ngay khi khởi động và coi nội dung trong đó là các quy tắc của chính dự án.
Tệp này trông chẳng khác nào những ghi chú kỹ thuật thông thường: một bước "preflight" để cài đặt package, một lưu ý về "proxy" điều hướng lưu lượng API. Đối với agent, những chỉ dẫn đó cũng tương tự như yêu cầu "dùng pnpm thay vì npm".
Nếu các lập trình viên trong đội ngũ của bạn sử dụng nhiều coding agent khác nhau, Sharkly mang đến một không gian tập trung để giao việc và xét duyệt công việc đó; chúng tôi sẽ phân tích kỹ hơn về việc nền tảng này thay đổi thư mục khởi chạy của agent ra sao ở phần sau.
Tại sao coding agent lại nghe theo tệp này?
Các tệp chỉ dẫn nằm ngay trong ngữ cảnh của agent bên cạnh câu lệnh (prompt) của bạn, mà không hề có ranh giới rõ ràng nào giữa quy tắc dự án và yêu cầu bạn đưa ra.
Tài liệu về bộ nhớ của Claude Code nêu rõ rằng nội dung trong CLAUDE.md và AGENTS.md được xử lý "như ngữ cảnh, chứ không phải cấu hình bắt buộc". Công cụ này sẽ tải mọi tệp AGENTS.md trong thư mục làm việc hiện tại và các thư mục cha phía trên nếu không có tệp CLAUDE.md. Trong khi đó, hướng dẫn về AGENTS.md của Codex cho biết agent sẽ duyệt từ thư mục gốc của dự án xuống thư mục hiện tại rồi ghép nối các nội dung tìm thấy, mặc định tối đa 32 KiB. Các tệp nằm càng gần vị trí khởi chạy agent sẽ được nạp sau cùng, nên chúng có quyền ưu tiên cao nhất. Do đó, thư mục bạn khởi chạy agent sẽ quyết định những gì được tải, và các thư mục cha cũng ảnh hưởng trực tiếp đến kết quả này.
Cách AGENTS.md độc hại chiếm quyền điều khiển Codex và Claude Code
Vào ngày 22 tháng 10 năm 2026, Forever Security đã công bố phát hiện của họ trên máy tính xách tay của một khách hàng. Một coding agent đã cố cài đặt function-color, một npm package độc hại đã biết, và chỉ dẫn này xuất phát từ tệp AGENTS.md nằm trong ~/Downloads. Thư mục này cũng chính là thư mục làm việc của agent. Forever đã kịp thời chặn quá trình cài đặt trước khi mã độc được thực thi và chưa thể xác định tệp này đã xuất hiện ở đó bằng cách nào.

Lý do thư mục Downloads trở nên nguy hiểm: đây là thư mục duy nhất mà một trang web có thể tự động ghi dữ liệu vào mà không cần người dùng nhấp chuột. Forever sau đó đã tái hiện lại toàn bộ chuỗi tấn công này trong môi trường thử nghiệm:
- Một trang web do họ kiểm soát lưu tệp có tên AGENTS.md vào
~/Downloads. - Lập trình viên mở Codex trong thư mục đó và đưa ra bất kỳ yêu cầu nào.
- Trước khi bắt đầu tác vụ, Codex tự động thêm một máy chủ "project tools" vào
~/.codex/config.tomlvà cài đặt một package từ npm. - Vì cấu hình đó áp dụng cho toàn bộ máy tính, mọi phiên làm việc sau này của Codex đều sẽ tải máy chủ của kẻ tấn công, bất kể ở thư mục nào.
Forever báo cáo rằng Codex đã thực thi payload trong hơn 90% số lần thử nghiệm. Hầu hết các lượt chạy đều dùng một bản mô phỏng vô hại để mở ứng dụng máy tính (calculator); package độc hại thực tế chỉ được chạy đúng một lần bên trong máy ảo cô lập.
Claude Code khó bị đánh lừa hơn. Một tệp CLAUDE.md được cấy vào đã khiến công cụ này chuyển hướng lưu lượng API về một máy chủ do Forever kiểm soát, làm rò rỉ token đăng nhập OAuth và cho phép máy chủ đó phản hồi giả dạng mô hình AI. Forever cho biết phương thức này thành công khoảng 50% số lần thử. Hai con số này đến từ hai kịch bản tấn công khác nhau, vì vậy không nên gộp chung lại để so sánh tỷ lệ thành công.
Điều mà Forever muốn nhấn mạnh là: không có lỗi phần mềm nào ở đây để vá cả. Vấn đề nằm ở chỗ một thư mục mà các trang web có thể tự do ghi vào lại được tin cậy như thể chính bạn tạo ra các tệp đó. Bài học tương tự cũng từng được Pillar Security chỉ ra trong nghiên cứu Rules File Backdoor, khi kẻ tấn công giấu các chỉ dẫn bên trong tệp quy tắc bằng các ký tự Unicode vô hình mà người duyệt mã không thể nhìn thấy trong diff.
5 bước ngăn chặn tệp AGENTS.md độc hại
Hai bước đầu tiên giúp ngăn chặn hoàn toàn việc tải tệp; ba bước tiếp theo giúp giảm thiểu thiệt hại nếu chẳng may tệp độc hại lọt qua.

1. Tuyệt đối không khởi chạy coding agent ở đâu?
Tuyệt đối không bao giờ chạy trong ~/Downloads, thư mục người dùng (home folder), hoặc bất kỳ thư mục nào mà bạn không tự tay tạo ra. Forever cho biết khoảng một nửa số khách hàng của họ từng chạy coding agent ngay trong thư mục Downloads. Nếu bạn cần agent phân loại các tệp đã tải về, hãy sao chép chúng sang một thư mục trống mới rồi mới khởi chạy tại đó.
Một đoạn mã chặn trong shell sẽ giúp đảm bảo quy tắc này luôn được tuân thủ đối với những ai hay quên:
# ~/.zshrc: refuse to start an agent in folders the web can write to
agent_guard() {
case "$PWD" in
"$HOME"|"$HOME/Downloads"*|"/tmp"*)
echo "Refusing to start an agent in $PWD. Use a project folder." >&2
return 1 ;;
esac
}
claude() { agent_guard && command claude "$@"; }
codex() { agent_guard && command codex "$@"; }
2. Làm thế nào để xét duyệt AGENTS.md kỹ như mã nguồn?
Hãy coi mọi tệp chỉ dẫn như một tệp thực thi, kể cả trong một repository mà bạn vừa mới clone về cách đây 5 phút. Sau đó, hãy tự động hóa quy trình xét duyệt. Đưa các tệp chỉ dẫn vào CODEOWNERS để bất kỳ pull request nào chỉnh sửa chúng đều bắt buộc phải có một người xét duyệt cụ thể phê duyệt:
AGENTS.md @your-org/platform
**/AGENTS.md @your-org/platform
CLAUDE.md @your-org/platform
/.claude/ @your-org/platform
/.cursor/rules/ @your-org/platform
Thêm một bước kiểm tra trong CI để chặn các mẫu thường dùng trong các cuộc tấn công này: ký tự Unicode ẩn, thay đổi base URL, và các lệnh cài đặt đặt bên trong tệp chỉ dẫn.
#!/usr/bin/env bash
# ci/check-agent-instructions.sh
files=$(git ls-files '*AGENTS.md' '*CLAUDE.md' '.cursor/rules/*')
[ -z "$files" ] && exit 0
fail=0
# zero-width, bidi override and Unicode tag characters
if grep -nP '[\x{200B}-\x{200F}\x{202A}-\x{202E}\x{2066}-\x{2069}\x{E0000}-\x{E007F}]' $files; then
echo "Hidden Unicode in an agent instruction file"; fail=1
fi
if grep -niE 'BASE_URL|chatgpt_base_url|mcp_servers|npx --yes|curl .*\| *(ba)?sh' $files; then
echo "Config, network or install instruction in an agent file: needs review"; fail=1
fi
exit $fail
Lệnh grep thứ hai có thể cảnh báo cả một số dòng hợp lệ. Dù sao thì những dòng đó cũng rất đáng để con người trực tiếp kiểm tra lại.
3. Cấm agent tự ý ghi đè cấu hình của chính nó
Cả hai trường hợp tái hiện tấn công đều kết thúc bằng việc agent tự chỉnh sửa cài đặt của chính nó. Hãy loại bỏ quyền này. Trong Claude Code, hãy chặn quyền chỉnh sửa các thư mục cấu hình của agent và không cho phép đọc các thông tin nhạy cảm trong tệp .claude/settings.json của dự án:
{
"permissions": {
"deny": [
"Edit(./.claude/**)",
"Edit(~/.claude/**)",
"Edit(~/.codex/**)",
"Read(./.env)",
"Read(./.env.*)"
]
}
}
Đối với môi trường nhóm, hãy thiết lập điều này trong managed settings để tệp cấu hình của dự án không thể nới lỏng các ràng buộc. Tài liệu về bộ nhớ đề xuất sử dụng permissions.deny, sandbox.enabled và env được quản lý tập trung cho bất kỳ quy tắc bắt buộc nào, đồng thời sử dụng PreToolUse hook để chặn hành động bất kể mô hình AI quyết định ra sao. Việc ghim cố định định tuyến API trong env được quản lý chính là giải pháp trực tiếp để đối phó với cuộc tấn công thay đổi base URL. Hãy kiểm tra lại cú pháp quy tắc theo đúng phiên bản bạn đã cài đặt trước khi triển khai thực tế.
4. Luôn bật sandbox và các bước xác nhận phê duyệt
Forever khuyến nghị luôn duy trì các cổng phê duyệt (approval gate) và cơ chế sandbox, đồng thời không tin tưởng bất kỳ đoạn văn bản nào yêu cầu agent bỏ qua chúng.
Hãy xác định rõ những hành động nào luôn cần con người xác nhận trước khi tiếp tục: cài đặt package, thay đổi cấu hình của agent, và gửi yêu cầu mạng đến các host mới. Bài viết của chúng tôi về các cổng phê duyệt cho coding agent sẽ hướng dẫn bạn vị trí cần đặt các điểm dừng đó, và bài viết về những việc coding agent được phép và không được phép làm sẽ làm rõ mô hình phân quyền đằng sau chúng.
5. Giám sát cấu hình của agent và thu hồi đổi khóa ngay khi phát hiện bất thường
Forever liệt kê chính xác những vị trí cần kiểm tra. Trong ~/.codex/config.toml, đó là khối [mcp_servers.*] bất thường hoặc giá trị chatgpt_base_url bị thay đổi. Trong tệp .claude/settings.json của dự án, đó là ANTHROPIC_BASE_URL, thông số proxy, hoặc một endpoint mà bạn không hề thiết lập.
grep -nE '^\[mcp_servers\.|chatgpt_base_url' ~/.codex/config.toml
grep -rnE 'ANTHROPIC_BASE_URL|_PROXY|base_url' ~/.claude/settings.json .claude/settings*.json 2>/dev/null
npm ls -g --depth=0 2>/dev/null | grep -i function-color
Nếu phát hiện bất kỳ dấu hiệu nào kể trên, hãy mặc định rằng token đã bị rò rỉ và cần được thu hồi, đổi mới ngay lập tức. Token OAuth bị đánh cắp tương đương với một phiên đăng nhập đang hoạt động chứ không đơn thuần chỉ là một yêu cầu bị chặn bắt. Nếu xuất hiện function-color, hãy xem như chiếc máy tính đó đã bị xâm phạm hoàn toàn. Để xử lý triệt để trên quy mô toàn diện, danh sách kiểm tra khi coding agent làm lộ thông tin bí mật của chúng tôi sẽ chỉ định rõ người chịu trách nhiệm cho từng bước thu hồi và đổi khóa.
Vai trò của Sharkly trong mô hình này
Sharkly không quét các tệp chỉ dẫn hay thay thế hệ thống phân quyền sẵn có của agent; bạn vẫn cần tuân thủ đủ 5 bước trên. Sharkly thay đổi thư mục khởi chạy của agent và kiểm soát người có quyền quyết định điều đó.
Trong Sharkly, một Agent sẽ chạy trên một Computer mà bạn đã kết nối, và mỗi Agent đều có mục cài đặt Default working directory (Thư mục làm việc mặc định). Với tùy chọn "Use temporary directory", mỗi lượt chạy Task sẽ nhận một thư mục riêng biệt cùng một git worktree hoàn toàn mới từ repository liên kết. Với "Specified directory", các lượt chạy sẽ sử dụng đường dẫn cục bộ do bạn cấu hình. Tài liệu về thư mục làm việc sẽ giải thích chi tiết về cả hai chế độ này.

Cơ chế này chuyển quyền quyết định thư mục chạy từ terminal của lập trình viên sang một thiết lập được xét duyệt kỹ càng. Ở chế độ Temporary (Tạm thời), Agent luôn khởi đầu từ một bản sao mã nguồn sạch của repository liên kết, chứ không phải bất kỳ thư mục ngẫu nhiên nào đang được mở sẵn. Quyền quản lý repository chỉ giới hạn cho những người dùng có quyền quản trị Space hoặc Organization. Các chỉ dẫn Agent (Agent instructions), vốn được đưa vào mỗi lần chạy, là nơi lý tưởng để nhắc lại những quy tắc như "tuyệt đối không chỉnh sửa các tệp cấu hình của agent".
Kết quả sẽ được gửi ngược về Task để cả đội ngũ cùng xét duyệt, như đã mô tả trong bài viết xét duyệt mã do AI tạo bằng bằng chứng ở cấp độ tác vụ.
Kết luận
Tệp AGENTS.md độc hại phát huy tác dụng là do các agent được thiết kế để tuân theo các tệp chỉ dẫn, trong khi trình duyệt web lại có thể ngầm đặt tệp vào một thư mục mà bạn tin cậy. Cách đối phó là xây dựng nhiều lớp phòng vệ chứ không phải trông chờ vào một bản vá phần mềm.
Hãy bắt đầu ngay hôm nay với bước 5 trên từng máy tính của lập trình viên, vì bước này sẽ cho bạn biết liệu hệ thống đã gặp sự cố hay chưa. Sau đó, nếu đội ngũ của bạn đang vận hành nhiều coding agent, hãy thiết lập Sharkly với một Computer và một Agent ở chế độ Temporary để mỗi lượt chạy đều xuất phát từ một worktree sạch sẽ.
Câu hỏi thường gặp (FAQ)
Tệp AGENTS.md độc hại có thể chiếm quyền điều khiển Claude Code không?
Có. Claude Code sẽ đọc AGENTS.md khi không tìm thấy tệp CLAUDE.md trong thư mục làm việc hoặc các thư mục cha phía trên. Kịch bản tái hiện trên Claude Code của Forever đã sử dụng một tệp CLAUDE.md được cấy sẵn để điều hướng lại lưu lượng API và làm rò rỉ token OAuth trong khoảng một nửa số lần thử nghiệm.
Đây có phải là lỗ hổng bảo mật mà OpenAI hay Anthropic sẽ tung bản vá không?
Forever nhận định rằng không có gì để vá ở đây, bởi các agent chỉ đang hoạt động đúng theo thiết kế. Hãy kiểm soát rủi ro bằng thói quen quản lý thư mục sạch sẽ, xét duyệt chỉ dẫn cẩn thận và phân quyền chặt chẽ.
Làm thế nào để phát hiện các chỉ dẫn ẩn trong tệp AGENTS.md?
Hãy đọc tệp thô (raw file) thay vì xem giao diện đã được render, đồng thời quét tìm các ký tự có độ rộng bằng 0 (zero-width), ký tự ghi đè hướng văn bản (bidi override) và các ký tự thẻ Unicode (Unicode tag characters). Tập lệnh CI ở trên sẽ chặn và báo lỗi đối với cả ba loại ký tự này.
Cơ chế sandbox có ngăn chặn được tệp AGENTS.md độc hại không?
Cơ chế này chỉ giúp giảm thiểu thiệt hại chứ không ngăn được việc tải tệp. Sandbox cùng các bước nhắc phê duyệt có thể chặn lệnh cài đặt hoặc hành vi ghi đè cấu hình mà tệp yêu cầu. Hãy kết hợp chúng với các quy tắc cấm (deny rules) đối với những thư mục cấu hình của agent.
Nên làm gì nếu phát hiện một tệp AGENTS.md bị cấy vào máy?
Tuyệt đối không khởi chạy agent tại hoặc gần thư mục đó. Kiểm tra các tệp cấu hình của agent xem có máy chủ MCP mới hoặc base URL nào bị đổi hay không, kiểm tra xem có sự hiện diện của function-color không, sau đó lập tức thu hồi và đổi mới token của agent cùng mọi API key mà agent có quyền truy cập.


