Hotdry.
security

VS Code Copilot 子代理计费绕过漏洞:攻击路径与修复方案

深入分析 Microsoft VS Code Copilot Chat 中通过子代理组合绕过计费的攻击路径,并探讨权限边界与资源配额隔离的工程化修复策略。

漏洞背景与影响范围

2026 年初,安全研究人员在 VS Code Copilot Chat 中发现了一个严重的计费逻辑缺陷(GitHub issue #292452)。该漏洞允许攻击者通过组合使用子代理与代理定义,在使用高级模型执行实际计算的同时,却按免费或低价模型进行计费。这一缺陷的影响远超单一产品的收入损失,它揭示了多代理系统中普遍存在的权限边界与资源配额隔离问题。

从业务影响角度看,该漏洞直接破坏了「高级请求」模型的定价抽象。Copilot 的高级请求模式旨在提供可预测的成本结构:用户选择模型层级后,对更昂贵模型的请求会按比例消耗高级请求配额。然而,攻击者可以利用子代理机制,让实际执行昂贵模型工作的流量绕过计费系统,导致服务提供商承担不可预测的成本,而用户无需支付相应费用。

从安全角度看,这一漏洞更值得警惕。现代 AI 代理系统将计量(metering)从单纯的财务问题提升为安全边界的一部分。计费绕过的攻击路径往往与策略绕过、额度突破和审计缺失属于同一类问题。当控制与执行发生在不同层面(客户端与服务端、编排器与工具运行器、父代理与子代理)时,这类问题便会产生。

攻击路径深度剖析

理解该漏洞的攻击路径,需要首先理解 VS Code Copilot Chat 的三层代理架构:编排器(Orchestrator)负责决策下一步操作;工具层(Tools)提供文件操作、网络获取、代码执行等能力;子代理层(Subagents)则能够以不同的系统提示、模型和上下文窗口启动新的模型实例。

攻击的核心在于计量系统被绑定到了错误的边界。正常流程中,用户在「免费」模型上发起聊天,Chat 界面显示并记录该模型层级,后续请求均按此层级计费。但问题出在:当用户或代理提示通过工具调用(Tool Invocation)触发子代理时,子代理可以携带一个代理定义(Agent Definition),该定义明确指定使用「高级」模型执行任务。

此时,系统执行层面确实调用了高级模型,但计量层面仍然将整个交互归因于初始的免费模型。这种「执行与计量解耦」的设计缺陷,使得攻击者可以精心构造对话,让「可计费」表面呈现低成本,而「实际执行」表面却进行高成本运算。

从攻击者视角,这一路径的实现需要三个关键要素:按层级 A(免费 / 低价)计费的父级交互;能够运行层级 B(高级)模型的生成机制(子代理 / 工具 / 函数);以及服务端强制执行漏洞 —— 执行层承认层级 B,计量层却仍将其归因于层级 A。攻击者只需构建一个看似普通的对话,诱导系统启动携带高级模型配置的子代理,即可实现无限量的免费高级请求。

工程修复方案

针对此类漏洞的修复,需要从架构层面重新审视计量与授权的设计原则。

服务器端模型授权是修复的第一道防线。服务器应当成为模型选择的最终决策者,而非信任客户端或代理定义中的模型声明。代理文件可以「请求」某个模型,但服务器必须根据当前用户 / 组织 / 项目的权限验证该请求是否合法。任何未经验证的模型选择都应被视为潜在的攻击向量。

子调用继承计费上下文是第二道防线。每个子代理的执行必须携带密码学可验证的「计费上下文」,包含租户信息、订阅计划、预算余额、使用限额等元数据。当子代理使用高级模型时,无论其调用路径如何,都必须从对应预算中扣减相应份额。这意味着计费不再是会话级别的粗粒度统计,而是需要追踪整个执行图中的每个节点。

基于实际执行的计量是第三道防线。计费应当基于实际使用的模型(理想情况下还应包含令牌数量和计算资源),而非父级会话的标签。这意味着审计日志必须精确记录每次模型执行的实际参数,包括模型名称、消耗令牌数、工具调用情况以及完整的父级调用链。

工具与子代理配额需要作为一级策略进行管理。系统应当限制单个父请求可生成的子代理数量、工具调用链的最大深度、总工具调用次数,并为长时间运行的代理设置超时机制和「工作预算」(最大令牌数、最大 wall-clock 时间、最大操作次数)。

权限边界与资源配额隔离的实现要点

在多代理架构中实现健壮的权限边界与资源配额隔离,需要遵循几项核心原则。

首先,明确定义可计费原语(Billable Primitives)。不应笼统地将「消息」作为计费单位,而应精确计量实际消耗资源的操作:模型推理调用、调用第三方服务的工具执行、长时间运行的后台任务等。UI 层的抽象(「轮次」、「高级请求」)应当与这些底层原语建立可靠的映射关系。

其次,确保服务端成为事实来源。任何仅在客户端执行的限制最终都会被绕过,这包括模型选择、配额检查、工具权限、最大请求深度等。所有强制执行逻辑都必须在服务端完成验证,客户端仅负责呈现与交互。

第三,将子代理视为一级操作。子代理不应成为计费系统的漏洞,它们应当是执行图中明确定义的组成部分。子代理调用必须经过认证与授权,必须纳入计量范围,必须可追溯。每一层子代理的启动都应产生可审计的事件记录。

第四,构建预算感知的编排机制。代理不应无限制地运行至「完成」,而应在明确的预算约束下规划行为。最大令牌数、最大工具调用数、最大运行时间、最大子代理生成数,这些预算应当由服务端在会话初始化时确定,并贯穿整个执行周期。

最后,假设代理定义文件将被武器化。代理定义、前提示例、工具模式不是文档,而是可执行配置。如果用户可以编辑这些内容,他们就能强制选择不同模型、构造无限循环、尝试禁用安全控制。系统应当像对待代码一样对待这些配置:进行 lint 检查、验证、沙箱隔离与代码审查。

结论与建议

VS Code Copilot 的子代理计费绕过漏洞是一个典型的「控制与执行跨越边界」的安全问题。它提醒我们,随着 AI 代理系统变得越来越「魔法」,其内部图谱(模型、工具、子代理)必须被视为真实的执行平面并纳入安全治理范畴。

对于构建多代理系统的团队,一个简单的 litmus 测试可以判断是否存在同类漏洞:如果一个被计为层级 A 的请求能够在不经层级 B 扣费的情况下,导致后端执行层级 B 的计算,则系统存在同类风险。及时的架构审计与修复,是防止此类问题演变为大规模滥用或收入损失的关键。

参考资料

查看归档