使用 Coding Agent 时,我们已经习惯了各种权限确认。读取文件、执行命令、访问网络,有些操作需要手动批准,有些则可以提前配置允许范围。
这些机制让我们能够控制 Agent 的行为,但还有一个问题容易被忽略:如果运行在 Agent 周围的插件本身就包含恶意代码,这些权限确认还能发挥作用吗?
10 月 29 日,Cursor 扩展市场出现被恶意修改的 Claude Code 扩展,攻击者试图借此在使用者电脑上安装 SSH 后门。第二天,欧盟计算机应急响应团队 CERT-EU 发布安全研究,演示第三方 Agent 插件如何绕过模型工具调用的流程,在后台收集并传输凭据。
这说明,Agent 的安全问题已经不只涉及模型本身,插件及其运行环境同样需要关注。
一次正常的扩展更新
10 月 29 日,Cursor 扩展市场在约 11 小时内提供了两个被恶意修改的 Claude Code 扩展版本,分别是 2.1.312 和 2.1.313。这两个版本沿用了合法扩展的标识,但恶意修改与 Anthropic 无关。根据 Microsoft 的分析,官方 Visual Studio Marketplace 和 npm 发布渠道均未受到影响,问题出在 Cursor 的扩展分发环节。
安装或更新编辑器扩展本是很平常的事。尤其是长期使用的工具,自动更新后可能连版本变化都不会留意。攻击者就利用了这个入口,将恶意代码植入扩展的 JavaScript 文件,使其在扩展模块加载时执行。
恶意代码会先收集主机名、用户名、操作系统、工作目录、Git 邮箱等信息,随后尝试修改本地 SSH 配置。它会向 authorized_keys 添加攻击者控制的公钥,再尝试启用 SSH 服务,通过反向 SSH 隧道建立远程访问通道。
为了维持连接,恶意代码还会根据操作系统写入启动配置。例如,在 macOS 上创建 LaunchAgent,在 Windows 上尝试创建计划任务,并设置备用启动脚本。这样一来,即使用户关闭编辑器,相关脚本也可能继续运行。
更难察觉的是扩展原本的功能仍然可以正常使用。 恶意代码尽量减少可见的输出,执行失败时也会隐藏错误。照常使用扩展的我们不一定能发现后台正在发生的异常操作。
不过,这次攻击并非所有环节都成功了。由于恶意代码存在错误,加上启用 SSH 服务需要管理员权限,远程登录在大多数 macOS 和 Windows 主机上未能成功。Cursor 随后下架了相关版本,并与服务商合作关闭了攻击者的服务器。
但远程登录失败,并不意味着此前的恶意操作都没有发生。SSH 公钥写入、持久化脚本创建和主机信息收集等行为仍可能执行。因此,Cursor 在安全公告中特别提醒:仅卸载或更新扩展,无法确保清除已经写入系统的恶意文件。
Agent 权限控制的覆盖范围
使用 Coding Agent 时,我们对权限确认应该都不陌生。例如,Claude Code 在执行部分命令前会要求用户批准,也允许我们配置文件访问范围、工具使用权限和 Hook。既然有这些限制,为什么恶意扩展仍然能够操作本地文件,甚至修改 SSH 配置?
这就涉及 Agent 权限控制与操作系统进程权限之间的区别。
以 Coding Agent 为例,其运行环境包含模型、Harness、工具和第三方扩展等组件。模型负责理解任务并生成操作指令,Harness 负责组织执行流程、调用工具和管理权限,第三方扩展则通过运行环境提供的接口参与工作。
当模型请求读取文件或执行命令时,Harness 可以检查操作是否需要授权。但第三方扩展中的 JavaScript 或 Python 代码,也可能在加载、初始化或特定事件触发时自行执行。只要运行环境允许,这些代码就能调用系统 API、访问本地文件或发起网络请求,整个过程未必经过模型的工具调用流程。
例如,一个插件为了读取项目配置,可能拥有访问工作目录的权限。如果使用者将 SSH 密钥、API Token 或云服务凭据保存在该目录中,恶意插件就可能利用已有权限读取这些信息。
即使模型严格遵守工具调用的权限规则,也无法保证运行环境中的所有代码都受到同样的约束。
类似的安全问题在传统 IDE 插件和软件供应链中同样存在。随着 Agent 接入更多工具和外部资源,第三方组件能够参与的执行环节、接触到的任务数据也随之增加,权限管理因此变得更加复杂。
隐藏在插件中的触发机制
10 月 30 日,CERT-EU 发布的一项安全研究也涉及类似问题。研究人员在隔离环境中,分别对 Pi 1.3.0 和 Claude Code 2.1.304 使用的第三方组件进行了修改,在原有的事件处理逻辑中加入隐藏代码,使其能够绕过模型的工具调用流程。
具体来说,研究人员在 Pi 中添加了 before_agent_start 事件处理器,在 Claude Code 中则利用插件已有的 UserPromptSubmit Hook 规则处理流程。这些入口可以在 Agent 执行正常任务时被触发,无需模型主动发起工具调用。
为了验证攻击效果,研究人员设置了一个触发条件:只有当输入中出现 lgtm, ship it 时,隐藏代码才会运行。这是代码审查中很常见的一句话,大致表示代码看起来没问题,可以合并或发布。其他情况下,插件仍然保持原有功能,也不会向外发送数据。
实验结果显示,两套环境都成功触发了凭据收集与信息传输,涉及主机信息、网络配置、环境变量和工作目录中的凭据相关文件。与此同时,Agent 仍然正常回复用户,模型没有主动请求读取敏感文件,也没有留下明显的恶意工具调用记录。
研究人员还测试了相关的安全控制。在当时的实验配置下,针对模型文件读取工具的限制,无法阻止插件事件处理器自行访问文件;工具调用检查机制也未能发现后台的数据传输。这说明,即使模型的工具调用受到限制,运行在同一环境中的第三方代码仍可能通过其他执行入口访问敏感资源。
实验中的触发词由用户输入,但类似内容也可能出现在日志、邮件或 Agent 读取的文件中。如果插件能够检查工具返回的数据,攻击者就可能将触发条件藏在外部内容里,让 Agent 在处理正常任务时激活恶意逻辑。
需要说明的是,这项研究在隔离环境中完成。研究人员仅修改了本地组件副本,没有向公开仓库发布恶意版本,也没有使用真实用户凭据。实验展示了第三方组件可能带来的安全风险,并不意味着 Pi 或 Claude Code 的官方组件存在相同后门。
Agent 的信任边界正在扩大
Agent 能够访问的资源越多,第三方组件可能带来的安全风险也就越复杂。过去安装 IDE 插件时,我们主要关注代码访问、命令执行和依赖安全等问题。如今,Agent 还可能连接代码仓库、云服务、数据库、内部知识库和各种 MCP Server,接触到更多业务数据和敏感信息。
为了减少人工操作,我们还会配置自动运行的 Hook、长期有效的凭据和常驻后台的服务。这些配置让 Agent 执行任务更加方便,但也扩大了第三方组件能够接触到的资源范围。一旦插件被恶意修改或入侵,其影响就可能超出 Agent 原本承担的任务。
这里需要区分两种权限:一种是模型能够请求执行哪些操作 ,例如使用 Bash、修改文件或访问网络;另一种是Agent 进程及其插件拥有哪些系统权限,例如读取用户目录、启动子进程或访问凭据文件。
前者可以通过 Harness 的工具授权机制管理,后者还需要操作系统权限、进程隔离、文件访问控制和网络策略等机制共同约束。如果 Agent 使用日常的账户运行,并且可以访问大量本地资源,那么加载到同一进程中的第三方代码,也可能继承这些访问权限。
因此,评估 Agent 的安全性,还需要关注插件的安装来源、更新过程、Hook 的执行环境,以及外部网络连接是否受到限制。这些因素都会影响第三方组件能够访问的资源,以及发生安全问题时的影响范围。
运行环境的权限管理
对于个人开发者和团队来说,可以根据第三方组件的执行能力和资源访问范围,对 Agent 的运行环境进行适当限制,降低插件被恶意修改后带来的安全风险。
首先需要关注插件的来源与更新。插件市场中的名称、下载量和发布者信息可以作为参考,但无法保证每个版本都安全。对于能够执行本地代码的扩展,团队可以建立组件白名单、固定版本,并在更新前检查代码变化,减少恶意版本进入开发环境的机会。
其次是控制敏感资源的访问范围。如果 Agent 只需要修改某个项目,就没有必要同时开放其他项目、完整的用户目录和长期有效的云服务凭据。通过容器、虚拟机或受限用户账户,可以缩小运行环境的访问范围。对于必须使用的 API Token,也可以采用短期有效、权限范围明确的凭据。
网络访问也需要适当限制。Cursor 事件和 CERT-EU 实验都涉及向外部地址建立连接或传输信息。通过限制不必要的出站连接,可以降低敏感信息被传输到外部服务器的风险。
此外,还需要关注运行环境的可观测性。Agent 的工具调用日志可以记录模型执行了哪些操作,但插件自行发起的系统调用未必会出现在这些记录中。因此,对于接入内部系统的 Agent,还可以监控进程启动、敏感文件访问、扩展更新和异常网络连接等行为。
在 CI/CD 和其他自动化工作流中,Agent 可能长时间无人值守,人工检查的机会更少。此时,提前配置权限隔离、网络限制和运行审计,可以减少对人工监督的依赖,也有助于及时发现异常行为。
结语
Cursor 的恶意扩展事件说明,一次正常的软件更新就可能将恶意代码带入开发环境。CERT-EU 的实验则展示了另一种情况:插件可以绕过模型的工具调用流程,在后台访问敏感资源,而 Agent 仍然正常完成用户任务。
因此,Agent 的安全管理还需要覆盖第三方组件及其运行环境,包括插件的执行权限、资源访问范围和后台行为。除了检查 Agent 被允许执行哪些操作,也要关注运行环境中的其他代码能够做什么。
参考资料
-
Cursor:Claude Code 扩展恶意版本安全公告
-
Microsoft Security:恶意 Claude Code 扩展与 SSH 后门分析
-
CERT-EU:Beyond the model: backdoors in AI agent harnesses