配置即侦察

12 分钟读完

S12
深入解析 · 智能体安全

钱全花在系统上了,索引却白送了出去。

侦察曾经是一次入侵里最贵、最吵的阶段:要扫上几周,才能弄清内部有哪些服务、哪些真要紧、以及怎么向它们认证。而如今智能体部署会把这个答案当成构建产物生产出来。一份 MCP 配置、一张工具目录、一张 agent card、一个链路存储——每一样都是一份经过挑选、保持最新、机器可读的清单,列着你认为值得给智能体接上的那些系统,端点与认证线索一并俱全;而其中每一样,所受的管控都比它所点名的任何一个系统更弱。防御方的难题是没人能把自家智能体清点清楚。攻击方的优势是智能体把你清点好了。

STEP 1

侦察要花多少成本,而一份工具清单替掉了其中的哪一块。

请诚实地给攻击者的工作定价,因为整套论证都压在这个对比上。要手工建起一张有用的内部地图,入侵者得发现主机、探测服务、从两百个端点里猜出哪个是承重的、再逐个弄清各自的认证方式,而且得在制造出「正好是你的检测所针对的那种流量」的同时完成这一切。这里头大部分精力并不是为了拿到访问权——他们早就有了落脚点——而是为了弄清相关性。扫描告诉你有什么存在。它不告诉你什么要紧。

一份工具清单直接回答了那个昂贵的问题。它是一张短清单而不是长清单,而这本身就是信号:你们团队里有人判定过,正是这几个系统值得去做集成。每一条都点出一种传输方式与一个端点,通常还记录了认证方案,并且常常用散文描述这个系统是干什么的——因为那段描述之所以存在,是为了帮模型做选择,而模型需要的定位信息,与入侵者需要的是同一份。

  • 它经过挑选。按构造就是按业务相关性排过序的,因为没人会为一个没人用的系统写 MCP 服务器。
  • 它保持最新。过期的配置会让智能体坏掉,所以它会被修。你的网络拓扑图没有这种强制力。
  • 它在结构上已经预告了认证。就算把密钥都拿掉,请求头的名字与环境变量的名字也已经披露了认证模型,而这正是一次凭据撞库或令牌回放所需要知道的绝大部分。
  • 它机器可读。不用去解析截图或文档。这个格式本就是设计给程序消费的,而消费它的那个程序,不一定得是你的。

那个让人不舒服的框架是:让一张工具目录对智能体好用的那些性质,恰恰就是让它对攻击者好用的那些性质。两者都是通用的消费方,抵达时对你的资产一无所知,都需要找到通往目标的最短路径。你对目录做的每一次可用性改进——更好的描述、更清楚的作用域、更丰富的错误语义——对这两位读者都是改进。这不是反对做好目录的论证,而是一个提醒:去注意你把它的哪些副本随手扔在了哪里。

STEP 2

这份索引存在于六个地方,而每一份副本的管控都不一样。

接受了这个前提的团队,通常仍然把范围估错,因为他们脑子里想的是一个文件。这份枚举在整个生命周期里被复制了多份,而最弱的那份副本决定了你的暴露量。

  • 工作站上的配置。开发者家目录里的 MCP 服务器定义,而且内联凭据的情况多于不内联。商品化窃密软件在 2026 年把这些路径加进了收集规则;具体的家族与路径见端点上的智能体工件。
  • 登记册或目录。那份权威清单,通常管控最好,而在公司内部的读取面也最宽——一说出口就会发现这是个古怪的组合。工具目录生命周期把它当作一项可用性资产;它同时也是一项保密性资产。
  • 对外发布的发现文档。agent card 与 well-known 端点之所以存在,就是为了被你尚未打过交道的各方抓取。这正是它们的用意,而这是一次有意的披露——见agent card 与发现。
  • 链路记录。每一条 span 都记着一个工具名,常常还有一个端点,以及那些会泄漏标识符格式、租户名称与数据结构形状的参数。链路存储的读者比任何一个生产数据库都多,保留时间也比任何人的本意都长——见链路采样与保留。
  • CI 与运行时环境。那些能把同一张清单重建出来的环境变量与任务定义,任何能读到一个工作流文件或一段构建日志的人都看得见。
  • 评测夹具与录制下来的会话。没人记得的那份副本。回放语料与「标准答案」对话记录里装着真实端点与真实参数,住在拥有普通开发者访问权限的仓库里,而且很少被纳入任何一次数据分级工作的范围。

把这六项连同一列「读取权限」写下来,结论通常立刻就浮出来:你那份关于内部攻击面的权威记录,其可读主体数量显著多于它所描述的那些系统。这不是因为有谁这么决定过——而是因为每一份副本都是由不同的团队、为解决不同的问题而造出来的。

STEP 3

链路记录是会长大的那份副本,而参数是最扎人的那部分。

配置是一张快照;链路记录是一条流,而它会积攒起配置给不了攻击者的那一样东西:被观察到的用法。配置说有一台计费 MCP 服务器存在。一周的链路记录则会说:它的哪些工具被调用、以什么顺序、用什么标识符格式、由哪些智能体、在一天的什么时段,以及哪些调用会以什么报错失败。那已经不再是一份清册了。那是一份关于你运营的、能跑起来的模型。

有两条机制让这件事比看上去更糟。第一,工具参数是 span 里内容最丰富、同时最不可能被脱敏的字段,因为把它们脱掉正是让一条链路记录对排障变得无用的做法——这就是链路记录中的个人信息脱敏背后那道诚实的张力。第二,错误字符串本就是为了帮上忙而写的。一个设计良好的工具报错,会告诉模型它哪里错了、该怎么改——而这跟攻击者把一个被拒请求变成一个被接受请求所需要的那句话,是同一句。

而这条流并不会乖乖留在你放它的地方。Transluce 在 2026 年 9 月对一个公共 URL 扫描服务的检视发现,37,649 份报告里有 6,467 份带着智能体活动的强证据,连目标、时间戳与载荷一并在内——因为那些为绕开拦阻而改道的智能体,把自己的尝试提交给了一个「以发布为产品」的中间方。一般情形说起来很简单,却极易被漏掉:你的智能体向之上报的每一个第三方,都握着你这份索引的一份局部副本,适用的是他们的保留策略与他们的泄露披露时限,不是你的。

给任何链路存储用的一个好使的严重性测试:挑一周的数据,把提示词与回复整段丢掉,然后请一位不在该系统上工作的同事,仅凭工具名、端点与参数把架构重建出来。如果他画得出来,那任何有读取权限的人也画得出来——而链路记录的读取权限,通常是默认授予整个工程组织的。

STEP 4

对外发布的发现是一次交易,而这笔交易只在没定价时才算糟。

这里头并非全是无心之失。智能体之间的互操作性要求:一个智能体能被找到,且它的能力在任何关系建立之前就可被读懂——这正是能力发现的前提,也是agents.json 与面向智能体的 OpenAPI 里那套 well-known URI 约定的前提。没有披露就没有互操作。装作不是这样,只会得到最糟的那个结果:一张已经发布出去、却没人把它当成已发布来对待的卡片。

区分「定过价的交易」与「没定价的交易」的,是分层。一张同时服务匿名发现、伙伴集成与内部编排的卡片,会按这三类受众里最难的那一类来写,然后被最容易的那一类读到。

  • 把匿名层与认证层分开。匿名调用方拿到的是「存在性、协议版本与联系方式」。能力细节、工具 schema 与端点,放到认证之后。这多花一个往返,却移走了绝大部分免费情报。
  • 描述能力,不要描述拓扑。「可以查询发票状态」是交易对手需要的。「在 8443 端口上调用 billing-internal.corp」是入侵者需要的,而它之所以在卡片里,是因为从配置生成它更省事。
  • 把这张卡片当成一个有变更流程的对外接口。它是一个已发布的 API 表面。从内部配置自动生成它,正是拓扑在无人作决定的情况下外泄的方式——而这恰恰是MCP 安全反模式在服务端一侧所编目的那个错误。
  • 记录是谁抓取了它。发现流量是一个信号,而几乎没人去收。有人突然把你的 well-known 端点扫了一遍,这是这个面上能拿到的最便宜的早期预警。
STEP 5

把「名字」与「路由」之间那次连接打断。

结构性的修复比乍看上去窄得多。你不需要隐藏你的智能体能做什么;你需要的是让目录的每一份副本都不再同时是一张路由表。攻击者抽走的大部分价值,来自那次连接——这项能力、那台主机、这套认证方案,装在同一条记录里。

  • 引用密钥,永不内联。一份「点出密钥名字」而不是「装着密钥」的配置,是一件工件而不是两件;而这条做法在面向智能体的密钥管理里早已写明。这是这张清单上回报最高的单项改动。
  • 在目录与拓扑之间放一道网关。如果智能体通过一个中介按逻辑名字来寻址工具,那配置里装的就是名字,而路由住在一个受控的地方。它顺便还给了你一个做策略的收口点,而这通常就是它被立项的理由;至于侦察方面的收益,是没人去算的那一项。
  • 能用的地方,在参数里用不透明句柄。会暴露租户、地域或数据结构的标识符,会把每一条链路记录都变成一本数据字典。不透明句柄同时也是指名类攻击的解法——被混淆的代理人那套论证,从另一个方向抵达了同一条建议。
  • 把登记册划为「皇冠珠宝」级数据,并据此收窄它的读取权限。多数机构把目录的读取权开放给所有人,因为那感觉像文档。请先判定它究竟是文档还是地图,再把 ACL 设成与答案相符。
  • 在导出器处脱敏端点,而不是在应用里。一条在采集器侧把主机与路径从 span 里剥掉的规则,是可强制、且统一的;而指望一百个调用点都小心谨慎,两样都不是。
  • 让你忘掉的那些副本过期。评测夹具、录制下来的会话与旧的链路记录桶,活得比它们所描述的系统更久,而这让它们比当前的那些更糟——它们点名的是已经没人在看的主机。
STEP 6

把攻击者的那道查询,拿来对自己跑一遍,以此来量化它。

在有人把那件产物真正做出来之前,整个话题都停留在修辞层面,这正是为什么最后一步是一场演练而不是一项控制。这场演练很便宜,一个下午就够,而它把一套论证变成了一份你的管理层能据以行动的文档。

一次只拿一件工件——一位开发者的 MCP 配置、一周的链路记录、你对外发布的 agent card、一个评测夹具目录——并且仅凭这件工件、不借任何其他访问权,回答一个问题:列出这家机构认为重要的那些内部系统,并给出各自的路由与认证方案。把答案写出来。那张清单的长度,就是这件工件所对应的暴露量;而这个练习总会在两点上让人意外:清单比预想的长,而最好的那个单一来源,很少是被锁得最严的那个。

  • 按工件打分,不要按环境打分。你想知道的是先修哪一份副本,而答案通常是读取面最宽的那份,而不是内容最丰富的那份。
  • 每次目录变更之后重跑。加一个工具,也给攻击者那张清单加了一行;工具目录生命周期里已经有一道评审闸门可以把这件事挂上去。
  • 与「可触达集合」那个练习配对做。任务范围问的是一次运行可能碰到什么;这里问的是一个读者可能学到什么。两者都产出清单,而两张清单之差,会告诉你披露在哪里跑到了访问权前面。
  • 把它报成一个数字。「仅凭这一个文件,攻击者就能学到十四个内部系统的名称、路由与认证方案」这句话的落地效果,是任何架构论证都达不到的。

这周就对读取面最宽的那件工件把演练跑一次——在多数公司里,那是链路存储,不是配置文件。然后只做两处改动:把内联密钥从智能体配置里剥掉,让这份索引不再能认证;再加一条采集器侧的规则,把主机与路径从 span 里丢掉,让这条流不再继续扩充你那张地图。两件都是以天计的活。网关、分层的 agent card 与登记册 ACL 复核才是接下来该做的事,但它们是以季度计的;而等演练的产出摆在桌上之后,为它们要到预算会容易得多。