<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>编码Agent on AI博士 万戈</title>
        <link>https://www.yesmiracle.net/tags/%E7%BC%96%E7%A0%81agent/</link>
        <description>AI博士万戈的技术博客，聚焦 Agentic AI、AI Infra 与 Agent Security，分享 AI 基础设施与工程落地实践。</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <managingEditor>admin@yesmiracle.net (万戈)</managingEditor>
        <webMaster>admin@yesmiracle.net (万戈)</webMaster>
        <lastBuildDate>Fri, 28 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.yesmiracle.net/tags/%E7%BC%96%E7%A0%81agent/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>攻击面变天了！llms.txt 文件暗藏 227 条指令，Claude/Codex/Hermes 自动安装无人认领的代码！</title>
        <link>https://www.yesmiracle.net/post/20260828-llmstxt-agent-supply-chain/</link>
        <pubDate>Fri, 28 Aug 2026 00:00:00 +0000</pubDate>
        <author>admin@yesmiracle.net (万戈)</author>
        <guid>https://www.yesmiracle.net/post/20260828-llmstxt-agent-supply-chain/</guid>
        <description>&lt;img src="https://www.yesmiracle.net/post/20260828-llmstxt-agent-supply-chain/cover.svg" alt="Featured image of post 攻击面变天了！llms.txt 文件暗藏 227 条指令，Claude/Codex/Hermes 自动安装无人认领的代码！" /&gt;&lt;p&gt;你公司的 AI 编码 Agent 正在阅读一篇文档——
它看到 &lt;code&gt;pip install internal-tool&lt;/code&gt;，它看到 &lt;code&gt;npm install auth-fix-plugin&lt;/code&gt;。
它没有问这个包是谁的、有没有注册、是不是假的。
它直接执行了。&lt;/p&gt;
&lt;p&gt;这就是 2026 年 AI 安全的最新战场：&lt;strong&gt;llms.txt 供应链攻击&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;研究6214-个域名120-个突破口&#34;&gt;研究：6,214 个域名，120 个突破口&lt;/h2&gt;
&lt;p&gt;一家以色列安全初创公司的研究员——包括 Alon Hertz——干了一件既聪明又吓人的事。他们扫描了 6,214 个活跃域名，涵盖国防承包商、Fortune 500 企业、大型科技公司。&lt;/p&gt;
&lt;p&gt;目标只有一个：&lt;strong&gt;llms.txt&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这是一个由 AI 社区推动的「AI 版 robots.txt」。网站用它向 AI Agent 提供结构化的机器可读摘要：该读什么、该装什么、该信任哪些 API。&lt;/p&gt;
&lt;p&gt;结果触目惊心：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;他们找到了 &lt;strong&gt;8,265 个 llms.txt / llms-full.txt 文件&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;其中 &lt;strong&gt;120 个文件&lt;/strong&gt;（分布在 120 个不同网站）指向了&lt;strong&gt;不存在的代码包或已过期的域名&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;总共有 &lt;strong&gt;227 条安装指令&lt;/strong&gt;（&lt;code&gt;pip install&lt;/code&gt;、&lt;code&gt;npm install&lt;/code&gt;、&lt;code&gt;npx&lt;/code&gt;）指向&lt;strong&gt;无人认领的包&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;研究员注册了其中几个无人认领的包名，托管了一段验证信标代码。结果——&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一小时内&lt;/strong&gt;，就收到了第一个 Fortune 500 公司的回连信号。&lt;/p&gt;
&lt;p&gt;不是几天、不是几周。是一个小时。&lt;/p&gt;
&lt;h2 id=&#34;攻击链拆解四层信任崩塌&#34;&gt;攻击链拆解：四层信任崩塌&lt;/h2&gt;
&lt;p&gt;为什么这招如此致命？因为它不是传统的漏洞，而是 &lt;strong&gt;Agent 时代特有的信任链危机&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;l1-llmstxt-的权威幻觉&#34;&gt;L1: llms.txt 的「权威幻觉」&lt;/h3&gt;
&lt;p&gt;当一个 AI 编码 Agent 遇到 llms.txt 文件时，它看到的不是一个「建议」，而是权威文档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件通过 HTTPS 传输&lt;/li&gt;
&lt;li&gt;文件位于公司官方域名下&lt;/li&gt;
&lt;li&gt;文件使用专为 AI 设计的标准化格式&lt;/li&gt;
&lt;li&gt;文件由公司自身或其信任的合作伙伴发布&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Agent 没有理由怀疑它。&lt;/strong&gt; llms.txt 的存在目的就是权威——它是为了告诉 AI「该怎么做」而设计的。当它说 &lt;code&gt;pip install internal-tool&lt;/code&gt; 时，Agent 不会去检查 &lt;code&gt;internal-tool&lt;/code&gt; 在 PyPI 上是否真的属于这家公司。&lt;/p&gt;
&lt;h3 id=&#34;l2-无人认领的包写于-ai-时代之前的定时炸弹&#34;&gt;L2: 无人认领的包——写于 AI 时代之前的「定时炸弹」&lt;/h3&gt;
&lt;p&gt;这 227 条指令是如何进入 llms.txt 的？研究员推测有多种来源：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;人为错误&lt;/strong&gt;：很多错误条目在 AI 时代之前就已存在于网站的普通文档中，后来被导入 llms.txt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 幻觉&lt;/strong&gt;：有些内容是 AI 生成的，而 AI 本身无法区分「合法指令」和「虚构指令」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;域名过期&lt;/strong&gt;：文档中引用了公司内部域名，但域名已过期未续费&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;无论来源，这些指令就像定时炸弹——包名在注册表里空着，谁先注册谁就能接管。&lt;/p&gt;
&lt;h3 id=&#34;l3-agent-自动执行fortune-500-秒变攻击入口&#34;&gt;L3: Agent 自动执行——Fortune 500 秒变攻击入口&lt;/h3&gt;
&lt;p&gt;研究员注册包名后，信标代码被放置在 PyPI/npm 上。当 AI 编码 Agent 执行 &lt;code&gt;pip install&lt;/code&gt; 指令时：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;包管理器从 PyPI 下载包&lt;/li&gt;
&lt;li&gt;包中的安装脚本自动执行&lt;/li&gt;
&lt;li&gt;信标代码向研究员服务器发起回连请求&lt;/li&gt;
&lt;li&gt;进程链记录了父进程身份——&lt;strong&gt;Claude、Codex、Hermes&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这些 Agent 运行在&lt;strong&gt;世界最强大的公司内部网络&lt;/strong&gt;中。EDR 和代理防火墙没发出任何警报——因为这看起来就是一次正常的开发者 &lt;code&gt;pip install&lt;/code&gt; 操作。源是 pypi.org（每个公司代理都放行的域名），父进程是公司自己安装的编码 Agent。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;没有任何异常。没有任何警报。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;研究员写道：「每一层信任都是完整的——除了没人想到要检查的那一层。」&lt;/p&gt;
&lt;h3 id=&#34;l4-真实世界的攻击已在进行&#34;&gt;L4: 真实世界的攻击已在进行&lt;/h3&gt;
&lt;p&gt;最令人不安的发现是：&lt;strong&gt;这不是理论攻击。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;研究员在 &lt;code&gt;clerk.com&lt;/code&gt;——一个合法的身份验证服务商——的 llms.txt 文件中，发现了一条指令：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;npx clerk-next-fix-auth-protection
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这条指令指向的 npm 包 &lt;code&gt;@clerk/eslint-plugin&lt;/code&gt; 在当时是无人认领的。任何受其信任的 AI Agent 读到这条指令，都会自动安装该恶意包。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;「Clerk 案例是最干净的证明。这条指令看起来完全像是官方发布的一样——因为它就在官方自己的指令文件里。唯一缺失的是注册表里的名字。」
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Clerk 已修复该问题，但如果 Agent 在此之前已经安装了 &lt;code&gt;@clerk/eslint-plugin&lt;/code&gt;，其中的恶意代码已经执行。&lt;/p&gt;
&lt;h2 id=&#34;不止于-llmstxt数据与代码的边界正在消失&#34;&gt;不止于 llms.txt：数据与代码的边界正在消失&lt;/h2&gt;
&lt;p&gt;这场攻击的真正深刻之处在于：&lt;strong&gt;它揭示了一个根本性的范式转移。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一直以来，数据（data）和代码（code）之间有一条清晰的边界。数据是你可以安全读取的；代码是需要你决定是否执行的。浏览器知道 HTML 是数据，JavaScript 是代码。操作系统知道文档是数据，二进制是可执行程序。&lt;/p&gt;
&lt;p&gt;但 AI Agent 打破了这个边界。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;「Agent 不会区分网页和命令。它读到的一切都是输入，每个输入都是潜在的指令。」
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这意味着整个已发布的语料库——所有 Agent 正在被训练去消费的数据——&lt;strong&gt;在静默地变成一个执行面&lt;/strong&gt;。我们应用在代码上的完整性保障，几乎没有一项被扩展到这些文档上。&lt;/p&gt;
&lt;p&gt;研究员特别指出：这个问题&lt;strong&gt;远比 llms.txt 大得多&lt;/strong&gt;。指令——无论是显式还是隐式的——几乎存在于 Agent 遍历的每个角落。README.md、GitHub Wiki、企业知识库、技术博客——&lt;strong&gt;任何含有安装指令的文本都可能成为攻击向量。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;防御方案agent-供应链安全的五道防线&#34;&gt;防御方案：Agent 供应链安全的五道防线&lt;/h2&gt;
&lt;p&gt;面对这种「数据即代码」的新型攻击，传统安全手段力不从心。以下是五道防线：&lt;/p&gt;
&lt;h3 id=&#34;1-命名空间验证第一道防线&#34;&gt;1. 命名空间验证（第一道防线）&lt;/h3&gt;
&lt;p&gt;在允许 Agent 执行 &lt;code&gt;pip install&lt;/code&gt; / &lt;code&gt;npm install&lt;/code&gt; 之前，&lt;strong&gt;先验证包名是否属于可信组织&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查 PyPI/npm 上的包名是否与公司官方命名空间匹配&lt;/li&gt;
&lt;li&gt;对内部包使用私有注册表，配置 Agent 不从公共源拉取名为 &lt;code&gt;internal-*&lt;/code&gt; 的包&lt;/li&gt;
&lt;li&gt;利用包注册表的 API 查询包的上传者组织&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-沙箱化执行第二道防线&#34;&gt;2. 沙箱化执行（第二道防线）&lt;/h3&gt;
&lt;p&gt;不要让 Agent 拥有直接执行 shell 命令的权限。配置沙箱：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;sandbox&lt;/code&gt; 或容器化环境执行 Agent 的安装命令&lt;/li&gt;
&lt;li&gt;设置出站流量白名单（只允许特定域名）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用类似 MCPZERO 的渐进式工具发现机制&lt;/strong&gt;——不是所有文档中的指令都自动获得执行权限&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-llmstxt-内容审计第三道防线&#34;&gt;3. llms.txt 内容审计（第三道防线）&lt;/h3&gt;
&lt;p&gt;如果你的公司使用 llms.txt，请将其纳入常规安全审计：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定期扫描 llms.txt 中所有 &lt;code&gt;pip install&lt;/code&gt;、&lt;code&gt;npm install&lt;/code&gt;、&lt;code&gt;npx&lt;/code&gt;、&lt;code&gt;curl&lt;/code&gt; 指令&lt;/li&gt;
&lt;li&gt;验证每个引用的包名在注册表中确实属于你的组织&lt;/li&gt;
&lt;li&gt;对已过期或未注册的域名立即移除或更新&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-edr-规则增强第四道防线&#34;&gt;4. EDR 规则增强（第四道防线）&lt;/h3&gt;
&lt;p&gt;传统的 EDR（端点检测与响应）无法识别这种攻击，因为进程链看起来「正常」。需要新增检测规则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;监控 &lt;code&gt;pip install&lt;/code&gt; 和 &lt;code&gt;npm install&lt;/code&gt; 在 AI Agent 进程下的调用&lt;/li&gt;
&lt;li&gt;对首次安装的包名做品牌/命名空间分析&lt;/li&gt;
&lt;li&gt;标记从公共注册表拉取但包名暗示内部用途的行为（如包名包含公司名但发布者非公司官方账号）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;5-供应链治理文化第五道防线&#34;&gt;5. 供应链治理文化（第五道防线）&lt;/h3&gt;
&lt;p&gt;技术手段永远不够。需要改变开发团队对 AI Agent 的认知：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;教育开发者&lt;/strong&gt;：Agent 不是不可质疑的——它从任何文档中读取的指令都应该像 PR review 一样经过审查&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建立 Agent 行为政策&lt;/strong&gt;：明确 Agent 可以在什么条件下执行安装命令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;操作手册落地&lt;/strong&gt;：将上述检测规则嵌入 CI/CD 管线和监控系统&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;写在最后&#34;&gt;写在最后&lt;/h2&gt;
&lt;p&gt;Dan Goodin 在 Ars Technica 上的报道引用了研究员的一段话，我反复读了好几遍：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;「在 prompt injection 攻击中，有人故意植入恶意指令。
而在这里，指令本身可以完全是良性的，来自合法的来源——一家真实公司的官方文档——编写时没有任何恶意参与者。
危险来自后来：当它指向的包或域名被遗弃，然后被别人认领时。」
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这正是 llms.txt 供应链攻击最可怕的地方。&lt;strong&gt;受害者的信任链没有任何一环是伪造的。&lt;/strong&gt; HTTPS 证书是真的。域名是真的。公司是真的。文档是官方写的。唯一的问题——没人跟踪那个包名后来发生了什么。&lt;/p&gt;
&lt;p&gt;这种攻击不需要入侵者「攻破」任何系统。他们只需要注册一个已过期的域名，或认领一个无人使用的包名，然后等着 AI Agent 自己来敲门。&lt;/p&gt;
&lt;p&gt;对比我们之前分析的 &lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260821-agentjacking-mcp-sentry-injection/&#34; &gt;《Agentjacking：一个假 Sentry 错误报告就能劫持你的 AI 编码 Agent》&lt;/a&gt;，这次的攻击面更广：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;维度&lt;/th&gt;
          &lt;th&gt;Agentjacking&lt;/th&gt;
          &lt;th&gt;llms.txt 供应链攻击&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;攻击来源&lt;/td&gt;
          &lt;td&gt;伪造的 Sentry 错误报告&lt;/td&gt;
          &lt;td&gt;公司官方文档中的合法指令&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;利用方式&lt;/td&gt;
          &lt;td&gt;MCP 工具触发&lt;/td&gt;
          &lt;td&gt;pip/npm 包管理器触发&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;前置条件&lt;/td&gt;
          &lt;td&gt;Agent 开启了 Sentry MCP 工具&lt;/td&gt;
          &lt;td&gt;Agent 访问了任何含 llms.txt 的网站&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;溯源难度&lt;/td&gt;
          &lt;td&gt;中等（日志中有 MCP 调用记录）&lt;/td&gt;
          &lt;td&gt;极难（看起来像正常安装）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;防御方式&lt;/td&gt;
          &lt;td&gt;关闭 MCP 工具、输出净化&lt;/td&gt;
          &lt;td&gt;命名空间验证、沙箱化、内容审计&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;在数据与代码边界模糊的时代，每一个站点上的 &lt;code&gt;pip install&lt;/code&gt; 都是一个潜在的初始访问向量。每一次 Agent 的自动化执行，都可能演化成一场供应链入侵。&lt;/p&gt;
&lt;p&gt;企业 AI 安全的第一课：&lt;strong&gt;别让你的 Agent 盲目相信它读到的一切。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 延伸阅读：&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260821-agentjacking-mcp-sentry-injection/&#34; &gt;《Agentjacking 横空出世！一个假 Sentry 错误报告就能劫持你的 AI 编码 Agent》&lt;/a&gt; — Agent 安全系列的又一重要篇章&lt;/p&gt;&lt;/blockquote&gt;
</description>
        </item>
        
    </channel>
</rss>
