
llms.txt 不是说明书,是接口
我看到 Fortune 500 的 AI coding agent 被 llms.txt 诱导执行任意代码时,第一反应不是安全圈又炸了,而是这个间距不对。一个给机器看的说明文件,被放到了网站根目录,长得像 robots.txt,读起来像文档,结果在 agent 眼里变成了可执行指令。数据和动作之间没有留白,攻击就从这里钻进去。
公开研究里有个细节挺扎眼,有安全分析师说,让一家 Fortune 500 的公司跑他们写的代码只用了 4 分钟。他们扫描了 8565 个 llms.txt 文件,分布在 6214 个域名上,覆盖大约 15000 家公司。Fortune 500 里真正放 llms.txt 的比例不算高,只有 7.4%,但这不重要。危险不来自文件有多少,而来自系统默认相信它。一个入口只要足够可信,就够别人把恶意包名、安装命令或者脚本地址塞进去。
做设计系统久了,我会把“描述”和“动作”当成两类控件。按钮是动作,提示是描述,状态文案要克制,不能把风险藏在文字里。llms.txt 的问题在于,它表面是描述,实际可能被 agent 当作动作来源。文件没有签名,没有权限层级,没有沙箱提示,甚至没有告诉 agent 哪些字段只能读、哪些字段需要确认。对设计师来说,这就是语义错误。一个看起来像 README 的东西,不应该拥有安装依赖的权力。
交互流程可以优化。现在 agent 的工作链常常是读需求、找文档、解析说明、安装依赖、执行命令。llms.txt 出现在“找文档”这一步,默认进入上下文。问题不是它能不能被读取,而是它为什么能直接改变后续动作。最近用 WorkBuddy 三周,我有个很深的体会,规则里必须把条件写死,比如客户分级要限定最近 6 个月、累计成交额、操作范围,否则系统会拿别的字段,结果看着都对,实际不合预期。n8n 我也用了一阵子,自动化一旦把“读取”和“执行”连得太顺,脏数据就会变成坏动作。llms.txt 也是同一类坑,只是对象从表格换成了 AI agent。
这背后其实是一个视觉语言问题。以前我们讨论界面,说的是按钮、留白、层级、反馈。现在 AI agent 的界面不只是屏幕,还包括文件命名、默认路径、信任边界、可被解析的上下文。llms.txt 放在根目录,本身就是一种强暗示:这里的东西是给机器看的,而且机器应该照做。这个暗示比任何图标都大。Fortune 500 公司可能把它当 AI SEO,或者当爬虫友好说明,但 agent 把它当接口。接口就有权限,接口就有攻击面。
供应链攻击也不是新词,过去是包管理器,是依赖库,是镜像源。现在多了一条路:把说明文件变成投毒入口。研究者也提到 issue 标题、PR 描述、注释这类文本能触发 prompt injection,Claude Code、Gemini CLI、GitHub Copilot 这类工具都被放进讨论里。这意味着问题不只在一个 txt 文件,而在整个 agent 工作流。只要 agent 会读外部文本,并基于文本决定动作,文本就可能变成代码。
安全团队可能会说,要做白名单、签名、沙箱、审批。这些都对,但不够。用户体验也要跟上。不能只给 agent 一个“是否允许执行”的弹窗,最后所有人都会盲点确认。更好的设计是把风险可视化:这个依赖来自哪里,会不会改文件,会不会访问网络,有没有签名,变更范围多大。像设计系统发布版本一样,diff 要清楚,影响要清楚,回滚要清楚。安全不应该是最后一道警报,而应该是每一步都能看见的边界。
所以这篇新闻真正让我警惕的,不是 llms.txt 有多危险,而是越来越多“给 AI 看的说明”正在变成系统入口。我们以前以为文档只是文档,现在文档开始拥有权力。下一个问题是,当一个文件放在网站根目录,默认被 agent 读取,我们该把它当说明书、接口,还是权限申请页。
📌 本文编译自 Hacker News,原文:https://www.tomshardware.com/tech-industry/artificial-intelligence/researchers-easily-trick-fortune-500-companies-ai-agents-into-running-arbitrary-code-supply-chain-attack-via-llms-txt-guidance-file-illustrates-how-data-has-become-code
版权归原作者所有,本文为基于公开报道的编译与独立分析。
物界前沿