返回

2026/10/29

恶意 AGENTS.md 和 CLAUDE.md 文件:Downloads 文件夹如何劫持 AI 编程智能体

Downloads 中被植入的指令文件试图让 AI 编程智能体安装 npm 恶意软件。本文介绍事件经过、研究结果以及防御方法。

要点速览

  • 用户 ~/Downloads 文件夹中被植入的 AGENTS.md 文件指示 AI 编程智能体安装一个已知的恶意 npm 包。这次尝试在任何代码运行之前就被阻止了。
  • 在实验室测试中,OpenAI Codex 在超过 90% 的尝试中遵循了恶意指令文件,Claude Code 大约有一半的情况会遵循。
  • 这不是打个补丁就能修复的漏洞。智能体会信任其启动目录中的指令文件,而浏览器可以向 Downloads 写入文件。
  • 主要防御措施很简单:不要在 Downloads 中启动智能体;阅读并非由您编写的指令文件;检查智能体配置中是否有您未设置的端点;保持审批和沙箱处于开启状态。

事件经过

2026 年 10 月 22 日,安全公司 Forever Security 发布了由 Gal Weizman 和 Omer Samet 撰写的文章《Markdown Is the New Executable》。文章描述了该公司一位客户的机器上发生的真实事件。一个 AI 编程智能体正在用户的 ~/Downloads 文件夹中工作,该文件夹中的 AGENTS.md 文件指示它安装恶意 npm 包 function-color。Forever 在该包被安装之前、在任何恶意代码运行之前阻止了这个智能体。

没有人知道这个文件是如何进入 Downloads 文件夹的。Forever 表示无法确定这一点,BleepingComputer 和 The Hacker News 的报道也重申了这一点。随后,Forever 构建了实验室演示,展示网页如何植入此类文件,以及智能体会如何处理它。

这个包本身并不新。Checkmarx 和 CloudSEK 将 function-color 与 MALFEX npm 攻击活动联系在一起。该包只是一个引入 function-flag 的薄封装,而 function-flag 的安装脚本会从远程服务器下载并运行进一步的载荷。该攻击活动以 Windows 为目标,据 Checkmarx 报告,其操纵者自 2023 年 8 月以来一直活跃。我们在 2026 年 10 月 29 日查看 npm 注册表时,function-color、function-flag 和 cdn-img-fetch 均已被替换为 npm 的 0.0.1-security 占位包。

为什么一个 Markdown 文件能操纵智能体

Forever 的论点建立在两种寻常行为之上,二者结合便会变得危险。

  1. 智能体会自动加载指令文件。编程智能体在启动时读取项目指令文件,并将其视为来自用户的指导。Codex 会读取从项目根目录到当前文件夹路径上的 AGENTS.md;如果没有项目根目录,则只读取当前文件夹中的文件。Claude Code 会从其启动的文件夹及其上方的所有文件夹加载 CLAUDE.md;当不存在 CLAUDE.md 时,则改为读取 AGENTS.md。
  2. 网页可以向 Downloads 写入文件。据 BleepingComputer 报道,Chrome、Edge 和 Firefox 默认会将文件保存到 Downloads,而不询问保存位置。网页可以决定文件的名称和内容。Markdown 文件不是程序,因此操作系统针对下载的可执行文件所做的检查不会将其视为危险文件。

两者结合,意味着网页可以放下一个文件,而智能体之后会把它当作指令来读取。智能体甚至不需要被通常意义上的“欺骗”:它只是在按设计工作。Forever 还指出,有些智能体会自行浏览网页。在这种情况下,可能根本没有人看到下载的发生。

同样的逻辑也适用于 Downloads 之外。任何不可信内容能够到达的文件夹都可能成为目标:刚克隆的代码仓库、解压后的归档文件或共享文件夹。对于 Claude Code,即使项目被解压到 Downloads 的某个子文件夹中,也会加载位于 Downloads 本身的 CLAUDE.md,因为上级文件夹中的文件同样会被加载。

研究证明了什么

Forever 测试了两个智能体。大多数测试使用的是无害的替代载荷(打开计算器)。真正的恶意包只在一个隔离的虚拟机中运行过一次。

OpenAI Codex

研究人员复用了客户机器上真实的 AGENTS.md。该文件指示 Codex 向其全机范围的配置文件 ~/.codex/config.toml 中添加一个 MCP 服务器条目。该条目在启动时运行一条命令来安装这个 npm 包。由于该配置是全局性的,这一更改会延续到该机器上之后的每个 Codex 会话中,而不仅仅是读取了该文件的那个会话。Forever 报告称,这次攻击需要几种绕过手段:冗长乏味的文档风格、使用绕过沙箱参数启动的子会话,以及一种避开 Codex 启动超时的启动方法。即便如此,Codex 仍在超过 90% 的尝试中运行了载荷。

Claude Code

针对 Claude Code,研究人员自行编写了一个 CLAUDE.md,伪装成内部 API 网关的配置说明。它要求 Claude 将 ANTHROPIC_BASE_URL 设置写入项目的 .claude/settings.json,把 API 流量指向研究人员控制的服务器。据 Forever 称,这会泄露会话的 OAuth 令牌,还可以让攻击者的服务器冒充模型并返回工具调用,包括在禁用沙箱的情况下执行的 shell 命令。Forever 演示了令牌窃取(重放令牌以冒充受害者)以及下次启动时的代码执行。他们还展示了一种通过启动子智能体在同一会话内触发攻击的途径。

这种方式的可靠性较低。Claude Code 在写入设置文件之前会请求批准,并且经常拒绝可疑的更改。Forever 报告的成功率约为一半,而同一会话的子智能体途径大约五次中成功一次。

尚未证明的内容

  • Forever 未能确定真实文件是如何进入客户的 Downloads 文件夹的。网页下载途径是一种经过演示的可能性,而不是已确认的原因。
  • 只测试了 Codex 和 Claude Code。Forever 认为其他加载指令文件的智能体也以同样的方式面临风险,但并未对其进行测试。
  • 相关文章没有给出具体的工具版本,也没有报道厂商的声明。Forever 的立场是“这里没有什么需要 OpenAI 或 Anthropic 打补丁的”:智能体正在按设计运行。

为什么这很重要

指令文件看起来像文档,因此很容易被忽视。但实际上它们的作用类似配置,而通过具有 shell 访问权限的智能体,它们还可能像代码一样发挥作用。以下三点让这一风险变得切实可见:

  • 智能体经常在 Downloads 中启动。人们会使用智能体来整理文件,或处理刚下载的内容。Forever 告诉 BleepingComputer,其数百家客户在 Downloads 中运行编程智能体,在那里启动的 Claude Code 会话超过 1,300 个。
  • 影响会持续到会话结束之后。被更改的全局配置、新增的 MCP 服务器或被重定向的 API 端点,在原始文件被删除后仍会继续生效。
  • 凭据才是真正的目标。被盗的智能体会话令牌就是一个可用的登录凭据。攻击者无需在机器上运行任何代码即可使用它。

实用防御措施

1. 选择智能体的启动位置

  • 切勿在 ~/Downloads 或任何浏览器、电子邮件、聊天应用会写入的文件夹中启动编程智能体。请先将工作内容移动或克隆到专用的工作区文件夹。
  • 也应避免在主目录中启动智能体,而应在具体的项目文件夹中启动。BleepingComputer 指出,OpenAI 和 Anthropic 也给出了同样的建议。
  • 可以考虑将浏览器设置为每次下载时询问保存位置。这会多一次点击,但能阻止静默下载。

2. 查找并非由您编写的指令文件

搜索不可信文件容易落地的位置以及您的主目录。在 Linux 和 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

在 Windows 上,使用 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

在让智能体接触之前,请阅读找到的每一个文件。对于要求安装软件包、添加服务器、更改 API 端点或关闭审批的指令,要高度警惕。同时也请检查您的个人指令文件 ~/.codex/AGENTS.md 和 ~/.claude/CLAUDE.md,因为它们适用于每一个会话。

正当的项目指令文件描述的是项目如何构建和测试。它没有理由更改智能体的全局配置、API 端点或安全设置。任何要求进行此类更改的文件都应被视为恶意文件。

3. 检查智能体配置中是否有并非由您做出的更改

按照 Forever 的建议,查找意外出现的 MCP 服务器配置块、被更改的 chatgpt_base_url,或您未设置的 ANTHROPIC_BASE_URL 及其他 API 端点:

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

使用 Claude Code 的团队可以通过托管设置集中强制执行配置,还可以使用 ConfigChange 钩子在会话期间审计或阻止设置更改。

4. 保持防护措施开启

  • 保持审批提示和沙箱处于启用状态。除非在一次性环境中,否则不要使用绕过它们的参数,例如 Codex 的 --dangerously-bypass-approvals-and-sandbox 或 Claude Code 的 --dangerously-skip-permissions。
  • 仔细阅读针对设置和配置文件的审批提示。在 Claude Code 的测试中,大约一半的情况正是审批步骤阻止了攻击。
  • 在新文件夹中接受 Claude Code 的工作区信任对话框之前,请先阅读其内容。
  • 在虚拟机或开发容器中处理不可信的代码仓库和下载内容,而不是在您的主工作站上。
  • 对于 npm,请屏蔽已知的 MALFEX 包,并考虑对未经审查的安装使用 ignore-scripts。

5. 如果发现被植入的文件

  1. 不要在该文件夹中启动智能体。保留一份文件副本用于调查,然后将其从该文件夹中删除。
  2. 检查上面列出的智能体配置文件,删除任何并非由您添加的内容。
  3. 假定智能体的会话令牌可能已经泄露。退出登录后重新登录,并轮换智能体能够访问的所有 API 密钥。
  4. 在锁文件和 node_modules 文件夹中搜索 function-color 和 function-flag。如果安装过其中任何一个,请将该机器视为已被入侵,并按照您的事件响应流程处理。

更宏观的视角

Forever 的文章标题是“Markdown Is the New Executable”(Markdown 是新的可执行文件)。对于智能体当作指令读取的任何文件,这都是一种有用的思考方式。指令文件决定了具有 shell 访问权限的智能体下一步会做什么,因此值得像对待脚本一样谨慎:了解它们的来源,审查对它们的更改,并让它们远离互联网上任何人都能写入的文件夹。这里的应对措施主要是习惯而不是补丁,采用的成本也很低。

参考资料