夜雨聆风学习资料网

ARTICLE · 1035532

iOS ChatGPT Pro 20x 强开订阅全解析(若宇优化版)

iOS ChatGPT Pro 20x 强开订阅全解析(若宇优化版)
若宇的 AI 学习日记深度安全拆解

前端入口关了 = 商品买不到了?

iOS ChatGPT Pro 20x

强开订阅全解析

Apple IAP 协议 · buyProduct · 鉴权抓包 · 订阅转移 · 跨平台对比

技术研究与协议防御参考

IAP协议安全分析

本文看点

6 个核心环节
PART 01

核心原理

超市条码类比

PART 02

前置条件

双设备明确分工

PART 03

鉴权体系

5大核心凭证字段

PART 04

实操流程

抓包·重写·交付

PART 05

关键字段

AdamId与WebObjects

PART 06

全景与防御

三路径横向对比

大家好,我是若宇,这里是若宇的 AI 学习日记。

一个用 AI 实现年入百万的实践者,日更 365 天的第 12 天。

我会持续分享 AI 工具与工作流、AI 内容创作、个人知识管理、智能体实践,以及我在学习和实操过程中的真实复盘。

今天想和你聊聊:iOS ChatGPT Pro 20x 强开订阅背后的协议原理与安全全貌

在安全研究视角下,搞懂它为什么能绕过、鉴权字段怎么流转、跨平台对比有何差异,是构建防御最扎实的一步。

⚠️ 免责声明:本文基于一份已公开的教程和协议分析整理写成,只讨论 Apple IAP 与订阅系统的工作原理,供安全研究和防御参考。请勿用于任何未授权操作,后果自负。

00

PART

前言

PRELUDE · BACKGROUND

OpenAI 在 2026 年下半年把 Pro 20x(每月 200 美元)的新订阅入口关了。网页端撤了按钮,App 里删了选项,checkout 接口也开始拒绝新的 Pro 20x 请求。

但入口关了,不代表商品下架了。前阵子有人把一套绕过办法开源了出来,思路特别直白:不碰 OpenAI 的界面,直接对 Apple 的购买接口下单。OpenAI 关的是自家前端,App Store 后台那个 IAP 商品还挂着,只要能凑出一个合法的购买请求,Apple 照样扣款出收据,OpenAI 收到回执照样得开。

那份教程的完整版我拿到手了,一共六章,从前置条件、网络配置、越狱设置,一路讲到拦截原理和字段含义。下面在它的基础上加上我自己的分析,顺便跟之前拆过的 Stripe 协议支付 、 Google Play 订阅转移 摆在一起对照,把这条链路讲透。

01

PART

一、核心原理:为什么 App Store 能绕过 OpenAI 的限制

PRINCIPLE · 核心机制

1.1 OpenAI 关了什么

关的其实是几个面向用户的入口:网页端的订阅按钮和定价页没了,iOS/Android app 里不再列出 Pro 20x 这个选项, /payments/checkout 接口也开始拒绝 plan_type=chatgptpro 的新建请求。三条路都是"用户点得到的地方",全被掐掉了。

1.2 OpenAI 没关什么

App Store Connect 里的 IAP 商品没有下架。

在 Apple 的体系里,一个 IAP 商品有自己独立的生命周期,跟 app 界面上展不展示是两码事。app 可以决定不把某个商品摆出来,但只要它在 App Store Connect 后台还挂着 “Approved”,Apple 的购买 API 就照单全收。

类比一下:超市把某个货撤下了货架,可收银系统里那个条码还在。你拿条码去自助机一扫,照样结账走人。

1.3 Apple 的购买 API 不管 App UI 的事

Apple 的内部购买端点是:

...PROTOCOL / CODE

POST https://p70-buy.itunes.apple.com/WebObjects/MZBuy.woa/wa/buyProduct

它收到请求后做三件事:先看鉴权字段(buyParams、guid、ams、cookie、afdsv2)合不合法,再看 salableAdamId 指向的商品在不在、能不能买,最后扣款、生成 receipt,通过 App Store Server Notifications 把交易推给开发者。

它唯独不看一件事:app 当前有没有在界面上展示这个商品。Apple 的支付系统跟 app 的 UI 是两套东西,互不干涉。

1.4 OpenAI 为什么一般会认这张收据

根据 Apple 的 App Store Review Guidelines(特别是 3.1.1 In-App Purchase 条款),通过 App 内购买解锁的功能必须由 Apple 的 IAP 体系交付,开发者不能在收到合法交易后拒不发放对应权益(否则可能被 Apple 判定违规、影响上架)。因此在正常设计下,OpenAI 收到一张合法且能对应到某个账号的 Pro 20x App Store 交易通知, 预期会 为该账号开通 Pro 20x。

不过要说明:这不代表 OpenAI 毫无裁量权——它仍可以基于自身风控(异常购买、退款、账号信誉等)拒绝或事后撤销开通,也可以要求交易能正确关联到一个 OpenAI 账号(见后文"交付"一节)才发放权益。“必开"是理想模型,不是绝对保证。

所以整条链路是:

...PROTOCOL / CODE

构造 buyProduct 请求

    ↓

Apple 验证鉴权 + 商品存在

    ↓

Apple 扣款 $200

    ↓

Apple 生成 receipt

    ↓

App Store Server Notification → OpenAI

    ↓

OpenAI 验证 receipt → 合法 → 开通 Pro 20x

UI 层的限制,在协议层面毫无意义。

— 超市货架与收银系统类比:UI层下架不等于商品下架

02

PART

二、前置条件

PREREQUISITES · 设备与环境

有个前提得先说清楚:ChatGPT 官方 app 现在要求 iOS 18。

这个 app 的最低系统版本一直在往上抬,早前还是 iOS 17,最近一次更新提到了 iOS 18。低于 18 的系统在 App Store 里要么只能装到某个不再更新的旧版本,要么直接装不上。别小看这一条,它把整件事切成了两个对设备要求完全不同的阶段。

抓鉴权那一步,一台能越狱、能跑 MITM 的机器就够了。buyParams、guid、afdsv2、ams、cookie 这些都是 Apple ID 层面的凭证,跟你拿哪个 app 触发无关,随便走一个内购流程就能抓到,根本用不上 ChatGPT app。所以它可以是台便宜好越狱的老机器,iOS 15、16 都行。

交付那一步不一样。要把买到的订阅落到目标 OpenAI 账号上,通常得在登录了那个账号的 ChatGPT app 里点一下「恢复购买」,而新版 app 要 iOS 18 才装得上。

矛盾就在这里:主流越狱(palera1n、Dopamine)主要覆盖 iOS 15-16,往上到 17 已经零散,iOS 18 的公开越狱基本没有。想凑一台"既是 iOS 18、又越了狱"的机器很难。所以实操里一般是两台分工——一台老越狱机抓鉴权,一台正常的 iOS 18 设备(不用越狱)登录目标账号做交付。下面的设备配置都按这个思路来。

2.1 硬件

角色
设备
要求
说明
抓鉴权
越狱 iOS 设备
已越狱(iOS 版本取决于当前可用的越狱工具,通常 15-16)
装 MITM 证书、绕过 SSL Pinning、抓 Apple ID 鉴权数据
交付
能跑新版 ChatGPT app 的 iOS 设备
iOS 18 及以上 (无需越狱)
登录目标 OpenAI 账号,做「恢复购买」绑定订阅
代理主机
电脑
macOS / Windows / Linux
运行 MITM 代理工具
网络
稳定的美国代理
与 Apple ID 区域匹配

如果目标 Apple ID 就是你自己日常在用的(订阅会落到你自己账号),且 OpenAI 交付路径走的是 Apple 服务端通知(App Store Server Notifications),交付阶段理论上不一定要手动 Restore;但绝大多数实操场景仍以「iOS 18+ 设备 + ChatGPT app 手动恢复购买」为准,因此这里按需要两台设备来规划。

2.2 软件

工具
用途
越狱工具
palera1n(A11 及以下,checkm8 漏洞,覆盖 iOS 15-16)/ Dopamine(A12-A15,覆盖 iOS 15.0-16.6.1);iOS 17-18 公开越狱有限,按设备实际情况选择
SSL Kill Switch 2
绕过 App Store 的 SSL Certificate Pinning
MITM 代理
Charles Proxy / mitmproxy / Reqable(推荐 Charles,iOS 生态支持最好)
ChatGPT App
交付设备(iOS 18+)上安装的官方版本

2.3 账号

账号
要求
Apple ID
美区,已绑定支付方式(信用卡/借记卡/Apple 礼品卡余额),且卡内/余额足够支付一个月 Pro 20x
OpenAI 账号
目标 ChatGPT 账号(交付阶段需要在 iOS 18+ 设备上登录)

2.4 为什么必须越狱

简单说: Apple 的 App Store 和 iTunes Store 有 SSL Certificate Pinning(证书锁定)。

正常情况下,即使你在 iOS 系统里安装并信任了 MITM 代理的 CA 证书,App Store 的流量仍然无法被代理拦截——因为 App Store 只信任 Apple 自己的证书,不走系统信任链。

越狱后装 SSL Kill Switch 2(或类似 tweak),可以在 runtime hook 掉证书校验函数,让 App Store 的流量走系统信任链 → 被 MITM 代理截获。

这跟 Android 上的操作一个道理:Android 的 ChatGPT App 也有证书锁定,需要 Frida/Xposed 来绕过。 平台不同,原理一模一样。

03

PART

三、网络环境配置

NETWORK · 代理架构与证书

3.1 代理配置

Apple 的购买 API 会检查请求的源 IP 是否与 Apple ID 的注册区域匹配。美区 Apple ID 必须用美国 IP。

...PROTOCOL / CODE

iOS 设备 → HTTP 代理(MITM) → 上游 SOCKS5 代理(美国住宅 IP) → Apple 服务器

推荐架构:

...PROTOCOL / CODE

iPhone ──WiFi──▶ 电脑(Charles / mitmproxy)

                        │

                        ▼

               上游代理(US 住宅 IP)

                        │

                        ▼

             p70-buy.itunes.apple.com

Charles 配置上游代理: Proxy → External Proxy Settings → SOCKS Proxy → 填入美国代理地址

— 网络架构:iOS 越狱设备 → MITM 代理 → 上游美国住宅 IP → Apple 服务器

3.2 MITM 证书安装

1打开 Charles → Help → SSL Proxying → Install Charles Root Certificate on a Mobile Device

2iPhone 浏览器访问 chls.pro/ssl 下载证书

3设置 → 通用 → VPN 与设备管理 → 安装描述文件

4设置 → 通用 → 关于本机 → 证书信任设置 → 启用完全信任

关键步骤 :第 4 步很多人漏掉。iOS 安装证书和信任证书是两个独立操作,只安装不信任 = 白装。

3.3 SSL Proxying 规则

在 Charles 中配置 SSL Proxying:

...PROTOCOL / CODE

Proxy → SSL Proxying Settings → Enable SSL Proxying

Add:

  Host: *.itunes.apple.com

  Port: 443

Add:

  Host: *.apple.com

  Port: 443

如果用 mitmproxy:

...BASH

mitmproxy --mode regular --set upstream_cert=false -p 8888

配置完成后,访问 App Store 应该能在代理工具中看到明文 HTTPS 请求。如果还是显示 CONNECT 隧道而不是解密内容,说明 SSL Kill Switch 没生效——检查越狱工具和 tweak 的兼容性。

04

PART

四、iOS 越狱设备配置

JAILBREAK · 工具与Tweak

4.1 越狱工具选择

这一台只用来 抓鉴权 ,不需要跑 ChatGPT app,所以选一个越狱成熟、稳定的老系统即可:

iOS 版本
处理器
推荐工具
类型
15.0-16.6.1
A12-A15
Dopamine
semi-untethered(rootless)
15.0-16.7.x
A8-A11
palera1n
semi-tethered(checkm8,需重插)
17.x / 18.x
A12+
公开越狱有限,视设备而定

提示 :抓鉴权的设备不用追新。用一台老款 iPhone(如 A11 的 iPhone 8/X,配 palera1n)专门做这件事就够了,闲鱼几百块一台。 注意区分角色 :这台老机器负责抓鉴权,真正登录目标账号、做「恢复购买」的是另一台 iOS 18+ 设备(见 §2)——别指望在一台 iOS 15 的老机器上装新版 ChatGPT app。

4.2 安装必要 Tweak

越狱完成后,通过 Cydia/Sileo 安装:

...PROTOCOL / CODE

SSL Kill Switch 2    — 绕过证书锁定

PreferenceLoader     — Tweak 设置面板

AppList              — 应用列表(SSL Kill Switch 依赖)

SSL Kill Switch 2 设置:

...PROTOCOL / CODE

Settings → SSL Kill Switch 2

  ├── Disable Certificate Validation: ON

  └── 选择目标 App → 勾选 App Store / iTunes Store

注意 :不要全局开启证书绕过——那样会影响所有 App 的安全性。只针对 App Store / iTunes Store 开启就够了。

4.3 验证 MITM 生效

打开 App Store → 随便搜个 App → 查看代理工具:

成功 :看到 GET https://p70-buy.itunes.apple.com/... 的解密请求

失败 :只看到 CONNECT p70-buy.itunes.apple.com:443 且无解密内容

如果失败,排查:

1SSL Kill Switch 是否选中了正确的进程( com.apple.AppStore )

2越狱环境是否完整( uicache / ldrestart 后重试)

3代理证书是否已经被 完全信任 (不只是安装)

05

PART

五、订阅拦截与转移原理

AUTHENTICATION · 鉴权体系

这一节是整个方法的核心。

5.1 Apple 购买请求的鉴权体系

在 App Store 里点一下"购买”,iOS 会往 Apple 的购买服务器发一个 HTTP POST 请求,里头带着五个关键的鉴权字段:

字段
全称
说明
类比
buyParams
Buy Parameters
Apple 生成的购买上下文参数包,包含加密的会话数据
类似 Stripe 的client_secret
guid
Global Unique Identifier
设备唯一标识符,由硬件信息计算得出
类似 Stripe 指纹的muid
afdsv2
Apple Fraud Detection Service v2
Apple 的反欺诈指纹 token,采集设备行为数据
类似 Stripe Radar 的设备指纹
ams
Apple Media Services
媒体服务鉴权 token
类似 RevenueCat 的 API Key
cookie
Session Cookies
Apple ID 会话 cookie(含myacinfo 、 itctx 等)
类似 OpenAI 的__Secure-next-auth

这五个字段凑齐,等于拿到了你 Apple ID 的完整付款授权——谁手里有它们,谁就能以你的身份向 Apple 下单。

5.2 各字段深度解析

FIELD
buyParams

这是一个 Base64 编码的二进制数据包,由 App Store 客户端在发起购买时生成。内部包含:

当前 Apple ID 的 session 信息

购买请求的签名数据

设备上下文信息

重要特性 :根据原始教程的描述和实际操作验证,buyParams 与 当前购买会话 绑定,但据称不与 特定商品 ID 绑定——这意味着触发任意 IAP 时抓到的 buyParams,可以配合不同的商品参数(如 salableAdamId)使用。这是整个方法成立的关键前提。

FIELD
guid

设备的唯一标识。在 iTunes/App Store 这套协议里,guid 通常由设备网络接口的 MAC 地址等硬件标识生成,表现为一串十六进制字符(桌面客户端上常见是 12 位,真机上的取值方式可能不同)。

它跟设备硬件绑定,不会随便变。同一台机器反复操作,guid 一直是那一个——风控要盯的话,这是个很明显的锚点。

FIELD
afdsv2

Apple Fraud Detection Service v2。这是 Apple 自研的反欺诈系统,类似于 Stripe 的 Radar。根据已知的设备指纹技术和逆向分析,它在设备端可能采集的信号包括(不限于):

传感器数据(加速度计 / 陀螺仪等)

设备状态(电池、屏幕亮度等)

触控行为模式

网络环境信息

系统运行时信息

生成的 token 是一个很长的字符串(通常 1000+ 字符),每次购买请求都会重新生成。

越狱对 afdsv2 的影响 :Apple 的 FDS 理论上可以检测到越狱状态。但根据社区反馈,只要不修改 afdsv2 的生成过程(即让系统正常收集并生成),越狱设备的 afdsv2 通常仍会被接受。风险是长期频繁操作可能积累风控分数被标记。

FIELD
ams

Apple Media Services token,用于标识当前登录的 Apple ID 在 Apple 媒体服务体系中的身份。这个 token 通常在 Apple ID 登录时颁发,有效期较长。

FIELD
cookie

Apple ID 的会话凭据集合。这里的"cookie"是一个泛称,实际包含 HTTP Cookie 和自定义请求头两类:

Cookie:

Cookie 名
说明
myacinfo
Apple ID 主会话 token
itctx
iTunes 上下文 token

自定义请求头(随 cookie 一起抓取):

Header 名
说明
X-Dsid
Directory Services ID(Apple ID 数字标识)
X-Apple-I-MD
Machine Data(设备标识数据)
X-Apple-I-MD-M
Machine Data Metadata(设备标识元数据)

5.3 与 Stripe / Google Play 的鉴权对比

三个平台的支付协议我都拆过,正好放在一起做个对比:

维度
Stripe 协议支付
Google Play (RevenueCat)
Apple IAP (buyProduct)
绕过层
Web UI → 直调 Stripe API
App UI → Xposed 拦截 BillingClient
App UI → 直调 Apple Purchase API
鉴权抓取方式
HAR 抓包(浏览器 DevTools)
MITM + Xposed Hook
MITM(越狱 + SSL Kill Switch)
核心鉴权字段
pk\_live / ctoken / client\_secret / guid+muid+sid
fetch\_token + app\_user\_id + RC API Key
buyParams / guid / afdsv2 / ams / cookie
反欺诈系统
Stripe Radar + hCaptcha Enterprise
Google Play Protect + SafetyNet
Apple FDS (afdsv2)
TLS 指纹检测
有(Cloudflare + Stripe 自检)
无(RC 不检查 TLS 指纹)
有(Apple 自有 CDN 检测)
证书锁定
无(浏览器不锁定)
有(需 Frida/Xposed 绕过)
有(需 SSL Kill Switch 绕过)
token 有效期
Session 级(分钟到小时)
72 小时(未 Acknowledge)
Session 级
复用性
每次需要新 ctoken
一 token 一账号
需看具体实现

三个平台的共同点: 都是在协议层绕过 UI 层的限制,核心逻辑完全相同。

差异在于"如何获取鉴权凭据"和"反欺诈系统有多强"。Stripe 最容易(浏览器 DevTools 导出 HAR 即可),Google Play 居中(需要 Root/Xposed 但不需要越狱),Apple 最难(必须越狱 + MITM)。

5.4 “订阅转移"的原理

文档标题里还有个关键词: 订阅转移 。

这跟之前拆过的 Google Play 订阅转移 是同一个思路:

1Apple ID A 在越狱设备上完成购买 → Pro 20x 订阅绑定到 Apple ID A

2ChatGPT App 收到 App Store 的购买回执,准备把权益绑定到当前登录的 OpenAI 账号

3在 App 处理回执之前 ,切换 ChatGPT 的登录账号到目标账号 B

4App 把 Pro 20x 权益绑到了账号 B

注意 :上面这条路径描述的是"通过 App 的 StoreKit 正常发起购买"的场景。而本文的核心方法是用 原始 buyProduct API 完成购买——此时 App 并不会自动收到一个待提交的回执。因此在 API 购买的场景下,真正可靠的绑定方式是下面 §9.2 的 Restore Purchases :设备登录购买用的 Apple ID A,在登录了目标 OpenAI 账号 B 的 ChatGPT app 里点「恢复购买」,StoreKit 会向 Apple 查到 A 名下的 Pro 20x 订阅并同步给账号 B。

或者更直接的方式,类似之前分析过的 iOS 收据复用漏洞 :

1在设备上完成购买,拦截 App 发给 OpenAI 的回执提交请求

2修改请求中的 auth token(换成目标账号的 token)

3重放请求 → 目标账号获得 Pro 20x

说到底,Apple 只负责收钱出票,OpenAI 只负责验票开权。中间这张票落到谁头上,取决于你怎么操作。

06

PART

六、订阅流程详解

WORKFLOW · 三阶段拆解

6.1 完整操作流程

...PROTOCOL / CODE

┌─────────────────────────────────────────────────────────┐

│               Phase 1: 鉴权数据捕获                      │

│                                                         │

│  越狱 iOS 设备 + MITM 代理 + SSL Kill Switch            │

│  打开 App Store → 触发任意 IAP 购买(如 Plus)           │

│  代理中拦截 POST .../buyProduct 请求                     │

│  提取: buyParams, guid, afdsv2, ams, cookie             │

│  阻断请求(不让它真正完成支付)                           │

└───────────────────────┬─────────────────────────────────┘

                        │

                        ▼

┌─────────────────────────────────────────────────────────┐

│               Phase 2: 构造 Pro 20x 购买请求              │

│                                                         │

│  保留 Phase 1 的鉴权字段                                 │

│  替换商品参数为 Pro 20x 的值:                             │

│    productType = A                                      │

│    salableAdamId = 6657954405                            │

│    offerName = oai_chatgpt_pro_20000_1m                 │

│    price = 200000                                       │

│    appAdamId = 6448311069                               │

│  发送到: p70-buy.itunes.apple.com/.../buyProduct        │

└───────────────────────┬─────────────────────────────────┘

                        │

                        ▼

┌─────────────────────────────────────────────────────────┐

│               Phase 3: Apple 处理 + OpenAI 开通           │

│                                                         │

│  Apple 验证鉴权 → 扣款 $200 → 生成 transaction           │

│  App Store Server Notification → OpenAI 后端             │

│  OpenAI 验证 receipt → 合法 → 开通 Pro 20x              │

│  或: 在 ChatGPT App 中 "Restore Purchases" 触发同步     │

└─────────────────────────────────────────────────────────┘

6.2 Phase 1 详细步骤

Step 1 :越狱设备连接 MITM 代理,确认代理工作正常。

Step 2 :在 Charles 中设置 Breakpoint(断点拦截):

...PROTOCOL / CODE

Proxy → Breakpoints → Add:

  Protocol: HTTPS

  Host: p70-buy.itunes.apple.com

  Path: */buyProduct*

  方向: Request(拦截请求,不拦截响应)

Step 3 :在越狱设备上打开 ChatGPT App → 进入订阅页面 → 触发任意一个 IAP 购买流程。

这一步你可以随便选哪个套餐——Plus、Pro Lite、随便一个。目的不是真的购买,而是触发 App Store 的支付流程,让系统生成鉴权数据。

Step 4 :当 App Store 弹出支付确认面板时,确认支付(Face ID / Touch ID / 密码)。

Step 5 :确认后,Charles 会在断点处拦截到 POST .../buyProduct 请求。此时请求 还没有发送到 Apple 服务器 。

Step 6 :从请求体中提取 5 个关键字段并保存:

...PROTOCOL / CODE

buyParams = <Base64 长字符串>

guid = <十六进制字符串,长度视设备而定>

afdsv2 = <1000+ 字符的长字符串>

ams = <Apple Media Services token>

cookie = <完整的 Cookie 字符串>

Step 7 :在 Charles 中选择 Abort (中止请求),不让它到达 Apple 服务器。这样不会产生真实扣款。

6.3 Phase 2 详细步骤

拿到鉴权数据后,用脚本或者 HTTP 工具(如 Postman / curl / Python requests)构造 Pro 20x 的购买请求:

— 抓包拦截与重写:保留 Apple ID 鉴权凭据,替换为 Pro 20x 商品参数

...PROTOCOL / CODE

POST https://p70-buy.itunes.apple.com/WebObjects/MZBuy.woa/wa/buyProduct

Content-Type: application/x-www-form-urlencoded

Cookie: <Phase 1 保存的完整 cookie>

X-Apple-I-MD: <Machine Data>

X-Apple-I-MD-M: <Machine Data Metadata>

X-Dsid: <Directory Services ID>

productType=A

&price=200000

&salableAdamId=6657954405

&pricingParameters=STDQ

&pg=default

&offerName=oai_chatgpt_pro_20000_1m

&appAdamId=6448311069

&guid=<Phase 1 的 guid>

&buyParams=<Phase 1 的 buyParams>

&afdsv2=<Phase 1 的 afdsv2>

&ams=<Phase 1 的 ams>

注意事项 :

1代理 IP 一致性 :这个请求必须走和 Phase 1 相同的出口 IP。Apple 会比对购买请求的源 IP,如果和鉴权生成时的 IP 不同,可能被拒。这与 Stripe 协议支付 中的"出口 IP 一致性"规则完全相同。

2时效性 :鉴权数据(特别是 buyParams 和 afdsv2)有时效性。抓到后应尽快使用,拖太久 token 会过期。

3请求头 :除了 Cookie 外,还需要带上 Apple 的特征请求头( X-Apple-I-MD 等)。这些也在 MITM 抓包中一并获取。

6.4 Phase 3:交付

Apple 处理购买后有两种通知机制:

机制一:App Store Server Notifications V2(服务端到服务端)

Apple 向 OpenAI 配置的 notification endpoint 发送 JSON Web Signature (JWS) 格式的通知,包含完整的交易信息。OpenAI 的后端验证 JWS 签名 → 确认交易合法 → 开通对应的订阅。

这是最可靠的通知路径,不需要客户端参与。

机制二:App 端 Restore Purchases

在 ChatGPT App 中执行"恢复购买"操作(StoreKit 的 restoreCompletedTransactions ),App 会向 Apple 服务器查询当前 Apple ID 的所有有效订阅,然后把新的 Pro 20x 订阅同步到当前登录的 OpenAI 账号。

换句话说,Apple 扣完钱,把"这个用户买了 Pro 20x"的通知发给 OpenAI,OpenAI 就得开权益;用户自己在 app 里点一下"恢复购买”,走的是另一条路,结果一样。

07

PART

七、关键请求与字段说明

PARAMETERS · 字段与端点

7.1 商品参数逐字段拆解

...PROTOCOL / CODE

productType=A&price=200000&salableAdamId=6657954405&pricingParameters=STDQ&pg=default&offerName=oai_chatgpt_pro_20000_1m&appAdamId=6448311069

字段
含义
怎么确定的
productType
A
Auto-Renewable Subscription(自动续期订阅)
Apple IAP 的订阅商品类型标识
price
200000
对应 Pro 20x 月费 $200.00
Apple 内部价格编码(具体单位以实际抓包为准)
salableAdamId
6657954405
Pro 20x 这个 IAP 商品的 Apple 内部 ID
每个 IAP 商品在 Apple 系统里都有唯一的 Adam ID
pricingParameters
STDQ
标准 App Store 商品的定价参数
逆向工具(如 ipatool)里已知的常量:普通 App Store 商品用STDQ ,Apple Arcade 用 GAME
pg
default
支付组
默认支付组
offerName
oai_chatgpt_pro_20000_1m
商品名称标识
oai =OpenAI, chatgpt =ChatGPT, pro =Pro 档, 20000 =2 万美分即 $200, 1m =1 个月
appAdamId
6448311069
ChatGPT App 的 App Store ID
apps.apple.com/app/id6448311069 可验证

7.2 ChatGPT 的 IAP 商品体系(推测)

基于 offerName 的命名规则推导——仅 Pro 20x 的值来自已公开的教程,其余为合理推测:

订阅档位
月费
推测的 offerName
salableAdamId
Plus
$20
oai_chatgpt_plus_2000_1m (推测)
未知
Pro Lite (5x)
$100
oai_chatgpt_pro_10000_1m (推测)
未知
Pro (20x)
$200
oai_chatgpt_pro_20000_1m (已确认)
6657954405

7.3 端点地址解析

...PROTOCOL / CODE

https://p70-buy.itunes.apple.com/WebObjects/MZBuy.woa/wa/buyProduct

部分
含义
p70
Apple CDN 服务器池编号。Apple 使用多个服务器池(p25, p47, p70 等),不同设备/区域可能被路由到不同的池
buy.itunes.apple.com
iTunes Store 购买服务域名
WebObjects
Apple 的 WebObjects 框架标识(Apple 自研的 Java Web 框架,iTunes Store 后端至今仍在使用)
MZBuy.woa
“MZ” = MobileZone,Buy 应用的 WebObjects Application
wa/buyProduct
WebObjects Direct Action,执行购买操作

题外话 :WebObjects 最初由 NeXT 公司在 1996 年推出(起初基于 Objective-C,2000 年 WebObjects 5 转向 Java),后随 NeXT 被 Apple 收购。Apple 的 iTunes Store / App Store 后端至今仍在使用这个已有 30 年历史的框架。 MZBuy.woa 这种 URL 结构在互联网上几乎只有 Apple 在用——看到 .woa 后缀就知道是 Apple 的后端。

7.4 buyParams 的结构特征

虽然 buyParams 的内部格式是加密的(Apple 的私有协议),但从外部特征可以观察到:

编码格式 :Base64

解码后大小 :通常 200-500 字节

包含信息 :经过加密的购买会话上下文

生成时机 :在设备端触发购买流程时由 StoreKit 框架生成

有效期 :通常几分钟内有效

绑定关系 :与当前 Apple ID session + 设备绑定,但不与特定商品绑定

7.5 afdsv2 的结构特征

Apple Fraud Detection Service v2 token:

长度 :通常 1000-4000 字符

编码 :Base64 或自定义编码

采集数据 :加速度计、陀螺仪、电池状态、屏幕信息、网络环境、应用列表等

生成频率 :每次购买请求都重新生成

对应平台 :类似 Stripe Radar 的 device_data ,或 Google 的 SafetyNet attestation

与 Stripe 的对比:

Stripe Radar
Apple FDS (afdsv2)
信号来源
浏览器 JS(m.stripe.com/6)
iOS 系统级 API
采集深度
浏览器指纹、Canvas、WebGL
硬件传感器 + 系统状态
检测越狱/Root
不直接检测
可能检测(但不一定阻断)
可伪造性
较容易(curl\_cffi 等)
困难(硬件数据难以伪造)

这也是为什么 Apple IAP 路径的安全级别比 Stripe 协议支付更高—— 你很难在没有真实 iOS 设备的情况下伪造 afdsv2。 必须在真机上操作。

08

PART

八、跨平台攻击面全景对比

ATTACK SURFACE · 跨平台对比

把三个支付平台的协议都拆过一遍之后,可以画一张完整的攻击面全景图:

— 跨平台支付协议与攻击面全景对比

8.1 三条路径

...PROTOCOL / CODE

┌──────────────────────────────────────────────────────────────────┐

│                    ChatGPT Pro 20x 开通                          │

│                                                                  │

│  路径 1: Stripe 协议支付                                          │

│  ┌─────────┐   ┌────────────┐   ┌────────────┐   ┌──────────┐  │

│  │ HAR 抓包 │→ │ 构造 ctoken │→ │ PI confirm  │→ │ Stripe   │  │

│  │ (浏览器) │   │ + 税务优化  │   │ + 3DS 处理  │   │ webhook  │  │

│  └─────────┘   └────────────┘   └────────────┘   └──────────┘  │

│                                                                  │

│  路径 2: Google Play 订阅转移                                     │

│  ┌─────────┐   ┌────────────┐   ┌────────────┐   ┌──────────┐  │

│  │ MITM 或  │→ │ 提取 fetch │→ │ RC /receipts│→ │ RC 通知  │  │

│  │ ADB 提取 │   │ _token     │   │ + account  │   │ OpenAI   │  │

│  └─────────┘   └────────────┘   └────────────┘   └──────────┘  │

│                                                                  │

│  路径 3: Apple IAP 强开(本文)                                    │

│  ┌─────────┐   ┌────────────┐   ┌────────────┐   ┌──────────┐  │

│  │ 越狱    │→ │ 抓取 5 个   │→ │ buyProduct  │→ │ ASSN V2  │  │

│  │ + MITM  │   │ 鉴权字段   │   │ API 调用    │   │ 通知     │  │

│  └─────────┘   └────────────┘   └────────────┘   └──────────┘  │

└──────────────────────────────────────────────────────────────────┘

8.2 全维度对比

维度
Stripe 协议支付
Google Play 转移
Apple IAP 强开
设备要求
无(纯 HTTP)
Android(Root 或 MITM)
iOS(必须越狱)
入门难度
单次成本
信用卡扣款金额
信用卡扣款金额
Apple ID 支付方式扣款
自动化程度
极高(纯 API)
高(ADB + API)
中(依赖越狱设备)
反检测难度
TLS 指纹 + hCaptcha
较低
afdsv2 设备指纹
OpenAI 验证
Stripe webhook
RevenueCat 通知
App Store Server Notification
可规模化
完全可脚本化
可脚本化
受限于越狱设备数量
OpenAI 能修吗
能(加强 session 校验)
能(RC 侧加 user 校验)
难(需要在 ASC 下架商品)

8.3 从攻击面看防御优先级

最容易修的是 Google Play 路径 :RevenueCat 只要在 /v1/receipts 接口加上 app_user_id 与付款人的校验,就能堵住转移漏洞。

Stripe 路径本质上不是漏洞 ——它只是用 API 替代了浏览器操作,属于自动化而非绕过。OpenAI 关闭 checkout 入口就堵死了这条路(但目前 Stripe 路径仅用于已开放的订阅档位)。

Apple IAP 路径最难修 。要堵这个洞,OpenAI 有两个选择:

1在 App Store Connect 下架 Pro 20x 商品 → 但这会影响现有 iOS Pro 用户的续费

2在收据验证时拒绝新的 Pro 20x 购买 → 可行,但需要区分"新购买"和"续费"

Apple 自己也很难帮忙——因为从 Apple 的角度看,这是一笔完全合法的交易。用户有 Apple ID、有支付方式、有真实设备、商品也是 approved 状态。Apple 的系统设计初衷就是让开发者可以灵活管理 IAP 商品,而不是让 Apple 来决定哪些商品能卖。

09

PART

九、关于"订阅转移"的额外分析

TRANSFER · 收据复用与恢复

9.1 收据转移(Receipt Transfer)

这个方法跟之前写的 iOS 收据复用漏洞 是可以结合用的。

流程:

1通过 buyProduct API 完成购买,Apple 向 ChatGPT App 推送 receipt

2拦截 ChatGPT App 提交给 OpenAI 的 receipt 请求

3将 receipt 绑定到不同的 OpenAI 账号

但需要注意:2026 年 7 月后 OpenAI 已经 部分修复 了 iOS 收据复用漏洞。具体表现为收据的 original_transaction_id 会被检查——同一个 original_transaction_id 不能同时绑定多个 OpenAI 账号。

但如果每次都是新购买(新的 transaction),收据都是新的 ,转移不受此限制。

9.2 Restore Purchases 路径

更简单的转移方式:

1在越狱设备上用 Apple ID A 完成 Pro 20x 购买

2在 ChatGPT App 中登录 OpenAI 账号 B

3在 App 内执行 “Restore Purchases”(恢复购买)

4StoreKit 查询 Apple ID A 的有效订阅 → 找到 Pro 20x

5ChatGPT App 将 Pro 20x 绑定到 OpenAI 账号 B

这要求 :在步骤 3 时,设备登录的 Apple ID 必须是 A(即购买 Pro 20x 的那个 Apple ID)。这样 StoreKit 才能查到对应的订阅。

10

PART

十、风险与注意事项

SECURITY & RISKS · 安全红线

10.1 Apple 账号风险

风险
等级
说明
Apple ID 封禁
频繁异常购买可能触发 Apple 的账号风控
支付方式封禁
信用卡频繁大额 IAP 可能被银行标记
设备封禁
Apple 目前不会因为 IAP 行为封禁设备,但 guid 会被记录
退款追溯
Apple 的退款政策可以追溯,OpenAI 收到退款通知会撤销订阅

10.2 越狱设备安全

越狱 = 放弃 iOS 的安全模型。需要注意:

1不要在越狱设备上存储敏感信息 (主力 Apple ID、银行 App 等)

2专机专用 :用一台专门的老设备做这件事

3及时清理 :操作完成后关闭 SSL Kill Switch,避免日常使用时被中间人攻击

10.3 合法性

不同司法管辖区对这类操作的定性不同。一些可能的法律风险:

绕过技术保护措施 :越狱本身在某些国家/地区属于灰色地带

违反 TOS :OpenAI 和 Apple 的服务条款都禁止此类操作

计算机欺诈 :通过技术手段获取未被授权的服务访问权

本文仅供技术研究与学习。 实际操作的法律后果由读者自行承担。

11

PART

十一、技术总结

SUMMARY · 链路总结与本质

完整攻击链路

...PROTOCOL / CODE

越狱 iOS + MITM → 抓取 buyParams/guid/afdsv2/ams/cookie

                    ↓

            构造 Pro 20x buyProduct 请求

                    ↓

  p70-buy.itunes.apple.com/WebObjects/MZBuy.woa/wa/buyProduct

                    ↓

         Apple 验证鉴权 → 扣款 $200 → 生成 receipt

                    ↓

    App Store Server Notification V2 → OpenAI 后端

                    ↓

        OpenAI 验证 receipt → 合法 → 开通 Pro 20x

漏洞本质

平台方(OpenAI)在 UI 层关闭了入口,但在支付平台(Apple)层面没有关闭商品。 只要 App Store Connect 里的 IAP 商品还处于 “Approved” 状态,Apple 的购买 API 就接受任何合法的购买请求,不管 App 的 UI 有没有展示这个商品。

这跟我之前发现的每一个支付漏洞,本质都一样:

0 PHP 跨区混淆 : Stripe 创建 session 时的区域信号不一致

prorationMode Hook : Google Play Billing 的 proration 参数可被客户端修改

RevenueCat 凭证转移 : RevenueCat 不校验付款人与开通人的对应关系

₱982 Pro 20x TOCTOU : Stripe PI 金额锁定与订阅计划变更不互斥

iOS 收据复用 : OpenAI 不校验收据与 Apple ID 的绑定关系

iOS IAP 强开(本文) : App Store 商品未下架,API 层可绕过 UI 层限制

说白了就一句话:几层状态得对齐。UI 关了,API 也得关;API 关了,支付平台后台的商品也得跟着下架。中间任何一层没关严,那层就是留给别人的入口。

///

PART

参考资料

REFERENCES · 官方文档与工具

Apple In-App Purchase 文档

App Store Server Notifications V2

StoreKit 2 文档

SSL Kill Switch 2

mitmproxy 官方文档

几层状态对齐,才是真正的安全闭环

让 AI,走进生活。

如果这篇深度拆解对你有启发,欢迎点个「赞」和「在看」。

平时整理的协议逆向、AI 工具和实践笔记,我也会放在「AI 研究社」。想一起看看,可以在公众号后台回复「AI」。

这里为你准备了以下免费赠品:

📦 AI 学习资料包(提示词库、工具清单、实战手册)

🔗 研究社入口(长期更新的知识库 + 交流群)

咱们一起学习、一起进步。

相关学习资料