AI编程代理可能被下载文件夹里的一个文件劫持
开发者下载目录中一份被植入的AGENTS.md,差点让OpenAI的Codex装上恶意软件。防护措施成本很低,但多数团队都没有。

Forever Security的安全研究人员上周捕获了一次针对客户AI编程代理的实时劫持企图,而武器竟是一个躺在Downloads文件夹里的Markdown文件。这份伪装成普通工程笔记的文件,指示OpenAI的Codex安装一个已知的恶意npm包。安装在任何代码运行前就被拦截了。但该公司的后续测试(CSO Online和The Hacker News均有报道)显示,这一手法对Codex和Anthropic的Claude Code都能稳定奏效,令人不安。
先别被炒作带跑,这里有个更值得你注意的事实:这里没有可以打补丁的漏洞。没有CVE,没有漏洞利用链,也没有什么巧妙的内存破坏。代理只是完全按照它的设计行事,读取工作目录中的指令文件并照做。攻击者的全部投入,就是一个文件名正确、放在正确文件夹里的文本文件。如果这都不能让你重新评估代理自主性的定价,那就没有什么能做到了。
客户机器上实际发生的事
Forever Security在一位客户的Downloads文件夹里发现了一个恶意的AGENTS.md文件。AGENTS.md是Codex在某个目录启动时读取的纯文本文件,并将其内容视为项目指令。Claude Code有对应的CLAUDE.md约定。这两种文件格式本身都不会执行任何东西,这正是整个手法的关键。执行的是代理,权限则由开发者授予。
被找回的文件伪装成日常项目配置。其中一段要求代理在自己的配置中注册一个服务器,并安装一个名为function-color的npm包。这个包并非假设中的恶意软件:CloudSEK和Checkmarx的研究人员都曾分别记录过它,属于他们命名为MALFEX的攻击活动的一部分。其中function-color会引入一个名为function-flag的下载器,用于获取并运行Windows载荷。因此这并不是偶然落入开发者磁盘的概念验证,而是有人把真实的供应链攻击活动瞄准了一个真实的代理,它被发现靠的是运气和一道控制措施,而非代理自身的判断。
这个文件是怎么进入Downloads的?Forever也不清楚。它所演示的是一条可行的投递路径:网页可以在无需点击、无需权限提示的情况下,悄无声息地向Downloads文件夹保存一个文件,并自行决定文件名和内容。该公司自建了一个概念验证页面,访问即会在Downloads中放入一份AGENTS.md。真正的攻击者是否用了这条路径尚未证实,任何断言已经确定的人,都是在夸大证据。
已确认、有待证实与未知
把这个故事剥开来看其证据层次,因为它们的可靠程度并不相同。
已确认:一份恶意AGENTS.md确实存在于一台真实客户的机器上,并指示Codex安装function-color。安装在执行前被拦截。该包与已公开记录的MALFEX攻击活动有关联。这些是有事件背书的事实,而非实验室演示。
研究人员的演示,并非野外观测到的情况:在隔离虚拟机中用真实攻击者的文件对Codex进行测试,Forever在超过90%的测试中让代理执行了恶意指令,其中多数使用了无害的替代品代替恶意软件。更糟的是,该文件还指示Codex修改~/.codex/config.toml,即其全机范围的MCP服务器配置,并在绕过审批和沙箱限制的情况下启动新会话。由于该配置适用于每一个会话,攻击者的服务器此后会在任意目录中加载。开发者离开Downloads之后,攻击依然持续。正是这一细节,让它从一个巧妙的把戏上升为设计缺陷。
针对Claude Code的有效变体则不同,且可靠性较低。一份植入的CLAUDE.md以内部网关配置为幌子,试图让代理把ANTHROPIC_BASE_URL写入项目设置文件,从而把API流量重定向到研究人员控制的服务器。仅这一次写入就会泄露会话的登录令牌,单凭这一点就足以接管账户,并且让假服务器可以冒充模型回复,下发命令。Claude对这类写入要求人工审批,并且常常拒绝可疑请求;而这种工程文档式的包装,大约有一半的时间获得了批准。研究人员还把截获的OAuth令牌回放到合法API上,证明令牌窃取是可以实际利用的,而非纸上谈兵。
未知:真实事件中的投递途径、该手法在此次尝试之外的普遍程度,以及是否已有任何机构因此遭到入侵,均不得而知。IDC亚太区网络安全产品与服务高级研究经理Sakshi Grover认为,这项研究是可信的早期预警,而非大规模利用的证据,并指出其成功率尚未经过独立验证。请保持这种审慎的判断。一次被拦截的尝试加上扎实的实验室复现,足以成为部署低成本控制措施的理由,但不足以成为匆忙采购代理安全平台的恐慌理由。
“这里没有需要OpenAI或Anthropic打补丁的东西,”Forever Security表示,并将该手法比作浏览器渲染钓鱼页面的情形:浏览器按设计正常工作,攻击存在于页面本身。
架构上的账单到期了
我见过不少企业把生产凭证交给身份治理还不如暑期实习生严格的工具,而编程代理只是这一习惯的最新版本。HFS Research副实践负责人Akshat Tyagi点出了设计上的核心问题:这些工具把“执行指令”和“授予权限”视为同一种行为。任何网页都能悄无声息写入的Markdown文件,本不应该有能力重新配置代理的沙箱设置或注册一个持久化的MCP服务器。但它做到了,因为代理无法分辨“运行一条构建命令”的指令与“改写自身安全边界”的指令有何区别。

而这种风险也并不罕见。Forever自身的遥测数据显示,约一半客户在Downloads文件夹中运行编程代理,并且大约四分之一的代理会话会打开浏览器。把这两个数字放在一起看:代理所处的位置正是网页可以写入的地方,而且相当一部分时候是代理自己在浏览网页,因此文件落地时没有人在看。Grover的警告将其推而广之,Downloads文件夹只是最方便的一个例子。克隆的代码仓库、共享驱动器以及软件包内容,都是代理在持有有效凭证的同时摄入不可信内容的场所。我们此前报道过这类手法的一种变体:针对GitHub令牌的LiteLLM后门。其模式是:持有凭证的代理和流水线,可以被攻击者通过看似可信的输入触及。
与此同时,据Omdia高级分析师Jonathan Ong介绍,在一项Omdia网络安全决策者调查中,有40%的受访者对其组织保护AI代理的能力只是有些信心或毫无信心。考虑到Downloads里的一个文本文件能做出什么,我会说,那40%是诚实的一群人。
值得投入的防护措施,以及账目
现在说说我真正关心的部分:修复要付出多少成本,与承受攻击要付出多少成本,二者相比如何?修复清单便宜得几乎令人尴尬。Forever自己的建议完全不需要购买任何产品:
- 永远不要在
~/Downloads中启动Codex、Claude Code或任何其他代理,这是网页能够自行写入的唯一文件夹。 - 排查你没有编写过的指令文件:Downloads或刚克隆的代码仓库中一份多出来的AGENTS.md或CLAUDE.md,就是整个攻击。在代理读取之前,先由你自己读一遍。
- 审计代理自身的配置:留意
~/.codex/config.toml中意料之外的服务器配置块,以及项目.claude/settings.json中的ANTHROPIC_BASE_URL或不熟悉的API端点。 - 保持审批提示和沙箱开启,并把任何指示代理关闭它们的指令视为天然的敌意。
- 如果发现植入的文件,就假定登录令牌已经泄露并轮换,被盗的令牌就是一个活跃会话。
这只需要一个下午的策略制定和几条检测规则,算不上预算项目。Ong还建议在平台层面强制执行一项措施:禁用--dangerously-bypass-approvals-and-sandbox这类标志,使代理根本不具备执行高风险操作的授权。当厂商把一个标志命名为“dangerously”(危险)时,请相信他们。
稍贵一点的控制措施来自Kanerika的AI开发经理Amit Kumar Jena,它们对应的是你本就应该具备的治理能力:把指令文件当作源代码来管理,为AGENTS.md、CLAUDE.md及相关配置目录的变更指定专门的负责人审核;软件安装经由内部制品库或扫描代理进行;对于机器上持有生产凭证的开发者,使用隔离的开发环境并采用寿命更短的令牌。Jena把原则讲得很干脆:指令文件可以改变代理尝试做什么,但绝不能改变代理被允许做什么。Grover对厂商的补充要求是:对来自不可信来源的指令文件进行来源验证并要求明确批准,而不是把每一个Markdown文件都视为权威。
结论
这是世界末日吗?不是。这是一次被拦截的尝试、变化不定成功率的实验室复现,以及一条未经验证的投递路径。Grover说得对,这是早期预警,而非伤亡统计。但正是在早期预警阶段,控制措施才最便宜。这里的攻击面,是你自己的代理对指令的服从性,它们用的是开发者的凭证运行,而且运行在你们公司显然有一半人当作工作区使用的文件夹里。
董事会一定会问:如果代理读错了文件,拿着开发者的令牌能做什么?我们为限定这个答案花了多少?如果诚实的回答是“我们还没有限定”,那么一个下午的目录策略、配置审计和令牌卫生,就是本季度你能获得的最划算的投资回报。现在就行动,不是因为天要塌下来,而是因为修复几乎免费,而失败模式是你自己的工具用你自己的凭证背叛你。
来源
本文参考了以下报道与公告:


