1837620622/windsurf-cascade-research-bypass

GitHub: 1837620622/windsurf-cascade-research-bypass

这是一个逆向工程项目,通过 MITM 和 Protobuf 分析来研究和测试 Windsurf Cascade 配额门的绕过方法,揭示服务端机制及无效路径。

Stars: 0 | Forks: 0

# Windsurf Cascade 逆向研究 — Quota Gate 实测归档 ## TL;DR | 问题 | 实测答案 | |---|---| | **Pro 0 配额下还能跑真 Opus 4.7 吗?** | **不能**。服务端按 user-id 计 quota,HS256 JWT 由服务端签发,密钥不在客户端 | | **0 配额下还能跑 Cascade 吗?** | **能**,但只能用 `swe-1-6` / `kimi-k2-6`(官方 `credit_multiplier: 0`)| | **客户端 patch 能绕过吗?** | **不能**。改 Unleash flag / plan_name / model_uid 路径都被服务端拒绝(详见 [已测试的绕过选项](docs/02-bypass-options-tested.md))| | **看到别人 0 配额还在用是怎么回事?** | 三种可能:① 选了 SWE-1.6 / Kimi K2.6(不计配额);② 开了 Extra Usage(按 API 标价付费);③ 用 Devin in Windsurf / Devin for Terminal(独立配额池)| ## 实测的 quota gate 行为 控制变量法:同一 `GetChatMessage` 请求体(21KB Cascade 系统提示 + 40 个工具定义 + 真实 inner JWT),仅替换 `[21]` 字段的 `model_uid`,直接 curl 到 `server.self-serve.windsurf.com`: ``` ✅ kimi-k2-6 → 200 OK 26832B 真实 Cascade 回复 ✅ swe-1-6 → 200 OK 16200B 真实 Cascade 回复 ✅ MODEL_GOOGLE_GEMINI_2_5_FLASH → 200 OK 1434B checkpoint 路径,可用 ⚠️ MODEL_CLAUDE_4_OPUS_BYOK → 200 OK 137B 通过 gate 但需 BYOK 配置 ❌ claude-opus-4-7-max-fast → 200 ~218B {"error":{"code":"failed_precondition", "message":"Your weekly usage quota has been exhausted..."}} ❌ claude-opus-4-7-{low,medium,high,xhigh,max}{,-fast} → 同上 failed_precondition ❌ claude-sonnet-4-6{,-1m,-thinking,-thinking-1m} → 同上 ❌ claude-opus-4-6{,-fast,-1m,-thinking,-thinking-1m} → 同上 ❌ gpt-5-{4,5}-{none,low,medium,high,xhigh}{,-priority} → 同上 ❌ gemini-3-1-pro-{low,high} → 同上 ❌ adaptive / deepseek-v4 → 同上 ❌ swe-1-6-fast → 同上 (multiplier=0.5) ❌ claude-haiku-4-5 / gpt-5.4-mini / gemini-3.0-flash → permission_denied (model 不存在 user-facing) ``` 与 [Windsurf 官方 Models 文档](https://docs.windsurf.com/windsurf/models) 一致:只有 **`credit_multiplier == 0`** 的模型不计配额,目前公开的就 **SWE-1.6** 和 **SWE-check** 两个。 ## 服务端架构(实测确认) ``` ┌─────────────────────────────────────────────────────────┐ │ Windsurf.app (Electron) │ │ ├── extension.js UI / Unleash 客户端 │ │ ├── language_server (Go, 163MB) │ │ │ ├── Connect-RPC → server.self-serve.windsurf.com │ │ │ ├── Unleash → unleash.codeium.com │ │ │ └── 模型路由 (handler=strawberry-pancake) │ │ └── devin (Rust, 110MB) ACP / SSE / 子代理 │ └─────────────────────────────────────────────────────────┘ ↓ HTTPS ┌─────────────────────────────────────────────────────────┐ │ server.self-serve.windsurf.com │ │ /exa.api_server_pb.ApiServerService/GetChatMessage │ │ 1. 验证 inner JWT 签名 (HS256, 服务端密钥) │ │ 2. 按 model_uid 字符串决定上游路由 + 是否计配额 │ │ 3. 配额耗尽 → return failed_precondition │ │ 4. 否则 → 转发到 Anthropic/OpenAI/Moonshot/... │ └─────────────────────────────────────────────────────────┘ ``` **关键 RPC**: | 端点 | 用途 | 实测 | |---|---|---| | `GetChatMessage` | Cascade 主聊天 | quota gate 在这层,按 model_uid 路由 | | `GetUserJwt` | 服务端签发 inner JWT (HS256, 5 分钟刷新) | 密钥仅在服务端 | | `GetUserStatus` | 用户状态 + plan + 79 模型倍率表 | 可改响应但无效(quota gate 不读) | | `CheckUserMessageRateLimit` | RPM 速率检查(独立于 quota) | 实测:通过这层后 GetChatMessage 仍可能因 quota 被拒 | | `RecordCortexGeneratorMetadata` | 上报含 `[34]/[35]` model_uid 双字段 | 仅上报,不参与决策 | | `windsurf.com/_backend/...GetCurrentUser` | Web 前端 plan 状态 | 改 plan_name UI 显示变但 GCM 不变 | 详见 [docs/00-architecture.md](docs/00-architecture.md)。 ## 目录 ``` . ├── README.md ← 你在这 ├── .gitignore 排除 *.mitm / decoded_*.txt / 凭据 │ ├── docs/ 主文档 │ ├── README.md 索引 │ ├── 00-architecture.md 架构 / 二进制 / 通信流 │ ├── 01-mitm-capture-guide.md mitmdump 抓包 SOP │ ├── 02-bypass-options-tested.md 21+ 个绕过方案实测全表 │ ├── 03-mitm-rewrite-quickstart.md 主工具 5 分钟操作手册 │ ├── all-model-uids.txt 79 个 model_uid 全表 │ └── get-cli-model-configs-analysis.txt model_configs_v2.bin 解码 │ ├── tools/ 可执行工具 │ ├── README.md 索引 + 用法 │ ├── rewrite_model.py ⭐ 主 mitm addon (model 替换 + 响应回写) │ ├── plan_rewrite_addon.py 实验 addon (改 plan_name, 已验证无效) │ ├── gcm_tool.py GetChatMessage 改装/解码 CLI │ ├── extract_creds.py 从抓包提取最新 inner JWT │ ├── scan_chat.py 扫描抓包文件,列 chat 端点统计 │ └── full_compare.py 成功 vs 失败请求字段 diff │ ├── raw_data/ 原始抓包(含真实凭据,本地保留) │ ├── README.md 说明 │ ├── original_getchatmessage_req.bin [gitignored] 原始 GCM 请求样本 │ ├── unleash_features.json [gitignored] Unleash 完整响应 │ └── capture_2026-05-16/ [gitignored] 完整抓包 + 解码 │ ├── evidence/ 实测证据 (.mitm)(含真实凭据,本地保留) │ ├── README.md 说明 │ ├── 2026-05-16_final_with_rewrite.mitm [gitignored] 最终验证抓包 │ └── legacy/ [gitignored] 早期实验抓包 │ └── archive_old_assumptions/ 已被推翻的旧推论(保留作历史) ├── README.md 说明 + 教训 ├── 02..12-*-WRONG/OUTDATED.md 早期错误分析 ├── FINAL-zero-opus-path-EARLY.md 早期"final"结论(已被推翻) ├── REAL_BYPASS_FINDINGS_old.md 早期发现合并后的版本 ├── v7-summary.md 第 7 轮总结 ├── README_old.md 旧版根 README ├── old_scripts_capture/ 中间过渡脚本(被 tools/ 取代) └── wf-bypass-go/ Go 版 bypass(v7,已确认全部路线无效) ``` ## 5 分钟跑通主工具 ### 前置条件 ``` brew install mitmproxy # macOS # 第一次启动后会生成 ~/.mitmproxy/mitmproxy-ca-cert.pem # 安装到系统钥匙串信任: sudo security add-trusted-cert -d -r trustRoot \ -k /Library/Keychains/System.keychain \ ~/.mitmproxy/mitmproxy-ca-cert.pem ``` ### 运行 ``` git clone cd wf-cascade-research # 1. 启 mitmdump 加载主 addon mkdir -p /tmp/wf_run mitmdump --listen-port 8080 \ -w /tmp/wf_run/flows.mitm \ -s tools/rewrite_model.py \ --set http2=true & sleep 2 # 2. 用代理变量启 Windsurf(GUI 不继承 shell env) nohup env \ HTTPS_PROXY=http://127.0.0.1:8080 \ HTTP_PROXY=http://127.0.0.1:8080 \ /Applications/Windsurf.app/Contents/MacOS/Windsurf & # 3. 在 Cascade 里选 Claude Opus 4.7 Max Fast 发消息 # 实际后台跑的是 Kimi K2.6(不消耗配额),UI 显示无破绽 ``` 详见 [docs/03-mitm-rewrite-quickstart.md](docs/03-mitm-rewrite-quickstart.md)。 ## 实测过的失败方案(详见 [docs/02-bypass-options-tested.md](docs/02-bypass-options-tested.md)) 按“看起来很靠谱但实测无效”排序: 1. ❌ **改 Unleash flag**(`CASCADE_ENFORCE_QUOTA = false` 等)—— 服务端不依赖客户端 flag,本地缓存改了也只影响 UI 2. ❌ **改 plan_name=Enterprise** ([linux.do “windsurf无限大公开”](https://linux.do/t/topic/1694030)) —— UI 额度变 500 但 GCM 仍被拒;同站后续帖 [#1759890 “windsurf无限没了”](https://linux.do/t/topic/1759890/4) 也确认失效 3. ❌ **改 GetUserStatus 响应里 plan/quota** —— 客户端 UI 听话,服务端 quota gate 不读这个 4. ❌ **改 GetChatMessage `field 20`**(“是否计费”开关猜测)—— 服务端忽略 5. ❌ **改 user-id / team-id 字段** —— 服务端只看 JWT 内的 user-id 6. ❌ **删 inner JWT** → `invalid_argument` 7. ❌ **JWT 签名乱码** → `unauthenticated`(HS256 严格校验) 8. ❌ **alg=none JWT 漏洞** → `invalid_argument`(服务端拒绝非 HS256) 9. ❌ **改 JWT payload `max_num_premium=999999`** → `invalid_argument`(payload 改了不签名匹配) 10. ❌ **换 host**(`server.codeium.com` / `windsurf.com/_backend`)—— 同一 quota 后端,所有 host 都拦 11. ❌ **`MODEL_CLAUDE_4_OPUS_BYOK` enum** —— 通过 gate 但 Pro 账号不能注册 BYOK,服务端无 Anthropic key,返回空 trajectory 12. ❌ **`adaptive` / `deepseek-v4` / `claude-haiku-4-5`** —— 都被 quota 拦或 model 不识别 13. ❌ **`AssignModel` / `AssignArenaModel` 直调** —— 端点存在,需要预先建立的 cascade_id,独立调用返回 NotFound 14. ❌ **`ResetQuotaUsageInternal`** —— 内部 admin 端点,需要 `secret` 共享密钥 15. ❌ **`AddFlexCreditsToMultiTenantTeam`** —— Pro 账号无 admin 权限,UNKNOWN 错误 16. ❌ **`SubscribeToPlan` `start_trial=true`** —— 走 Stripe checkout,要绑卡 17. ❌ **`CreateExternalModels` (BYOK 注册)** —— self-serve 后端不实现该端点 (501) 18. ❌ **MCP long-polling + alwaysApply 强制循环**(“寸止”) —— Cursor/Windsurf 已加 tool-call 硬上限 + 循环检测 19. ❌ **`windsurf-vip` 第三方代理工具**(`windsurf.jeter.eu.org`)—— 用作者的共享 Pro 账号代答,不是真“无限” 20. ❌ **改 telemetry machineId / 重置 trial** —— 同设备/账号被服务端识别,频繁触发风控 21. ❌ **JWT 内 `disable_cli=false` 走 Devin CLI** —— Pro 账号下未自动获得 Devin 自助计划的 quota,需 `app.devin.ai` 单独注册 ## 真正可行的“使用 Opus”路径(合法) | 方案 | 是真 Opus | 代价 | 来源 | |---|---|---|---| | **等 quota 重置**(每周 UTC 0 点) | ✅ | 等待时间 | [官方 quota 文档](https://docs.windsurf.com/windsurf/accounts/quota) | | **开 Windsurf Extra Usage** | ✅ | 按 API 标价付费 | [官方原文](https://docs.windsurf.com/windsurf/accounts/quota) | | **Devin for Terminal** | ✅ | `app.devin.ai` 单独注册,独立配额 | [devin.ai/terminal](https://devin.ai/terminal) | | **Devin in Windsurf**(IDE 云端图标) | ✅ | Devin Review 给所有 self-serve 2 周 trial | [Windsurf 更新日志](https://windsurf.com/changelog) | | **Teams + BYOK Anthropic key** | ✅ | 升 Teams 计划 + 你付 Anthropic 的钱 | [Cognition self-serve 计划](https://cognition.ai/blog/new-self-serve-plans-for-devin) | | mitm 改 model_uid → `kimi-k2-6` | ❌ 实际是 Kimi | 无成本,UI 显示 Opus | 本仓库 | ## 为什么“看起来工作但底层不是 Opus” 服务端 `GetChatMessage` handler: ``` def handle_get_chat_message(request, jwt): user_id = verify_hs256(jwt).user_id # 密钥在服务端 model = request.field_21 if model in NO_QUOTA_MODELS: # {swe-1-6, swe-check, ...} return route_to_upstream(model, request) quota = db.get_quota(user_id) # 实时查数据库 if quota.weekly_used >= quota.weekly_max: return failed_precondition("weekly usage quota has been exhausted") db.increment_usage(user_id, model) return route_to_upstream(model, request) ``` 无论客户端怎么改请求体,**`user_id` 来自 JWT 签名验证后的 payload,`quota` 实时查服务端数据库**。这两步全在服务端,客户端不可控。 ## 引用 / 参考 - [Windsurf 官方文档](https://docs.windsurf.com/) - [Cognition (Devin) 博客](https://cognition.ai/blog/) - [linux.do “windsurf无限大公开”](https://linux.do/t/topic/1694030) — 旧 plan_name 漏洞,已修 - [linux.do “Windsurf无限没了”](https://linux.do/t/topic/1759890) — 修复后讨论 - [Cursor forum: MCP long-polling bypass](https://forum.cursor.com/t/security-mcp-tools-with-long-polling-alwaysapply-rules-enable-infinite-conversation-loops-bypassing-usage-limits/156655) — 同类 bypass 思路在 Cursor 的讨论 - [`kingparks/windsurf-vip`](https://github.com/kingparks/windsurf-vip) — 第三方“无限”工具(实际是共享池代理) ## License & 声明 **仅用于个人研究与协议逆向学习**。请遵守 [Windsurf 服务条款](https://codeium.com/terms-of-service-individual)。 本仓库: - ✅ 不含任何破解的授权或共享凭据 - ✅ 所有文档已 sanitize(账号 ID / JWT / email 已替换为占位符) - ✅ `*.mitm` / `decoded_*.txt` 等含真实抓包的文件已通过 `.gitignore` 排除 - ✅ 所有失败方案保留作历史警示,避免后人重复无效尝试 不鼓励任何形式的服务条款违规。如果你想要真 Opus 4.7:付费 Pro / Max / Teams 是合理选择。
标签:API安全, JSON输出, JWT验证, MITM攻击, Protobuf分析, TLS抓取, Windsurf Cascade, 云资产清单, 协议分析, 反取证, 安全测试, 安全评估, 情报收集, 攻击性安全, 服务端控制, 权限提升, 模型UID, 漏洞研究, 绕过测试, 绕过路径, 网络安全, 软件安全, 逆向工具, 逆向工程, 配额管理, 配额门限, 隐私保护