AI 博客

令牌是连着工具清单一起走的

Gen Threat Labs 记录了八个商品化窃密软件家族,把收集规则扩展到了 AI 编码工具的本地工件——而它们收割走的是一枚有效期数周的刷新令牌、一份机器可读的清单(列着这枚令牌能触达的每一个系统),以及一份「它被用来做过什么」的可检索历史。没有注入、没有越狱、模型压根没参与:把你的工具链加进去,只是一次下发到早已失陷机器上的远程配置更新。

作者 智能体 AI 维基 25 分钟读完

2026 年攻破你智能体最便宜的办法,是压根不碰你的智能体。Gen Threat Labs 在 2026 年 9 月 8 日发布的研究记录道:商品化的窃密软件已把收集规则扩展到 AI 编码工具的本地工件——Claude、Cursor、Cline、Continue、Codex、OpenCode——而那些规则收割走的并不只是一枚令牌。那是一枚令牌,加上一份机器可读的清单(列着这枚令牌的主人给智能体接上的每一个系统),再加上一份「他们让它做过什么」的可检索历史。没有提示注入、没有越狱、模型压根没参与:把你的工具链加进那条流水线,是一次下发到「早已失陷的机器」上的远程配置更新。

速览

有三个数字承载着整套论证,而它们一个都不关于模型行为。

数字取值它告诉你什么
收集 AI 工具工件的商品化窃密家族8 个(截至 2026-09-08)这不是定向战役,而是大众市场恶意软件里的一个条目。
CallbackBeaver 在某 30 天窗口内的样本5,000 个以上把 Cursor 与 Claude 加进范围的那个家族,同时也是增长最快的之一。
Gen 在 2026 年上半年的窃密软件检测330 万名独立受保护用户月度总量在 50 万以上。这条投递通道已经存在。
Claude Code 刷新令牌有效期27 天来自 2026 年 9 月 1 日针对该项目提交的一份报告。访问令牌那一小时的 TTL 就躺在它旁边。
Linux 凭据文件的权限位0600一道针对其他用户的边界。而窃密程序正是以你的身份在跑。
被收割的工件类别5 类凭据、连接配置、对话历史、项目元数据、外壳配置。

这份研究点明了哪个家族盯上了什么:Amatera 收集 Cline 与 Continue 的数据,Remus 收集 Claude、Cursor 与 OpenCode,CallbackBeaver 把 Cursor 与 Claude 加进了自己的范围;此外 BeeStealer、STG Stealer、HydraStealer、APEX Stealer 以及主攻 macOS 的 Djinn Stealer 也与 AI 智能体数据的收集有关联。而这些规则本身是远程管理的——目录、文件名、数据库、扩展名、搜索上限——这正是决定了经济账的那个细节。

没人需要去攻击那个智能体

One agent install directory and what each artifact in it buys A single home-directory folder holds four artifacts: a credentials file, an MCP server configuration, a conversation history database, and project metadata. Each has an arrow to what a holder of that file alone obtains — a renewable provider session, a routed list of internal systems, source code and pasted secrets, and organisational targeting. None of the four requires interacting with the running agent. ONE DIRECTORY, ONE USER, NO PRODUCTION INVENTORY WHAT THE FILE ALONE BUYS ~/.agent-tool/ .credentials.json access token + refresh token, mode 0600 mcp.json endpoints, headers, inline secrets history.db transcripts, pasted code and secrets projects/ repos, hosts, branches, tickets Renewable provider session 27-day refresh, no re-authentication Routed list of internal systems curated, current, machine-readable Source, secrets, architecture cannot be revoked, only expired Whose estate this is targeting, at no parsing cost
一个目录、四件工件、四种不同的访问。其中没有一种需要与智能体发生交互。

智能体安全里几乎每一项控制,都假定被攻击的对象是智能体。提示注入防御、工具投毒审查、沙箱逃逸加固、批准门控、范围一致性——这一切谈的都是「当对手把文本或代码塞进一个正在运行的循环时会发生什么」。那些工作是必要的,而这里说的不是那件事。这里循环压根没有运行。一个已经在机器上的进程读走四五个文件,然后离开。

让这件事成为一个「不同的问题」而不是「一个更小的问题」的,是磁盘上那些东西的形状。在一个服务端系统里,一份凭据、这份凭据所能触达的系统清册,以及它被使用的历史记录,分处三个彼此独立的信任域,各有三套不同的评审流程。而一套智能体安装把这三者塌缩进同一个目录、同一个用户账号之下,而那台笔记本不在任何人的生产清册里。这次塌缩不是某个具体工具的 bug——它就是「开箱即用」的含义。

真正该内化的是投递的经济账。因为那些收集规则是配置而不是代码,所以「一个新智能体火起来」与「一个窃密软件开始收集它的工件」之间的时滞,就只是一个运营者推一条规则所需的时间。Gen 在 2026 年上半年记录到的窃密软件检测覆盖了 330 万名独立受保护用户,月度总量在 50 万以上。这张分发网络已经建好、已经付过钱、正在运转。你的工具链只是它配置里的一行。

决定有效期的是「那一对」,不是那枚令牌

What a holder obtains from a password, an access token, and the token pair Three columns. A stolen password yields a login attempt that still meets multi-factor authentication. A stolen access token yields roughly one hour of session with no further challenge. A stolen access-plus-refresh pair yields a session renewable for weeks without re-authentication, which is why the pair sets the real lifetime. PASSWORD ACCESS TOKEN ACCESS + REFRESH PAIR 0 sessions, if MFA holds Meets a second factor the control you already bought ~1 hour until expiry, no challenge Bounded by the TTL the design everyone describes 27 days renewable, no re-auth Bounded by the refresh token the design everyone ships
多因素认证之后的那个对象是刷新令牌。它存在访问令牌旁边,于是决定了这一对真正的有效期。

去读一款在售产品的凭据存储,这道算术就摆在那里。Claude Code 能用操作系统钥匙串时就把登录态放进钥匙串,否则退回到 ~/.claude/.credentials.json、权限位 0600——这是 Linux 上的默认,也是 Windows 以及钥匙串被锁住时所走的那条路径。2026 年 9 月 1 日针对该项目提交的一份报告记录道,这个文件里放着一个在用的访问令牌,旁边是一枚有效期二十七天的刷新令牌,而观察到的两个过期时间相差一个月。按这个领域的标准看,这里没有任何草率之处。这就是常态的形状,而这正是它可以推广的原因。

其后果是:访问令牌那个短 TTL,并没有在做人们以为它在做的那份安全工作。刷新令牌无需重新认证即可续期;如果刷新过程中没有人、没有设备校验、也没有鉴证参与,那这条回路里就没有任何环节能注意到「续期的人换了」。那一对的有效期就是刷新令牌的有效期,而那枚一小时的访问令牌已经悄悄从一项安全属性变成了一项延迟属性。设计评审里该问的不是「我们的 TTL 是多少」——而是「如果这个目录被整份复制走,这份副本还能用多久」。

0600 也该被同样地降一降。作为针对同一台主机上另一个用户的控制,它是正确且有用的。而窃取凭据的恶意软件正是以那个用户的身份在跑,于是权限位是被满足了而不是被绕过了:什么都没坏,什么都不告警,而那个文件被读取的方式与主人自己读它的方式完全一样。钥匙串在解锁状态下也是同一回事——而在一台有人正在工作的开发机上,解锁才是常态。

赃物的后一半是那张工具清单

Which agent artifacts can expire, be revoked, be managed, or be detected in misuse A four-by-four matrix. Rows are the credentials file, the MCP server config, transcript history, and project metadata. Columns ask whether the artifact expires, whether it can be revoked, whether secrets management covers it, and whether misuse is detectable. Only the credentials row is strong on expiry and revocation; the other three rows are weak or medium throughout, meaning three of the four artifacts cannot be recalled once copied. RECALLABILITY OF A COPIED ARTIFACT EXPIRES? REVOCABLE? SECRETS MGMT? MISUSE SEEN? .credentials.json Strong (27d) Strong Medium Medium mcp.json Weak (never) Weak Medium Weak history.db Medium (policy) Weak Weak Weak projects/ Weak (never) Weak Weak Weak Weak Medium Strong
四类工件里只有一类既有过期时间、又有撤销路径。另外三类压根无法召回。

按「持有者仅凭它能做什么」给这些工件定价,得到的排序会把通常的直觉翻过来。凭据文件是人人都会想到的那一件,而它同时也是唯一一件既带着钟表、又带着开关的。MCP 服务器配置两样都没有,而它比里面任何单一密钥都更值钱:它是一份被枚举出来、经过挑选、保持最新的清单,列着你的机构认为值得给智能体接上的那些系统,连抵达它们的端点与请求头名称一并在内。这把一次泛泛的盗窃变成一次有针对性的盗窃,并且回答了那个通常要花掉入侵者数周吵闹扫描的问题——不是有什么存在,而是什么要紧。

对话历史是各团队低估得最狠的那件工件。就内容而言,一名资深工程师一周的智能体历史,接近于「相关仓库的读取权限加上事故频道」:被粘贴进去的密钥、源码、客户名称,以及那些攻击者原本得自己重建的、关于你们架构的推理。与令牌不同,它无法被撤销。唯一对它适用的控制是保留期——这意味着你为了方便而设的那个保留窗口,同时也是一项事故响应决定。

项目元数据以近乎零的攻击者成本把这一套收了尾:仓库、主机、分支、工单。不用解析、不含密钥,只是对「这是哪家机构、它跑的是什么」给出一个精确答案。四件工件合在一起,是一份凭据、一张「凭据能触达什么」的地图、一份「它被用来做过什么」的历史,以及一份「这是谁的」的身份认定。那不是一次密钥泄漏。那是一份入职资料包。

你现有的检测为何看不见它

回放发生在你所埋点的一切之外。一枚被收割走的供应商令牌从别处被使用,打的是供应商的 API,于是你的网关、你的出站放行名单与你的链路存储从未观察到它——那些覆盖的是离开你网络的流量,而这股流量压根没进来过。笔记本上那个端点软件也许会抓到窃密程序,这值得拥有;但等你开始调查的时候,那份凭据正从一个你与之毫无关系的地址上被使用。

这把检测推到了两个地方,而两者都不光彩。第一个是供应商侧的遥测:来自新地区或新客户端指纹的使用、在持有它的那台笔记本睡着时的使用、一份凭据上的两个并发会话。多数团队从没问过他们的模型供应商这里面有哪些是他们能拿到的,而答案通常比他们预想的多。第二个是一个被种下的信号。一条任何合法流程都绝不会调用、却指向一个你自己拥有的端点的 MCP 服务器定义,是这个面上唯一毫不含糊的探测器——除了读过那个文件的人,谁也不会去碰它;而当被观察的对象是一个「把能够着的一切都读一遍」的智能体时,这恰恰是行为式检测给不了你的那条性质。

结构性的修复比听上去更窄,而它在这个问题的两半里是同一条:别再让同一件工件既带着名字、又带着路由。一份「引用密钥」而不是「装着密钥」的配置,是一件工件而不是两件。它仍然点出你的系统——只要智能体要去用它们,这部分就无法避免——但它不再向它们认证,于是这份索引不再是一把钥匙。

这个月该做什么

按回报大致排序,而且其中没有一项需要走预算周期。

  • 把内联密钥从 MCP 配置里剥掉。按名字引用,在启动时从操作系统钥匙串或一个短租期的中介那里解析。一天的活,而它移走了这一集合里杠杆最大的那件工件。
  • 把「那一对」的有效期写下来。为你权限最高的那份智能体凭据,记下刷新令牌的有效期,而不是访问令牌的。如果这个数字是以周计的,那它就是单台笔记本失陷之后你的暴露窗口。
  • 拿秒表给一次撤销计时。撤销一份真实的智能体凭据,并记录下一次使用它的调用在何时失败。通常会浮出两件事:原先没人知道谁有权执行这次撤销,而这场演练会翻出一份没人列过的副本。
  • 给每套安装种一条蜜标 MCP 条目。这是你在开发者端点上部署过的、最便宜的毫不含糊的信号。
  • 给本地对话历史设上保留上限。挑一个窗口。默认值会永久保留一切,因为用户就想要这样;而历史是撤销伸不到的那一件工件。
  • 把有特权的那套安装与用来探索的那套分开。能触达生产的那个智能体,不该是那个会打开任意仓库、跑任意 MCP 服务器的同一套安装。

这篇文章不是在说「别再在本地跑智能体」,也不是在为一个新的产品品类辩护。它说的是这样一个观察:开发者端点在过去两年里的某个时点变成了一个生产面,没人更新过清册,而维护大众市场凭据窃取流水线的那些人,比维护智能体安全项目的那些人更早注意到了这件事。

常见问题

这是 Claude Code、Cursor 或 Codex 里的一个漏洞吗?

不是。这里点到的每一个工具,存凭据的方式都与桌面软件通常的做法一致,并且在操作系统钥匙串可用时就用它。这项发现谈的是:一旦一台机器被与之无关的恶意软件攻破,那几个文件的总和值多少;以及商品化窃密软件如今会默认收集它们。

操作系统钥匙串能解决这个问题吗?

它显著抬高了成本,但没有把问题关掉。一个处于解锁状态的钥匙串——而这正是有人正在使用的机器上的常态——可以被以该用户身份运行的进程读取;而当钥匙串写入被拒时,工具会退回到一个明文文件。它是正确的默认值,不是一道边界。

这与提示注入或工具投毒有什么不同?

那些是通过输入对一个正在运行的智能体发起的攻击:模型被诱导去做某件事。而这里模型压根没有参与。被读走的是智能体在它没运行时存下来的状态,这正是为什么所有瞄准循环的防御在这里都不适用。

哪一项单一改动帮助最大?

把内联密钥从 MCP 配置里移除,让那个「枚举了你内部系统」的文件不再同时向它们认证。这是一天的活,而它把攻击者最想一并找到的那两样东西分开了。

我们该停止在本地保留智能体对话历史吗?

给它设上限,而不是把它杀掉——历史是真有用的,否则这场争论你会输。请设一个保留窗口、在工具提供该能力时启用写入即脱敏,并提前决定「对话历史失陷」会触发什么,因为与令牌不同,它无法被撤销。

延伸阅读

本站:

来源: