5 phút đọc

Một file AGENTS.md trong thư mục Downloads đủ để điều khiển Codex và Claude Code

Forever Security ghi nhận một coding agent suýt cài gói npm độc chỉ vì đọc file AGENTS.md lạ nằm trong ~/Downloads, nơi trang web nào cũng ghi file vào được. Đừng chạy agent ở Downloads, và xem lại file cấu hình của Codex và Claude Code.

Xem nhanh trong 1 phút

Một khách hàng của công ty bảo mật Forever Security mở terminal trong thư mục ~/Downloads, gọi coding agent lên làm việc. Agent đọc một file tên AGENTS.md nằm sẵn ở đó, rồi làm theo hướng dẫn trong file: cài gói npm function-color. Gói này là mã độc. Hệ thống của Forever chặn kịp. Chủ máy không biết file kia từ đâu ra.

Robot linh vật đứng cạnh thư mục Downloads phát sáng, tờ ghi chú nối tia sáng tới hai robot trợ lý nhỏ

Vì sao một file chữ lại nguy hiểm

AGENTS.md và CLAUDE.md là file hướng dẫn mà agent tự đọc khi khởi động trong một thư mục. Bạn viết vào đó quy ước của dự án, lệnh chạy test, chỗ nào đừng đụng. Agent coi đó là lời dặn của chủ nhà.

Thư mục Downloads thì ai cũng ghi vào được. Theo bài phân tích của Forever công bố ngày 22/10, một trang web có thể tự tải file về máy mà bạn không cần bấm gì, và trang web đó chọn luôn tên file lẫn nội dung. Chrome, Edge và Firefox mặc định lưu thẳng vào ~/Downloads, chỉ hiện một thông báo nhỏ. Brave thì hỏi trước.

macOS và Windows có cơ chế chặn file chạy được tải từ mạng về. Nhưng AGENTS.md chỉ là văn bản, không cơ chế nào chặn nó. Nó chỉ trở thành lệnh khi có agent đọc.

Ghép hai điều đó lại: trang web thả file vào Downloads, bạn mở agent ở Downloads, agent làm theo file. Không có lỗ hổng phần mềm nào ở đây cả. Chính nhóm nghiên cứu nói OpenAI và Anthropic không có gì để vá, vì agent làm đúng như thiết kế.

Họ thử lại với Codex và Claude Code

Nhóm nghiên cứu chạy lại payload thật trong máy ảo:

  • Codex đọc AGENTS.md, rồi tự thêm một mục server MCP vào ~/.codex/config.toml. Server đó thực chất là lệnh npm install gói độc. Theo Forever, Codex chạy mã độc trong hơn 90% số lần thử. Đáng lo hơn: file này là cấu hình chung của cả máy, nên từ đó mọi phiên Codex ở thư mục nào cũng nạp server độc, chứ không riêng Downloads.
  • Claude Code được thử bằng một file CLAUDE.md bảo agent đặt ANTHROPIC_BASE_URL trong .claude/settings.json của thư mục trỏ về server của kẻ tấn công. Từ đó mọi request lên API đi qua server lạ, kèm theo token đăng nhập OAuth của bạn. Nhóm nói đã dùng lại token bắt được để gọi API thật, tức là chiếm được tài khoản mà không cần chạy dòng mã nào trên máy. Server giả còn có thể đóng vai mô hình, trả về các lệnh để agent chạy.

Claude Code khó lừa hơn. Nó hỏi người dùng trước khi ghi file kiểu này và hay từ chối khi thấy yêu cầu có vẻ sai. Theo Forever, bước ghi file chỉ qua được khoảng một nửa số lần, và đường chạy mã ngay trong phiên chỉ thành công khoảng một phần năm. Để qua mặt, họ phải viết payload thành một tài liệu kỹ thuật dài và nhạt, vì bản ngắn bị một subagent nhận ra là tấn công.

Một nửa số lần nghe có vẻ ít. Nhưng kẻ tấn công không cần thắng mọi lần, chỉ cần thắng một lần trên máy bạn.

Có ai thật sự chạy agent ở Downloads không

Nhiều hơn mình tưởng. Forever nói khoảng một nửa số khách hàng của họ có chạy coding agent bên trong Downloads. Trả lời BleepingComputer, nhà nghiên cứu Gal Weizman cho biết riêng Claude Code đã có hơn 1.300 phiên mở từ ~/Downloads trên máy khách hàng của họ.

Cũng dễ hiểu. Tải một file zip, một file CSV về, mở terminal ngay đó rồi nhờ AI “xem giúp file này”. Với người làm app bằng AI, đây là thói quen rất bình thường.

Thêm một chi tiết: khoảng một phần tư phiên agent có mở trình duyệt thật. Nghĩa là agent tự lướt web cũng có thể kéo file về Downloads mà không ai nhìn thấy.

Kiểm tra máy của bạn

Đừng mở agent ở Downloads, ở thư mục home, hay ở một thư mục cha chứa nhiều dự án. Tải file về thì chép nó vào thư mục dự án hoặc một thư mục riêng trống, rồi mở agent ở đó. Đây cũng là điều OpenAI và Anthropic khuyên: chạy agent từ đúng thư mục dự án.

Xem Downloads có file hướng dẫn lạ không:

ls -la ~/Downloads | grep -iE 'agents\.md|claude\.md|gemini\.md|\.cursorrules|\.claude|\.codex'

Thấy file mà bạn không tự tạo thì mở ra đọc bằng trình soạn thảo, đừng mở bằng agent, rồi xóa.

Xem cấu hình Codex có server MCP hay địa chỉ API lạ:

grep -nE '^\[mcp_servers|base_url' ~/.codex/config.toml

Mỗi mục [mcp_servers.<tên>] phải là thứ bạn tự thêm. Lạ thì xóa, và để ý có dòng npm, npx hay curl nào không.

Xem Claude Code có bị đổi địa chỉ API không:

find ~ -maxdepth 4 -path '*/.claude/settings*.json' -not -path '*/node_modules/*' 2>/dev/null \
  | xargs grep -ln 'ANTHROPIC_BASE_URL' 2>/dev/null

Lệnh này tìm trong cấu hình chung ~/.claude và cấu hình riêng của các thư mục dự án. Nếu bạn không cố ý dùng proxy hay cổng API riêng thì không nên có dòng nào hiện ra.

Giữ bước hỏi trước khi chạy lệnh. Chế độ tự duyệt hết hay cờ kiểu “bỏ qua mọi quyền” là thứ biến một file chữ thành lệnh chạy thật trên máy. Khi agent hỏi có tin thư mục này không, hãy đọc tên thư mục trước khi bấm đồng ý.

Nếu đã dính, coi như token đã lộ. Đăng xuất Claude Code hoặc Codex rồi đăng nhập lại để lấy phiên mới, đổi các API key có trên máy. Máy nào từng cài function-color thì coi như đã bị xâm nhập. Gói này đã bị gỡ khỏi npm, nhưng mã đã chạy thì gỡ gói cũng không lấy lại được gì.


Bạn hay mở agent ở thư mục nào, và đã bao giờ đọc lại file AGENTS.md hay CLAUDE.md trong một repo clone về chưa? Kể trong cộng đồng Vibe Code & Bảo Mật nhé.

Nguồn

Chia sẻ lên Facebook

Bình luận

Đang tải bình luận…