Quay lại
2026/10/29
Tệp AGENTS.md và CLAUDE.md độc hại: thư mục Downloads có thể chiếm quyền điều khiển AI coding agent như thế nào
Một tệp hướng dẫn cài sẵn trong Downloads đã cố khiến AI coding agent cài mã độc npm. Diễn biến, kết quả nghiên cứu và cách phòng vệ.
Những điểm chính
- Một tệp
AGENTS.mdđược cài sẵn trong thư mục~/Downloadscủa người dùng đã yêu cầu một AI coding agent cài đặt một gói npm độc hại đã biết. Nỗ lực này bị chặn trước khi bất kỳ đoạn mã nào được chạy. - Trong các thử nghiệm tại phòng lab, OpenAI Codex làm theo tệp hướng dẫn độc hại trong hơn 90% số lần thử. Claude Code làm theo khoảng một nửa số lần.
- Đây không phải là lỗi có thể khắc phục bằng bản vá. Các agent tin tưởng tệp hướng dẫn trong thư mục mà chúng khởi động, và trình duyệt có thể ghi tệp vào Downloads.
- Các biện pháp phòng vệ chính rất đơn giản: không bao giờ khởi động agent trong Downloads, đọc các tệp hướng dẫn mà bạn không tự viết, kiểm tra cấu hình agent xem có endpoint nào bạn không đặt hay không, và luôn bật cơ chế phê duyệt cùng sandbox.
Chuyện gì đã xảy ra
Ngày 22 tháng 10 năm 2026, công ty bảo mật Forever Security đã công bố bài viết “Markdown Is the New Executable” của Gal Weizman và Omer Samet. Bài viết mô tả một sự cố thực tế trên máy của một khách hàng của họ. Một AI coding agent đang làm việc trong thư mục ~/Downloads của người dùng, và một tệp AGENTS.md trong thư mục đó đã yêu cầu nó cài đặt function-color, một gói npm độc hại. Forever đã chặn agent trước khi gói được cài đặt và trước khi bất kỳ mã độc nào được chạy.
Không ai biết tệp đó đã vào thư mục Downloads bằng cách nào. Forever cho biết họ không thể xác định được điều này, và các bài đưa tin của BleepingComputer và The Hacker News cũng nhắc lại điểm này. Sau đó, Forever đã xây dựng các bản trình diễn trong phòng lab để cho thấy một trang web có thể cài sẵn tệp như vậy ra sao và agent sẽ làm gì với nó.
Bản thân gói này không mới. Checkmarx và CloudSEK liên kết function-color với chiến dịch npm MALFEX. Gói này chỉ là một lớp vỏ mỏng kéo theo function-flag. Script cài đặt của gói đó tải xuống và chạy một payload khác từ một máy chủ từ xa. Chiến dịch nhắm vào Windows, và Checkmarx cho biết kẻ vận hành đã hoạt động từ tháng 8 năm 2023. Khi chúng tôi kiểm tra npm registry vào ngày 29 tháng 10 năm 2026, function-color, function-flag và cdn-img-fetch đều đã được thay bằng gói giữ chỗ 0.0.1-security của npm.
Vì sao một tệp Markdown có thể điều khiển agent
Lập luận của Forever dựa trên hai hành vi bình thường nhưng trở nên nguy hiểm khi kết hợp với nhau.
- Agent tự động tải các tệp hướng dẫn. Coding agent đọc các tệp hướng dẫn của dự án khi khởi động và coi chúng là chỉ dẫn từ người dùng. Codex đọc
AGENTS.mdtừ thư mục gốc của dự án xuống đến thư mục hiện tại. Nếu không có thư mục gốc dự án, nó chỉ đọc thư mục hiện tại. Claude Code tảiCLAUDE.mdtừ thư mục nơi nó khởi động và từ mọi thư mục phía trên. Nó đọcAGENTS.mdthay thế khi không cóCLAUDE.md. - Web có thể ghi vào Downloads. BleepingComputer cho biết Chrome, Edge và Firefox mặc định lưu tệp vào Downloads mà không hỏi vị trí lưu. Một trang web có thể chọn tên và nội dung của tệp. Tệp Markdown không phải là chương trình, nên các cơ chế kiểm tra tệp thực thi tải về của hệ điều hành không coi nó là nguy hiểm.
Kết hợp lại, điều này có nghĩa là một trang web có thể thả một tệp mà sau đó agent sẽ đọc như các chỉ dẫn. Agent không cần bị “lừa” theo nghĩa thông thường: nó chỉ đang làm đúng việc nó được tạo ra để làm. Forever cũng chỉ ra rằng một số agent tự duyệt web. Trong trường hợp đó, có thể không ai nhìn thấy việc tải xuống diễn ra.
Logic tương tự áp dụng ngoài thư mục Downloads. Bất kỳ thư mục nào mà nội dung không đáng tin cậy có thể chạm tới đều là mục tiêu tiềm năng: một repository vừa clone, một tệp nén vừa giải nén hoặc một thư mục dùng chung. Với Claude Code, một dự án được giải nén vào thư mục con của Downloads cũng sẽ nạp một tệp CLAUDE.md nằm ngay trong Downloads, vì các tệp trong thư mục cha cũng được tải.
Nghiên cứu đã chứng minh điều gì
Forever đã thử nghiệm hai agent. Phần lớn các lần chạy dùng một payload thay thế vô hại (mở ứng dụng máy tính). Gói độc hại thật chỉ được chạy một lần, bên trong một máy ảo cô lập.
OpenAI Codex
Các nhà nghiên cứu đã dùng lại chính tệp AGENTS.md thật từ máy của khách hàng. Tệp này yêu cầu Codex thêm một mục máy chủ MCP vào cấu hình dùng chung cho toàn máy, ~/.codex/config.toml. Mục đó chạy một lệnh khi khởi động để cài đặt gói npm. Vì cấu hình là toàn cục, thay đổi này tồn tại trong mọi phiên Codex sau đó trên máy, không chỉ phiên đã đọc tệp. Forever cho biết cuộc tấn công cần vài thủ thuật: một văn bản dài và nhàm chán, một phiên con được khởi động với các cờ bỏ qua sandbox, và một cách khởi chạy tránh được giới hạn thời gian khởi động của Codex. Dù vậy, Codex vẫn chạy payload trong hơn 90% số lần thử.
Claude Code
Với Claude Code, các nhà nghiên cứu tự viết một tệp CLAUDE.md, trình bày như ghi chú thiết lập cho một API gateway nội bộ. Tệp yêu cầu Claude ghi thiết lập ANTHROPIC_BASE_URL vào tệp .claude/settings.json của dự án, chuyển hướng lưu lượng API tới một máy chủ do các nhà nghiên cứu kiểm soát. Theo Forever, điều này làm rò rỉ OAuth token của phiên. Nó cũng cho phép máy chủ của kẻ tấn công giả làm mô hình và gửi lại các lệnh gọi công cụ, kể cả lệnh shell khi sandbox bị tắt. Forever đã chứng minh việc đánh cắp token (dùng lại token để hành động như nạn nhân) và thực thi mã ở lần khởi chạy tiếp theo. Họ cũng chỉ ra một cách kích hoạt tấn công ngay trong cùng phiên bằng cách khởi động một subagent.
Cách này kém ổn định hơn. Claude Code yêu cầu phê duyệt trước khi ghi vào các tệp thiết lập và thường từ chối thay đổi đáng ngờ. Forever cho biết tỷ lệ thành công khoảng một nửa, và khoảng một trên năm lần thử với cách dùng subagent trong cùng phiên.
Những gì chưa được chứng minh
- Forever chưa xác định được tệp thật đã đến thư mục Downloads của khách hàng bằng cách nào. Con đường tải xuống từ web là một khả năng đã được chứng minh, không phải nguyên nhân đã được xác nhận.
- Chỉ Codex và Claude Code được thử nghiệm. Forever cho rằng các agent khác có tải tệp hướng dẫn cũng bị ảnh hưởng theo cách tương tự, nhưng chưa thử nghiệm chúng.
- Các bài viết không nêu phiên bản công cụ cụ thể và không có tuyên bố nào từ nhà cung cấp. Quan điểm của Forever là “không có gì ở đây để OpenAI hay Anthropic vá”: các agent đang hoạt động đúng như thiết kế.
Vì sao điều này quan trọng
Tệp hướng dẫn dễ bị bỏ qua vì trông giống tài liệu. Trên thực tế, chúng hoạt động như cấu hình, và thông qua một agent có quyền truy cập shell, chúng có thể hoạt động như mã. Ba điểm khiến rủi ro này trở nên thực tế:
- Agent thường được khởi động trong Downloads. Mọi người dùng agent để sắp xếp tệp hoặc xử lý thứ vừa tải về. Forever cho BleepingComputer biết hàng trăm khách hàng của họ chạy coding agent từ Downloads, với hơn 1.300 phiên Claude Code được khởi động tại đó.
- Tác động kéo dài hơn cả phiên làm việc. Một cấu hình toàn cục bị thay đổi, một máy chủ MCP mới hoặc một API endpoint bị chuyển hướng vẫn tiếp tục hoạt động sau khi tệp gốc đã bị xóa.
- Thông tin xác thực là mục tiêu. Một session token của agent bị đánh cắp là một phiên đăng nhập hợp lệ. Kẻ tấn công có thể dùng nó mà không cần chạy bất kỳ mã nào trên máy.
Các biện pháp phòng vệ thực tế
1. Chọn nơi khởi động agent
- Không bao giờ khởi động coding agent trong
~/Downloads, hoặc trong bất kỳ thư mục nào mà trình duyệt, email hay ứng dụng chat ghi vào. Hãy chuyển hoặc clone công việc vào một thư mục làm việc riêng trước. - Cũng tránh khởi động agent trong thư mục home. Hãy khởi động chúng trong đúng thư mục dự án. BleepingComputer lưu ý rằng OpenAI và Anthropic cũng khuyến nghị như vậy.
- Cân nhắc thiết lập trình duyệt hỏi vị trí lưu cho mỗi lần tải xuống. Việc này thêm một cú nhấp chuột, nhưng ngăn được các lượt tải xuống âm thầm.
2. Tìm các tệp hướng dẫn mà bạn không tự viết
Tìm ở những nơi tệp không đáng tin cậy thường xuất hiện, cùng với thư mục home của bạn. Trên Linux và macOS:
find ~/Downloads ~/Desktop ~ -maxdepth 3 \( -name AGENTS.md -o -name AGENTS.override.md -o -name CLAUDE.md -o -name CLAUDE.local.md \) -print 2>/dev/null | sort -u
Trên Windows, trong PowerShell:
Get-ChildItem $HOME\Downloads, $HOME\Desktop -Recurse -Depth 3 -Force -ErrorAction SilentlyContinue -Include AGENTS.md, AGENTS.override.md, CLAUDE.md, CLAUDE.local.md | Select-Object FullName, LastWriteTime
Hãy đọc mọi tệp tìm thấy trước khi để agent tiếp cận. Đặc biệt cảnh giác với các chỉ dẫn cài đặt gói, thêm máy chủ, thay đổi API endpoint hoặc tắt cơ chế phê duyệt. Cũng hãy kiểm tra các tệp hướng dẫn cá nhân, ~/.codex/AGENTS.md và ~/.claude/CLAUDE.md, vì chúng áp dụng cho mọi phiên.
Một tệp hướng dẫn dự án hợp lệ mô tả cách dự án được build và kiểm thử. Nó không có lý do gì để thay đổi cấu hình toàn cục của agent, API endpoint hay các thiết lập bảo mật. Hãy coi bất kỳ tệp nào yêu cầu những thay đổi đó là có ý đồ xấu.
3. Kiểm tra cấu hình agent xem có thay đổi bạn không thực hiện
Theo khuyến nghị của Forever, hãy tìm các khối máy chủ MCP bất thường, giá trị chatgpt_base_url bị thay đổi, hoặc ANTHROPIC_BASE_URL hay API endpoint khác mà bạn không đặt:
grep -nE '^\[mcp_servers|base_url' ~/.codex/config.toml
grep -nE 'BASE_URL|mcpServers' ~/.claude/settings.json .claude/settings.json .claude/settings.local.json .mcp.json 2>/dev/null
Các nhóm dùng Claude Code có thể áp đặt thiết lập tập trung bằng managed settings. Họ cũng có thể dùng ConfigChange hooks để kiểm tra hoặc chặn thay đổi thiết lập trong một phiên.
4. Luôn bật các lớp bảo vệ
- Giữ bật lời nhắc phê duyệt và sandbox. Tránh các cờ bỏ qua chúng, như
--dangerously-bypass-approvals-and-sandboxcủa Codex hoặc--dangerously-skip-permissionscủa Claude Code, ngoài môi trường dùng một lần. - Đọc kỹ lời nhắc phê duyệt đối với các tệp thiết lập và cấu hình. Trong thử nghiệm với Claude Code, chính bước phê duyệt đã chặn cuộc tấn công khoảng một nửa số lần.
- Đọc hộp thoại workspace trust của Claude Code trước khi chấp nhận cho một thư mục mới.
- Làm việc với repository và tệp tải về không đáng tin cậy bên trong máy ảo hoặc dev container, không phải trên máy trạm chính.
- Với npm, chặn các gói MALFEX đã biết và cân nhắc dùng
ignore-scriptscho các lần cài đặt chưa được xem xét.
5. Nếu bạn phát hiện một tệp bị cài sẵn
- Không khởi động agent trong thư mục đó. Giữ một bản sao của tệp để điều tra, sau đó xóa nó khỏi thư mục.
- Kiểm tra các tệp cấu hình agent nêu ở trên và xóa mọi thứ bạn không thêm vào.
- Giả định rằng session token của agent có thể đã bị rò rỉ. Đăng xuất rồi đăng nhập lại, và thay mới mọi API key mà agent có thể truy cập.
- Tìm
function-colorvàfunction-flagtrong các lockfile và thư mụcnode_modules. Nếu một trong hai đã được cài đặt, hãy coi máy đã bị xâm nhập và làm theo quy trình ứng phó sự cố của bạn.
Bức tranh toàn cảnh
Tiêu đề của Forever là “Markdown Is the New Executable”. Đó là một cách hữu ích để nhìn nhận bất kỳ tệp nào mà agent đọc như chỉ dẫn. Tệp hướng dẫn quyết định việc tiếp theo mà một agent có quyền truy cập shell sẽ làm, nên chúng cần được đối xử cẩn trọng như script: biết chúng đến từ đâu, xem xét các thay đổi, và giữ chúng tránh xa những thư mục mà bất kỳ ai trên internet cũng có thể ghi vào. Các biện pháp ở đây chủ yếu là thói quen chứ không phải bản vá, và chi phí áp dụng rất thấp.
Tài liệu tham khảo
- Forever Security, “Markdown Is the New Executable” (22 tháng 10 năm 2026), nguồn chính
- BleepingComputer, “AI coding agents hijacked using AGENTS.md file in Downloads folder” (25 tháng 10 năm 2026)
- The Hacker News, “Malicious File in Downloads Folder Tries to Trick AI Coding Agent Into Installing Malware” (26 tháng 10 năm 2026)
- Checkmarx, Chiến dịch mã độc npm MALFEX (5 tháng 10 năm 2026)
- CloudSEK, Chiến dịch chuỗi cung ứng npm postinstall độc hại MALFEX
- OpenAI, Tài liệu Codex AGENTS.md
- Anthropic, Tài liệu bộ nhớ (CLAUDE.md) của Claude Code và Tài liệu bảo mật của Claude Code
Global
Japan
Korea
China
Taiwan
Thailand
Indonesia
Portugal
Spain
France
Germany
Egypt
Russia