说明:本文为技术调研与漏洞分析,完整还原自 linux.do 社区用户的公开技术分享,仅供安全防范参考。

首先需要准备以下条件:

  1. 一个谷歌账号(任意区,不需要美区谷歌账号,发帖者使用的是美区谷歌)
  2. 任意美卡 x1
  3. 任意的安卓设备(需要 root 进行 mitm 证书安装),模拟器也行

原理概述:强制注入优惠码

底层原理是:拦截并塞入一种特殊的优惠码,使其强行在订阅的时候显示出来。

这些隐藏的优惠码包括:

  • 单月 0 刀试用
  • 3 天免费试用
  • 10 刀半价优惠
  • 3 月免费试用
  • 6 月免费试用
  • 12 月免费试用

优惠分为两种:一种是输入优惠码,一种是有特定资格的账号(最稳定)。

例如: 3-day-free-trial plus-1-month-free-trial 1-month-10-dollars

这些分别是 3 天、半价、一个月免费试用的优惠码。优惠码是固定的,每次都可以使用,这就是为什么外面的卡商可以一直生产低价 Plus 的原因。

核心复现步骤

第一步:绕过客户端,注入优惠数据

安装好 mitm 证书,安卓端装好 ChatGPT 的软件,预先格式化文本之后,我们打开抓包(此方法为绕过 ssl pinning)。

目标接口: https://android.chat.openai.com/backend-api/accounts/check/v4-2023-04-27

我们可以找到这么一个接口,这个是 ChatGPT 获取当前登录用户信息的接口。 其中在 eligible_promo_campaigns 的参数字段里面,我们可以修改响应值强行塞入一串优惠代码。这边给一个一个月的优惠案例:

"eligible_promo_campaigns": {
  "plus": {
    "id": "plus-1-month-free",
    "metadata": {
      "plan_name": "chatgptplusplan",
      "title": "linux.do",
      "summary": "你已获得 1 个月的 Plus 套餐优惠促销代码。",
      "discount": {
        "percentage": 100
      },
      "credit_grant": null,
      "duration": {
        "num_periods": 1,
        "period": "month"
      },
      "schedule": null,
      "price_period": "recurring",
      "promotion_type": "discount",
      "promotion_type_label": "1-month free trial",
      "no_auto_renewal_at_discount_end": true,
      "plan_type_change": null
    }
  }
}

写好规则替换后,我们重新打开软件点击升级,这时我们就能看到一个月免费试用的界面了。

第二步:0 刀订阅与拦截凭证

之后我们就可以点击订阅了(事先给账号绑卡)。由于是 0 刀的原因,谷歌的风控特别松,只需要过一个验卡环节即可订阅成功。

这时候我们只需要拦截这个接口(可以随意重定向一个无效域名,这样就不会使其生效): https://api.revenuecat.com/v1/receipts

把请求响应的 fetch_token: "xxxx" token 取出,就可以保存我们需要用的凭证了。

之后我们要给其他账号开通的时候,只需要去网页的 session 里面取出 account 字段下的 id,再加上这个订阅凭证即可给任意账号开通权限,Pro 同理。

进阶:如何大规模开通 Pro 账号?

目前市面上之前的“公益 bot”用的是什么方案来进行大规模开 Pro 账号?

ChatGPT 的安卓端订阅是采用第三方的订阅管理平台: https://api.revenuecat.com/v1/receipts 它会过这个地址来进行校验凭证,谷歌付款验证和自身凭证是单独的

然后一机无限复制 ChatGPT Pro 的逻辑就是: 需要先正常开一个 ChatGPT Pro,然后在 ChatGPT 的软件里面点击“降级为 Plus”。 这时软件就会向这个接口请求一个新的 fetch_token,生成一个全新的、属于他账号开的订阅凭证。 这个凭证每次都是全新的,只要没有用过都会生成一个。我们只需要把这个凭证拿去给其他账号使用,就可以完成一次 Pro 的账号订阅。

漏洞本质: 这个是 ChatGPT 自身的逻辑漏洞,属于没有与第三方管理好订阅接口导致的。

这也是为什么那个公益 bot 可以无限生产 Pro 的权益账号,并且需要排队等待的原因。主要还是因为和第三方订阅管理机制没有鉴权好的问题,不存在“一个凭证可以无限使用”(这方案已修复)。