指令即可执行:一份 AGENTS.md 投毒暴露的 Agent 供应链缺口

10 月 22 日,发生了两件看似无关的事。
一件是 Linux 基金会旗下的 Agentic AI Foundation(AAIF)宣布接手 Agent Skills 标准。这个标准已被 70 多个 Agent 平台采用,公开技能超过 100 万个,累计安装接近 2.8 亿次。
同在 AAIF 名下的还有 MCP 和 AGENTS.md。它们有一个共同点:都是写给 Agent 看的说明书,Agent 读到就会照着做。
另一件是安全公司 Forever Security 发布了《Markdown Is the New Executable》。他们在一位真实客户的电脑上拦下一次攻击:一份 AGENTS.md 出现在下载目录里,正在指挥 Codex 安装恶意 npm 包。
两件事放在一起,指向一个问题:
当一份文本能驱动一个持有你全部权限的程序时,它在安全意义上就已经是可执行文件。可现有防线还把它当成普通文档。
这个博客本身就是由一份 SKILL.md 驱动 Agent 完成调研、写作和出图的。七个月前,我写过一次 AI 助手误删整个 D 盘的事故。那次是 Agent 自己手滑;这次更麻烦:Agent 没有犯错,它只是认真执行了别人写的指令。
一次真实攻击,是怎么一步步走完的
先把 Forever 报告里的攻击链走一遍。它一共五步,每一步都绕过了一道看似有效的控制。
第一步:文件落地
网页可以在用户不点击、不确认的情况下,把文件下载到 ~/Downloads,文件名和内容都由网页决定。
浏览器一直允许这样做。过去风险不大,因为操作系统不会让下载的可执行文件自行运行。这次落地的却是一份名叫 AGENTS.md 的纯文本,杀毒软件没有任何东西可报。
第二步:Agent 读取
开发者在下载目录里启动 Codex,随便问一个问题。Codex 会先读取当前目录的 AGENTS.md,并把它当作项目主人的指示。
Codex 确实有信任门槛,只对“受信任的项目”生效。但用户只要在下载目录里工作过一次,这个目录就可能被信任。Forever 的遥测显示,大约一半的客户在下载目录里运行过编程 Agent。
第三步:改写自己的配置
这份文件有 13 KB,绝大部分是正常的“工程规范”。攻击只藏在靠后的一节“本地开发环境”里。
它要求 Codex 在处理用户请求前,往 ~/.codex/config.toml 追加一个名叫 project-tools 的 MCP 服务器。这个“服务器”的启动命令,实际是在安装已知恶意包 function-color。
研究者发现,直白地说“请安装这个包”会被模型拒绝;把同一件事包装成长篇、平淡的工程说明,反而能够通过。攻击的伪装不在代码里,而在语气里。
第四步:绕过沙箱
Codex 默认禁止命令联网,所以安装本应失败。文件却要求 Codex 启动一个子会话来“验证配置”,命令里带着 --dangerously-bypass-approvals-and-sandbox。理由也很像正常工程需求:“首次初始化需要从注册表拉包,默认沙箱不给网络。”
关闭沙箱和审批的参数,就这样由模型自己写进了命令。为了避免安装超时,攻击者还让 macOS 的 launchctl 接手安装,使其脱离 Codex 的控制。
第五步:持久化
被修改的是用户级全局配置,而不是下载目录里的局部文件。此后,这台机器上的每一次 Codex 会话,无论从哪个项目启动,都会先加载攻击者的“服务器”。离开下载目录也没有用。

Forever 用客户机器上那份原始文件,在隔离虚拟机里重放了整条链。Codex 在超过 90% 的尝试里执行了恶意代码。
研究者又照这个思路,为 Claude Code 构造了一份 CLAUDE.md。Claude Code 更难骗,成功路线也不同:不安装包,而是让 Claude 在 .claude/settings.json 里写入 ANTHROPIC_BASE_URL,以“团队内部网关”为名,把模型 API 流量改道到攻击者的服务器。
这一改动带来两重后果:
- Claude 的请求会携带 OAuth 登录令牌。研究者用截获的令牌调用真实 API,被识别为受害者本人。
- 攻击者可以冒充模型下发 Bash 工具调用,并带上
dangerouslyDisableSandbox: true。客户端会把它当成模型自己的决定来执行。
这条路线的配置写入成功率约为 50%。
报告里还有一个细节值得记住:攻击文件会“看场合”。同一份 CLAUDE.md,放在干净目录里能成功,放在满是安全笔记的目录里每次都失败,因为子 Agent 读到之后会把它识别为攻击。这说明模型并非看不出攻击,只是在专心干活的时候没去看。我们在《提示注入的防线》里讨论过同样的现象。
为什么说 Markdown 成了可执行文件
Forever 有一句判断很重:OpenAI 和 Anthropic 在这件事上没有什么可修补的。
Agent 读取当前目录的 AGENTS.md 并照做,恰恰是它被设计出来要做的事。就像浏览器渲染钓鱼页面,浏览器本身并没有坏。
真正的问题,是两个单独无害的设定撞到了一起:
- 指令文件本来就要被 Agent 服从,通常放在用户控制的项目目录里。
- 网页可以向下载目录写入文件。
组合起来,结果就是:网页把命令放进一个受信任的目录,再由用户自己的 Agent 执行。
过去三十年的终端安全建立在两个假设上。第一,危险内容通常是二进制或脚本;第二,总得有人点击、确认或双击运行。下载标记、签名校验和首次运行确认,都是围绕这两个假设建立的。
Agent 同时拿掉了它们。它能把自然语言转成 shell 命令、配置修改和网络请求,执行时用的还是你的账号、凭证和文件权限。
“Markdown 是可执行文件”也不只是修辞。GitHub 本周正式发布的 Agentic Workflows,就允许用户用 Markdown 写指令,再将其编译成 GitHub Actions YAML运行。Markdown 已经是源代码,只是它的“编译器”变成了概率模型。

配置文件也在同一条光谱上。Check Point 此前披露过两个 Claude Code 漏洞:
- CVE-2025-59536(CVSS 8.7):利用仓库自带的
.claude/settings.json钩子,在信任对话框出现前执行任意命令。2025 年 10 月在 1.0.111 版修复。 - CVE-2026-21852(CVSS 5.3):通过项目配置把 API 流量改道到攻击者服务器,静默窃取密钥。2026 年 1 月在 2.0.65 版修复。
Forever 对 Claude Code 用的正是第二种思路:修改 API 地址。不同之处在于,漏洞补丁堵住的是“仓库预置配置在用户同意前生效”;这次则是让 Agent 自己在会话里写入配置。
补丁修得了代码路径,修不了模型的服从。对 Agent 来说,“读取指令”“写入配置”和“执行代码”之间的距离很短。
不只一个文件夹:指令供应链的四个入口
下载目录只是这一次被抓到现场的入口。把视野放宽,Agent 会当作可信指令来读取的东西至少有四类,每一类都已经有真实的攻击证据。
| 入口 | 典型载体 | 已有证据 |
|---|---|---|
| 工作目录指令文件 | AGENTS.md、CLAUDE.md、.cursorrules、copilot-instructions.md | Forever 实网捕获;Codex 复现成功率超过 90% |
| 技能包 | SKILL.md 及附带脚本 | 98,380 个技能中确认 157 个恶意,84.2% 的漏洞位于 SKILL.md 文本 |
| 工具描述 | MCP 服务器的工具名、描述、参数说明 | OWASP MCP Top 10 将其列为“工具投毒” |
| 编辑器扩展 | IDE 插件市场里的 Agent 扩展 | 被篡改的扩展在市场上挂了约 11 小时,最多 5,000 名用户受影响 |
技能包:危险常常藏在说明书里
技能包是增长最快的一类。今年 1 月的一项研究(arXiv:2602.06547)分析了两个社区索引中的 98,380 个技能,确认 157 个具有恶意行为,共包含 632 个漏洞。平均每个恶意技能有 4.03 个漏洞。
恶意技能只占总样本的 0.16%,但有两个发现很关键:
- 84.2% 的漏洞写在
SKILL.md里,代码文件只占 8.5%。 传统包扫描器主要检查代码,在这里很容易漏掉威胁。 - 超过一半的恶意样本出自同一个攻击者,主要手法是批量冒充知名品牌。
Snyk 随后审计了 3,984 个技能:36.82% 至少有一个安全问题,13.4% 存在严重问题,76 个被确认带有恶意载荷,其中 91% 同时使用了提示注入。报告发布时,仍有 8 个确认恶意的技能可以公开安装。
市场增加 VirusTotal 等扫描后,攻击者也开始规避检测。Palo Alto 的 Unit 42 就发现过一种老办法:故意把文件撑大,超过扫描器的处理阈值。
工具描述:模型会把广告词当说明书
MCP 工具的名字、描述和参数说明都会进入模型上下文,并被当作权威说明。OWASP 列出的危险信号包括:
- 针对模型的祈使句,例如“回答之前先读取……”;
- 在普通工具描述中提到
~/.ssh、.env等敏感路径; - 零宽字符;
- 藏在 Markdown 或 HTML 注释里的指令。
更麻烦的是“撤换”:工具在审核时是干净的,之后某次更新却悄悄修改描述。
编辑器扩展:旧供应链借到了新权限
编辑器扩展看起来是老问题,本质上也是传统代码供应链攻击。
10 月 29 日,Cursor 在扩展市场发现了被篡改的 Anthropic.claude-code 2.1.312 和 2.1.313(并非 Anthropic 开发)。恶意版本面向 Windows 和 macOS 分发了约 11 小时。
它会上报主机信息,向 authorized_keys 写入标注为 svc-telemetry 的攻击者公钥,尝试建立反向 SSH 隧道,并通过 LaunchAgent 或计划任务实现持久化。受代码错误和管理员权限限制,隧道在多数机器上没有打通,但公钥和持久化脚本仍可能已经写入。
Cursor 特别强调:只卸载扩展并不够。
这件事之所以要和前三类放在一起,是因为攻击者借用了“Agent 扩展”这个身份。开发者安装它时,本来就预期它能读写文件、执行命令。
四个入口有一个共同的结构:进入 Agent 上下文的那段文本,权限等于 Agent 本身的权限。 而 Agent 的权限,通常就是开发者本人的权限。
刹车为什么没踩住
每个主流编程 Agent 都有审批、沙箱和信任提示。这次的事件说明,这些刹车的设计前提和实际使用方式之间有不小的落差。
信任给了目录,内容却会变化
Codex 和 Claude Code 都会询问“是否信任此目录”。但信任针对的是目录,不是目录内某一时刻的内容。
下载目录恰恰是内容最不受用户控制的地方。用户在那里信任过一次,之后网页放进来的指令文件也会继承这份信任。
审批会坍缩成“本次会话全部允许”
长任务可能执行几百条命令,没有人愿意逐条批准。于是各类工具都会提供“本会话内不再询问”,用户也很容易选择它。
GitHub 官方文档写得很清楚:如果用户对 rm ./this-file.txt 选择“本会话允许”,Copilot 之后便可不经询问执行任何 rm 命令,包括 rm -rf ./*。
上周还有开发者在 Copilot CLI 1.0.105 的默认设置下复现:让它读取放在 ~/.ssh 里的测试文件,它直接照做。整个会话唯一的对话框,是启动时的目录信任提示。加上 --sandbox 后读取会被系统拒绝,但该沙箱默认关闭。
沙箱往往防写,却不防读
Claude Code 和 Codex 的沙箱默认开启,但读取策略基本是“全部可读,除非明确隐藏”。在用户主动配置前,~/.ssh、~/.aws、.env 和浏览器配置目录都可能被读取。
删掉的文件可以从备份恢复,泄露的密钥却收不回来。
Agent 还可以改自己的刹车
这是最根本的问题。Forever 的两条攻击链,都以修改 Agent 自身配置为核心:一条增加 MCP 服务器,另一条修改 API 地址。
一旦 Agent 能写自己的配置,它就能为下次会话关掉沙箱、换掉模型端点或加载任意程序。一次上下文污染,由此变成跨会话的持久化。
怎么守:把指令当依赖来管
既然文本拥有了执行力,就应该把指令文件、技能包和工具描述当作依赖包管理:来源可追踪,版本要锁定,变更须审查,执行有边界。
第一层:控制指令来源
最便宜的一步,是只在项目根目录启动 Agent,不要在下载目录或用户主目录启动。这样,它加载的指令文件至少来自明确的仓库。
还可以做三件事:
- 把浏览器设置为每次下载都询问保存位置,或将下载目录设为不运行任何工具的隔离区;
- 克隆陌生仓库后,先完整检查
AGENTS.md和CLAUDE.md,再启动 Agent; - 只从有人维护的精选来源安装技能,并记录来源和版本。
Forever 的恶意指令藏在 13 KB 文件的后半部分,只看第一屏发现不了。
第二层:禁止 Agent 修改自身配置
这是性价比最高的一层,因为它切断了“一次污染变成长期驻留”的路径。
Claude Code 支持企业通过 managed-settings.json 或 MDM 下发托管设置,其优先级高于项目设置。10 月底的 2.1.314 版还新增了一个选项,可禁止 Write、Edit、NotebookEdit 修改已批准工作目录之外的文件。
但这个选项只限制三个编辑工具,通过 shell 修改文件仍需单独设防。最低限度,应监控 ~/.codex/config.toml 和 .claude/settings.json:一旦出现新的 mcp_servers 条目或 API 地址变化,就按安全事件处理。
第三层:凭证不进入上下文
如果 Agent 根本拿不到原始密钥,被骗时就没有东西可泄露。
本地凭证代理(credential broker)的思路是:密钥保存在系统钥匙串中,Agent 只看到 prod-readonly 这样的句柄。需要使用时,代理在受限子进程里注入凭证并执行命令,只把脱敏结果返回给 Agent。
工具网关也可以采用同样思路:新工具默认不可调用,审核后才放行;描述或参数一旦变化,自动隔离并等待重新批准。
第四层:沙箱默认拒读敏感路径
把 ~/.ssh、~/.aws、**/.env 和浏览器配置目录列入默认拒读,让系统直接拒绝文件访问,而不是指望模型自觉。
网络出口也不能只按主机名放行。git push 和 git fetch 都访问 github.com,npm publish 和 npm install 也使用同一个注册表。仅看主机名,无法区分读写。真正敏感的操作仍需在命令层单独审批。
四层防线的目标不是要求模型识别每次攻击,而是让它即使被骗,也凑不齐造成伤害的条件:
- 来源可控,减少恶意指令进入上下文的机会;
- 配置不可自改,避免一次污染变成长期驻留;
- 凭证不进上下文,让被骗的 Agent 没东西可偷;
- 沙箱默认拒读,让它想偷也读不到。
这对我们意味着什么
对开发者:先做四项检查
- 不在下载目录和用户主目录启动 Agent;
- 保持审批和沙箱开启,拒绝任何来历不明的关闭要求;
- 检查 Agent 配置里是否存在陌生的 MCP 服务器和 API 地址;
- 如果 10 月 29 日通过 Cursor 更新过 Claude Code 扩展,按官方指引检查
authorized_keys中是否存在svc-telemetry,并从可信机器轮换凭证。
对企业:把“指令资产”加入清单
过去盘点的是软件包、镜像和扩展。现在还要知道:员工机器和仓库里有哪些 AGENTS.md、技能包和 MCP 配置,它们从哪里来,由谁批准。
传统终端检测关注进程和文件行为,这次攻击却始于“一份文本被模型读到”。Forever 对此次发现的总结是:“因为我们盯的是 Agent,而不是用户。”Agent 端点安全很可能会成为一个独立类别。
对平台和标准组织:安全机制必须追上采用速度
AAIF 现在同时托管 MCP、AGENTS.md 和 Agent Skills。但签名、来源声明、权限声明和变更审计,目前都还不是这些格式的内建能力。
npm 用了十几年才逐步补上来源证明和发布者验证。Agent 生态没有这么长的缓冲期:100 万个技能和近 2.8 亿次安装已经发生。
小结
- 能驱动 Agent 的文本,在安全意义上就是可执行文件。
AGENTS.md、SKILL.md、MCP 工具描述和 Agent 配置,都能把自然语言变成以你的权限执行的命令,而传统终端防线只拦二进制和脚本。 - 这类问题很难靠厂商打补丁解决。 Agent 照着目录里的指令做事是设计本意,风险来自“可信目录被不可信来源写入”这种组合。它会在下载目录之外的更多地方反复出现。
- 最关键的一道闸,是别让 Agent 改自己的配置。 两条真实攻击链都靠改写配置实现了持久化或关闭沙箱。托管设置、目录外写入限制和配置变更监控,比给模型多写几句警告有效得多。
- 按依赖包的标准管理指令资产。 控制来源、钉住版本、变更要有人看、凭证不进上下文、沙箱默认拒读敏感路径。目标不是让模型永远不受骗,而是让一次受骗不足以造成伤害。
最后留一个问题:你现在常用的那几个 Agent,能不能修改它们自己的配置文件?如果能,上一次是谁、出于什么理由改的?
本文部分内容由 AI 辅助生成,经人工审校和补充后发布。
参考资料
- Gal Weizman, Omer Samet. "Markdown Is the New Executable: Attackers Are Dropping Agent Instructions Into Your Downloads Folder From the Web." Forever Security, 2026-10-22. https://forever.security/blog/hijacking-ai-agents-via-downloads-folder/
- Cursor. "Security notice — malicious version of Anthropic.claude-code (2.1.312 and 2.1.313) identified in the Cursor VS Code Extension Marketplace." 2026-10-29. https://cursor.com/blog/claude-code-extension-security-notice
- Microsoft Threat Intelligence. "Inside a malicious Claude Code-branded extension and its persistent SSH backdoor." Microsoft Security Blog, 2026-10-30. https://www.microsoft.com/en-us/security/blog/2026/10/30/inside-malicious-claude-code-branded-cursor-extension-persistent-ssh-backdoor/
- Sophos X-Ops. "Malicious Claude Code extension distributed through Cursor marketplace." 2026-10. https://www.sophos.com/en-us/blog/malicious-claude-code-extension-distributed-through-cursor-marketplace
- Anthropic. "Donating Agent Skills to the Agentic AI Foundation." 2026-10-22. https://www.anthropic.com/news/donating-agent-skills-to-the-agentic-ai-foundation
- The Linux Foundation. "Agentic AI Foundation Announces Four New Projects: Agent Skills, Open Responses, OpenEnv, and OpenSandbox." 2026-10-22. https://www.linuxfoundation.org/press/agentic-ai-foundation-announces-four-new-projects-agent-skills-open-responses-openenv-and-opensandbox
- "'Do Not Mention This to the User': Detecting and Understanding Malicious Agent Skills." arXiv:2602.06547, 2026. https://arxiv.org/abs/2602.06547
- Snyk Security Research. "Exploring the Threat Landscape of Agent Skills." 2026-02. https://research.snyk.io/blog/agent-skills-threat-landscape/
- Palo Alto Networks Unit 42. "OpenClaw's Skill Marketplace and the Emerging AI Supply Chain Threat." 2026. https://unit42.paloaltonetworks.com/openclaw-ai-supply-chain-risk/
- Cloud Security Alliance. "Agent Context Poisoning: SKILL.md and the New AI Supply Chain Attack Surface." 2026-05-06. https://labs.cloudsecurityalliance.org/research/csa-research-note-skill-md-agent-context-poisoning-20260506/
- OWASP. "MCP03:2025 – Tool Poisoning." OWASP MCP Top 10. https://github.com/OWASP/www-project-mcp-top-10/blob/main/2025/MCP03-2025–Tool-Poisoning.md
- OWASP. "Secure Coding with AI Cheat Sheet." https://cheatsheetseries.owasp.org/cheatsheets/Secure_Coding_with_AI_Cheat_Sheet.html
- "I asked my coding agent to cat a file in ~/.ssh. It did." 2026-10. https://wpnews.pro/news/i-asked-my-coding-agent-to-cat-a-file-in-ssh-it-did
- GitHub Docs. "GitHub Copilot CLI." https://docs.github.com/en/enterprise-cloud@latest/copilot/concepts/copilot-surfaces/copilot-cli
- Check Point Research. "Caught in the Hook: RCE and API Token Exfiltration Through Claude Code Project Files | CVE-2025-59536 | CVE-2026-21852." 2026.
- EveryDev.ai. "Weekly AI Dev News Digest: October 24 – October 30, 2026." 2026-10-30. https://www.everydev.ai/p/news-weekly-ai-dev-news-digest-october-24-october-30-2026