一份伪装成工程笔记的文件
10 月 27 日,安全公司 Forever Security 披露了一起已经发生在真实客户机器上的攻击。攻击者把一个名为 AGENTS.md 的文件放进了用户的取目录,伪装成工程笔记。用户在那个目录里启动编码智能体时,智能体把这份文件当成了项目的可信指令。
后面的链条一路顺了下去:智能体按文件里的要求改写了自己的配置文件,接着尝试安装一个恶意的 NPM 包,并伺机取走登录令牌与凭据。Forever Security 在客户机器上发现了这次攻击,并阻断了后续动作,其中就包括那次安装尝试。
研究方给出的复现数据是:同一条攻击链在 OpenAI Codex 上成功率超过九成,在 Anthropic Claude Code 上大约五成。成功率会随安装路径等因素浮动。更值得留意的是他们对自己客户群的观察——约半数客户会在取目录里运行编码智能体,四分之一的智能体会话会打开真实浏览器。这两个比例合起来,意味着这类攻击的适用面已经铺好了。
没有补丁,因为它在按设计工作
这起事件最别扭的地方在于:它没有对应的软件缺陷。智能体读取所在目录里的指令文件,本来就是它被设计成要做的事。厂商也没有东西可修——Aviatrix 的威胁研究直接写明,出现这种行为的智能体是在按设计运行,因此不会有补丁。
根子在于安全模型的假设换了人。为保护人类用户设计的那套假设里,目录里的东西是用户自己放的,人能分辨哪份文件可信,执行前会看一眼再确认。这三句话全建立在「有个会判断的人在场」之上。智能体接手之后,目录内容自动进入上下文,指令与数据之间的界线被抹平,照做反而成了正确行为。
这也是为什么这类攻击被归到间接提示注入,却比传统的提示注入更难处理:注入的载体不是一段用户粘贴的文本,而是一个本来就该被读取的文件。它站在信任链的内侧。
同一周,另外两处也在响
把时间线拉到同一周,会看到另外两处披露。一处是 OpenHands Software Agent SDK:1.52.0 之前的版本里,Docker 与 Apptainer 的工作区启动器把沙箱服务绑在了全部网卡上,而会话密钥列表默认为空,等于默认免认证——能连到该端口的人可以以 root 身份在沙箱里执行命令、读取挂载的工作区、从机密存储里取出明文。CVSS 3.1 得分 9.8。
另一处在工具协议层:Google 的 MCP Toolbox for Databases 在 1.2.0 至 1.4.0 版本之间,云存储数据源存在路径遍历叠加缺失授权的问题,未认证的远程攻击者可以用构造过的工具调用参数,把主机文件复制到外部存储桶,或者覆盖本地文件。CVSS 4.0 得分 9.3。同一批公告里还有 Cloud Run MCP 的存储桶抢占问题,得分 7.7。
三件事分属不同层,但讲的都是同一句话:智能体的薄弱点正在从模型本身下沉到它跑在什么上面、读到什么、被谁配的。而就在同一周,凭证层拿到了一笔 4000 万美元的 B 轮融资,主张只给访问、不给钥匙。
三盆冷水
其一是研究方的公开材料仍然有限。目前能看到的只有企业的风险通告和媒体的整理版本,具体样本量、客户行业分布、以及那次 NPM 包安装的完整时间线都没有公开。覆盖面有多大,暂时无法判断。
其二是「约半数客户在取目录里跑智能体」这个数字,来自一家安全公司自己的客户群。这类客户通常本身安全投入就偏高,能不能推广到一般开发者群体,是个问号。
其三是防御建议目前还停留在操作层面:别在取目录里跑编码智能体、检查项目里有没有不是自己创建的文件、保持审批与沙箱开启、怀疑失守就轮换全部凭据。这些建议都有效,但都是让人去记、去查,缺少一层能自动生效的机制。
三个观察哨
一是指令文件的来源校验。既然靠目录位置判断可信度已经不成立,接下来看有没有厂商给 AGENTS.md 这类文件加上签名或来源标记,而不是继续靠「它在项目根目录下」默认放行。
二是默认安全会不会变成采购条款。沙箱绑全部网卡、密钥列表为空即免认证,这类默认配置在过去只是文档里的一行提醒;如果采购方开始把它写进硬性要求,厂商的默认值才会真的变。
三是凭证层的归属。它现在是独立赛道,还是会被身份与访问管理吸收进去,半年内应该能看出走向。本站会持续跟进这几条线的迭代动态。