首页
社区
课程
招聘
[原创]深挖Claude Code 接入 Google Cloud Code 伪装 429 RESOURCE_EXHAUSTED竞品指纹过滤破案实录
发表于: 2026-9-29 22:20 203

[原创]深挖Claude Code 接入 Google Cloud Code 伪装 429 RESOURCE_EXHAUSTED竞品指纹过滤破案实录

2026-9-29 22:20
203

【逆向排查】深挖云端黑盒:Claude Code 接入 Google Cloud Code 伪装 429 RESOURCE_EXHAUSTED 竞品指纹过滤破案实录

论坛建议板块:『编程技术』 或 『AI安全』
文章标签:逆向分析, 抓包排查, GoogleCloudCode, WAF规则, 429误报, ClaudeCode
摘要:在尝试将拥有重型 Agent 上下文(15 Skills、30 Tools、144 KB 载荷)的 Claude Code CLI 通过反代接入 Google Cloud Code 时,遭遇了首句即报 400/429 RESOURCE_EXHAUSTED 的诡异故障。本文记录了从怀疑“Token 超标/配额耗尽”,到通过压力基准测试与脱机单变量二分探针,层层抽丝剥茧,最终发现 Google 上游 WAF 针对竞品词汇 "Anthropic" 实施“假性 429 封杀”的真实机制,以及本地网关状态机自锁陷阱的排查过程。

系列说明:
本文是《Claude Code 接入 Google Antigravity 实战》的**【排查与破案篇】**。
关于反向代理网关的整体系统架构、Google OAuth2 凭证刷新、双向 JSON Schema / SSE 协议转换等完整实现细节,请参阅主篇:
《【技术分享】跨生态桥接:将 Claude Code 无缝接入 Google Antigravity/Cloud Code 订阅算力的反向代理架构实现》。


0x01 故障现场:万事俱备,第一句话直接猝死

在完成本地协议转换网关(antigravity-claude-proxy)的搭建后,通过 CC Switch 配置好环境变量,终端启动 Claude Code CLI。

用户本地拥有高阶开发工程配置:

  • 挂载了 15 个 Skill、6 个 Subagent、30 个自定义 Tool
  • 复杂的 CLAUDE.md 与项目规范
  • 首次通信的完整报文体积高达 ~144 KB(约 37,000+ tokens)

在终端输入测试语句:

> 你好

等待十几秒后,屏幕弹出了致命红字:

● API Error: 400 RESOURCE_EXHAUSTED: You have exhausted your capacity on gemini-3. Quota will reset after 30m0s.

切换到 Claude 模型(如 claude-sonnet-4-6)同样抛出:

● API Error: 400 RESOURCE_EXHAUSTED: You have exhausted your capacity on claude-sonnet-4-6. Quota will reset after 30m0s.

最诡异的是:在此报错之后,哪怕在终端发送只有几个字的简短指令,代理网关也在 0ms 内秒拒报错。


0x02 排除假象:Google 配额真的耗尽了吗?

面对 RESOURCE_EXHAUSTED 错误,最符合人类直觉的推断是:

  1. 假设 1:Google 账号的免费/订阅额度被刷空了。
  2. 假设 2:37,000 tokens 上下文过大,触发了 Google 上游的单次 Token 阈值限制。

1. 验证真实剩余配额

编写脚本直接调用代理内置的 /account-limits 接口,拉取 Google 后端直接返回的配额数据:

  • claude-sonnet-4-6 / claude-opus-4-6-thinking:剩余配额高达 86.5%!
  • gemini-3.8-flash-high / gemini-2.5-pro:剩余配额高达 60.4%!

铁证一:用户的 Google 账号配额充裕,所谓的“Quota exhausted”是完全不符合事实的虚假报错!

2. 纯净压力测试:验证 Token 容量上限

为了验证是否是 Google 限制了“大体积请求”:

  • 编写脚本生成 1,000 ~ 30,000 单词(约 45,000 tokens / 180 KB)的纯英文文档作为上下文。
  • 向上游 Google 发送测试。
  • 结果:在 2.8 秒内成功返回 HTTP 200 OK!
  • 进一步在纯净大上下文基础上挂上 30 个 Tool 的声明,耗时 4.2 秒依然返回 200 OK!

铁证二:Google 基础设施完全支持 45,000+ tokens 的高并发大请求,绝对不是报文体积或 Token 数量超限的问题!


0x03 抽丝剥茧:单变量二分探针破案

既然“配额没空”,而且“45k tokens 纯文本能秒通”,为什么 Claude Code 带着 37k tokens 就必定暴毙?
唯一的解释:Claude Code 的报文里夹带了“毒丸”!

1. 抓取全量现场

在网关入站处挂载 Dump 钩子,把 Claude Code 首次发送的 144 KB 原始报文完整落盘。拆解出 4 个核心组成部分:

  • Headers(包含私有头 x-anthropic-billing-header)
  • System Prompt(包含 You are a Claude agent, built on Anthropic's Claude Agent SDK...)
  • Messages(包含 7 个 <system-reminder> 块)
  • Tools(包含 30 个工具的 JSON Schema)

2. 构造脱机单变量二分实验

编写独立的 test_probe.mjs,绕过复杂的终端 CLI,将报文的不同维度组合发送给 Google 上游(daily-cloudcode-pa.googleapis.com):

实验组 报文组合 测试结果 关键推论
Candidate A Claude System 提示词 + 简短 User 问题 Status 429 RESOURCE_EXHAUSTED 真凶必定潜伏在 System Prompt 中!
Candidate B Claude Messages(含 7 个上下文提醒)+ 简短 System Status 200 OK 证实 Messages 内部的所有上下文均合法。
Candidate C Claude System 提示词(中和清洗 Anthropic/Claude) Status 200 OK 证实整段 System 只要清洗即可瞬间放行!
Candidate D 等长(15,000 字符)假 System 规则 Status 200 OK 排除 System 长度限制。

3. 单字命中定位

对 Candidate C 进行细粒度的单变量还原:

  • 实验 1:仅把 Anthropic 替换为中立词 AssistantCorp,保留 Claude、保留所有其他规则 →\rightarrow→ Status 200 OK!
  • 实验 2:仅替换 Claude 为 Assistant,但保留 Anthropic →\rightarrow→ Status 429 RESOURCE_EXHAUSTED!
  • 实验 3:移除第一段 Billing Header,保留其余所有文本 →\rightarrow→ Status 429 RESOURCE_EXHAUSTED(因为后面有 built on Anthropic's Claude Agent SDK)。

0x04 真相大白:Google 的“竞品防爬拦截机制”

1. 拦截真相(Opaque 429)

现代云厂商为了防止竞品商业 Agent 或倒卖算力的黑产通过个人优惠订阅借壳白嫖算力,在后端 WAF 设置了针对竞品指纹的语义审查规则:

  • Google Cloud Code PA 在解析 systemInstruction 时,内置了第三方品牌黑名单。
  • 只要检测到关键词 "Anthropic",上游系统为了避免直接返回 403 Forbidden 引发公关争议,狡猾地伪装抛出 429 RESOURCE_EXHAUSTED (Resource has been exhausted),误导开发者以为是自己调用频次超标。

2. 网关本地状态机的自锁陷阱

为什么一次 429 会导致后续的小请求也永久暴毙?
这是代理网关本身的防御性设计漏洞:

  • 在 antigravity-claude-proxy 的代码中,一旦收到上游的 429,立即轻信为“账号配额耗尽”,并将 isRateLimited: true 及 30 分钟的冷却时间持久化写入磁盘配置 accounts.json。
  • 随后的所有请求在到达网关时,中间件直接查表拦截并在本地抛出 HTTP 400,根本不再向上游发起任何网络通信!

0x05 最终修复方案

1. 代理网关自动脱敏补丁

修改 src/cloudcode/request-builder.js,在 System Instruction 发往 Google 之前,将其自动进行竞品中和:

const DEFAULT_IDENTITY_SCRUB = [
    ['Nous Research', 'the assistant team'],
    ['Hermes Agent', 'the assistant'],
    ['Hermes', 'the assistant'],
    ['Anthropic', 'AssistantCorp'],
    ['anthropic', 'assistantcorp'],
    ['ANTHROPIC', 'ASSISTANTCORP']
];

function scrubClientIdentity(text) {
    if (typeof text !== 'string') return text;
    let out = text;
    for (const [term, replacement] of IDENTITY_SCRUB_RULES) {
        out = out.split(term).join(replacement);
    }
    out = out.replace(/Anthropic/gi, 'AssistantCorp');
    return out;
}

2. 解除本地死锁

重置 ~/.config/antigravity-proxy/accounts.json 中的 isRateLimited: false,并平滑重启代理。

3. 实测验证结果

在**完全保留用户全部 15 个 Skill、6 个 Subagent、30 个 Tool(37,000+ tokens)**的前提下,终端实际调用结果:

模型 调用指令 响应延迟 验证结果
claude-sonnet-4-6 claude -p "请用一个字回答:好还是不好" 3.3 秒 成功(返回:“好”)
claude-opus-4-6-thinking claude -p "请用5个字以内打招呼" 12 秒 成功(返回:“你好,有何吩咐?”)
gemini-3.8-flash-high claude -p "请用5个字以内打招呼" 35 秒 成功(返回:“你好!”)

0x06 逆向与排查总结

  1. 不要盲信云厂商 4xx/429 报错的字面描述:在大模型对抗时代,429 Too Many Requests 和 400 Resource Exhausted 经常被用来伪装“策略拦截与黑名单封杀”。
  2. 警惕“容量陷阱”(相关性 ≠\neq= 因果性):大载荷报错时,人们本能地去删减内容做负荷优化。必须先做同等体量的“纯净 Dummy 载荷基准测试”,避免南辕北辙。
  3. 独立脱机探针是终极武器:脱离复杂的客户端 UI,用 30 行 Node.js 脚本单变量复现,排查效率是终端反复试错的 20 倍以上。

0x07 系列导航与架构主篇


冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
点赞 ・0
打赏
分享
最新回复 (2)
雪    币: 2858
活跃值: (3695)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2 楼
666
2026-9-29 22:50
0
雪    币: 2789
活跃值: (2201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3 楼
感谢你分享这么好的资源!
2026-10-1 18:41
0
游客
登录 | 注册 方可回帖
返回