端点上的智能体工件

10 分钟读完

S26
运维 · 安全、对齐与智能体安全

你智能体的运营身份,是某人家目录下的一个文件夹。

你为智能体安全建起的每一项控制,都假定被攻击的对象是智能体本身——提示词、工具调用、沙箱。而与此同时,智能体的令牌、它所连接的系统清单,以及一份「它曾被要求过什么」的可检索记录,如今就躺在你并不监控的那些笔记本上的可预测路径里;而商品化的窃密恶意软件,已经开始专门收集这些路径。Gen Threat Labs 在 2026 年 9 月 8 日公布的收集规则里,点名了 Claude、Cursor、Cline、Continue、Codex 与 OpenCode 的工件;把一个新的智能体加进那张清单,是一次配置推送,不是一个新漏洞。要么把开发者端点当作一个有清册的生产面来对待,要么就接受「你权限最高的那份凭据没有主人」。

STEP 1

先把工件集合枚举出来,再去争论用什么控制。

没人守这个面,是因为没人写下过这个面上有什么。那就先做这件事:手工做,在一台真实机器上、针对一套真实的智能体安装。每次都会浮现出五类东西,而它们的糟糕程度并不相同。

  • 凭据。访问令牌、刷新令牌、API 密钥。举例来说,Claude Code 能用操作系统钥匙串时就把登录态放进钥匙串,否则退回到 ~/.claude/.credentials.json、权限位 0600;2026 年 9 月针对该项目的一份报告记录道,这个文件里放着一个在用的访问令牌,旁边是一枚有效期二十七天的刷新令牌。
  • 连接配置。MCP 服务器定义:端点、请求头、环境变量,而且往往还把它们背后那些服务的凭据直接写在里面。
  • 会话与提示词历史。本地数据库与对话记录文件。里面有源码、粘贴进去的密钥、客户名称,以及那些攻击者原本得自己重建的、关于你们系统的推理过程。
  • 项目与会话元数据。哪些仓库、哪些主机、哪些工单、哪些分支。看着不值钱,却是这一集合里对「选目标」最有用的一项。
  • 外壳配置。钩子、放行名单、自动批准设置与技能目录——也就是那些决定「什么可以不问就跑」的文件。见生命周期钩子与外壳配置。

对这张清单的诚实总结是:端点同时握着凭据、凭据能触达什么的地图,以及它被用来做过什么的历史。在一个服务端系统里,这三样东西分处三个不同的信任域、各有三套不同的评审流程。而在一台笔记本上,它们住在同一个目录、同一个用户名下,并且在你的组织架构图上没有主人。

STEP 2

你手上的控制在这里不适用,而「为什么」值得说清楚。

这是各团队会跳过的一步,而跳过它会得出错误的修复——通常是一条「请开发者务必小心」的政策。把真正的控制一项一项过一遍。

  • 权限位是用户边界,不是进程边界。0600 挡的是同一主机上的另一个用户。一个已经上了机器的窃密程序,正是以那个用户的身份在跑,这意味着权限位是被满足了,而不是被绕过了。什么都没坏,什么都不会告警。
  • 你的网关看见的是智能体,不是窃贼。如果一枚被收割走的令牌从别处回放到同一个供应商 API,这个请求看起来就是你的智能体。你的出站控制管的是离开你网络的流量;而这次回放压根没经过你的网络。
  • 密钥管理止步于服务器。面向智能体的密钥管理里那些做法——短租期、运行时注入、静态不落盘——是对的做法,而几乎没人把它们应用到一台工作站上的配置文件。
  • 提示注入防御瞄准的是另一个攻击者。这里没有注入、没有越狱、没有工具投毒,模型压根没有参与。智能体不是被骗了。它是在睡觉时被撬了家。
  • 经济账是朝你反着算的。Gen 公布的那些规则是远程管理的——目录、文件名、扩展名、搜索上限——所以要覆盖一个刚火起来的智能体,只是一次下发到「早已失陷的机器」上的配置更新。Gen 在 2026 年上半年记录到的窃密软件检测,覆盖了 330 万名独立受保护用户。把你的工具链加进那条流水线,边际成本约等于零。
STEP 3

按「它能买到什么」给每件工件定价,而不是按它叫什么。

排序是要紧的,因为这个季度你不可能把五类都修好。请按「持有者仅凭这件工件、不再获取任何进一步访问、也不与你的系统发生交互,能做到什么」来定价。

  • 一枚刷新令牌比一个密码值钱。密码常常会撞上 MFA。刷新令牌是 MFA 之后的那个对象:它无需重新认证即可续期,所以它是一份带着数周时钟的常设授权。至于访问令牌那个短 TTL 为何在这里帮不上忙,见凭据有效期。
  • 一份 MCP 配置比里面任何单一凭据都值钱。它是一张被枚举出来的清单,列着你认为值得给智能体接上的那些系统,连抵达它们的端点与请求头一并在内。它把一次泛泛的盗窃变成一次有针对性的盗窃——这正是配置即侦察的主题。
  • 对话历史比你愿意承认的更值钱。请把一名资深工程师一周的智能体历史,等同于对相关仓库与事故频道的读取权限——因为就内容而言,它几乎真的就是。
  • 项目元数据是这一集合里最便宜的情报。不用解析、不含密钥,只是对「这是哪家机构、他们跑的是什么」给出一个精确答案。

这个排序有一条推论值得直说:轮换了 API 密钥、却把刷新令牌与 MCP 配置原封不动留在那里,不叫补救。那是四件事里最容易的一件,也是最不承重的一件。

STEP 4

把工件清册建起来,用生成的,而不是手写的。

没列出来的东西你无法拥有,而手写的清单一个月内就会过时,因为每一次智能体发版都会挪动文件。请生成它,并把它放在你已经为服务端智能体维护的那份登记册旁边——智能体清册与登记是同一门功夫,只是换了宿主。

  • 每个工件路径、每个工具、每个操作系统一行。macOS、Linux 与 Windows 上的路径不同,而「钥匙串还是文件」这个决定往往是运行时按「钥匙串当时是否解锁」做出的。请把两个分支都记下来。
  • 每一行都带一个负责人与一条撤销路径。谁能杀掉它、用什么机制、要花多久。答案为「不知道」的那些行,就是你真正的发现。
  • 每一行都带一个敏感度等级。用上一步的排序,让这份清册告诉你先修什么,而不是只告诉你有多少。
  • 按固定节奏从工具自己的文档刷新它。智能体 CLI 会在小版本之间改存储位置。请把它当作未固定的供应商默认值:默认值挪了,而没人向你通报。
  • 把笔记本数一数。清册是按工件类型列的;而暴露量是那个数字乘上每一台装了该工具的机器,包括外包人员的那台,和抽屉里的那台。
STEP 5

既然挡不住它被读,就让这件工件更不值钱。

设计目标不是一个读不出来的文件,而是一个「内容会过期或只是指向别处」的文件,于是一次成功的读取,拿到的是一样半衰期很短的东西。有四项改动完成了大部分工作,按回报大致排序如下。

  • 把内联密钥从 MCP 配置里拿掉。改成按名字引用一个密钥,并在启动时从操作系统钥匙串、一个密钥代理或一个短租期的中介那里解析出来。此时配置仍然点出了你的系统,但不再向它们认证——这依然要紧,但它从两件工件变成了一件。
  • 缩短「那一对」,而不是缩短令牌。请向供应商争取那些能把刷新绑到设备、或为工作站安装缩短刷新有效期的选项,并优先采用按项目的凭据而不是一个账号级的统一登录。这就是把受限作用域凭据用到人的机器上。
  • 给本地历史设上保留上限。智能体的对话记录默认永久保留一切,因为用户就想要这样。请设一个保留窗口,并在工具支持的地方做写入即脱敏——与链路记录中的个人信息脱敏同一套论证,只是提前到了数据落到「你管不着的那块盘」之前。
  • 把有特权的那套安装与用来探索的那套分开。能触达生产的那个智能体,不该是那个会打开任意仓库、跑任意 MCP 服务器的同一套安装。一个爆炸半径一套配置档,这是这里能拿到的最便宜的结构性修复。
STEP 6

检测回放,并把你将会需要的那次撤销预演一遍。

就假定某一台笔记本上的工件已经没了。有两个问题决定那一天会怎么过:你会不会知道,以及你能多快让它停下来。这两个问题都不是笔记本上那个端点软件能回答的,因为等你开始问的时候,那份凭据正在一个完全另外的地方被使用。

  • 在 MCP 配置里种一个蜜标。一条任何合法流程都绝不会调用、却指向一个你自己拥有的端点的服务器定义,是这个面上唯一毫不含糊的信号:除了读过那个文件的人,谁也不会去碰它。放置规则见面向智能体系统的蜜标。
  • 对「与该安装不匹配」的供应商侧使用告警。新地区、新客户端指纹、在持有它的那台笔记本睡着时被使用、一份凭据上出现两个并发会话。这就是检测智能体失陷所依赖的那个信号,而它住在供应商那一侧,不在宿主机上。
  • 按工件类别写撤销手册。供应商令牌、被 MCP 引用的服务凭据、缓存下来的仓库令牌。机制不同、负责人不同、生效延迟不同。在事故当中才去发现这些,要花掉你根本没有的几个小时。
  • 拿秒表量一次。在一位志愿者的机器上撤销一份真实的智能体凭据,并记录到下一次调用失败为止的挂钟间隔。这个数字就是别人会向你索要的那个,而这场演练通常会翻出一份没人列过的副本。
  • 提前决定「对话历史失陷」会触发什么。与令牌不同,历史无法被撤销。响应的范围取决于里面有什么——这正是为什么上一步那个保留上限同时也是一项事故响应控制。

这周就从这里开始,按这个顺序。在一位能触达生产的工程师的机器上跑一遍你的清册脚本,并在评审会上把输出念出来——这张清单本身就会完成说服工作。把内联密钥从 MCP 配置里剥掉、换成引用;这是一天的活,而它移走了杠杆最大的那件工件。然后给每套安装种一条蜜标 MCP 条目,并给一次撤销计时。只有在这三件之后,才值得去开「受管设备与全盘加密政策」那场争论——那件事更慢、更政治,而且并不改变文件里装着什么。