独立调查:ChatGPT 的 __obi 跨站 Cookie 可将站外浏览行为关联到 ChatGPT 账号
ChatGPT 现在可以通过广告收集器了解你在其他网站上的行为
精选理由
作者以第一手流量捕获复现了 OpenAI 广告收集器的跨站追踪机制,读者可以据此理解 ChatGPT 账号与站外浏览行为的关联路径。
AI 摘要
作者通过自己手机上的流量捕获复现了 OpenAI 广告收集器机制:bzr.openai.com 在 .openai.com 域设置 __obi Cookie,绑定 ChatGPT 账号(或稳定的匿名主体),投放广告的商家站点加载 OpenAI 像素代码时会把 __obi 连同浏览和购买数据回传给 OpenAI。
正文 · AI 翻译
OpenAI 的广告收集器位于 bzr.openai.com,会设置一个名为 __obi 的 cookie,作用域限定为 .openai.com。该值在你使用 ChatGPT 期间存在,并与你的 ChatGPT 账户绑定。随后,__obi 会从你访问的普通网站发送给 OpenAI。
任何在 ChatGPT 上购买广告的公司都会在自己的网站上安装一小段 OpenAI 代码,就像零售商已经安装 Meta 和 Google 的追踪代码一样。加载这段代码会将 __obi 连同你正在浏览的页面数据一起发送给 OpenAI。这包括你正在搜索的产品、正在阅读的文章以及购买行为。
归根结底,OpenAI 可以将你在这些网站上的行为与你的 ChatGPT 账户关联起来。
我在自己的手机上复现了完整机制,用两种独立的捕获方法进行了验证,并与覆盖 1,029 个主机名上 936 个不同广告主像素的、长达数月的观测流量进行了交叉核对。
工作原理
第 1 步。ChatGPT 创建一个标识符并对其进行签名。
在 chatgpt.com 上,客户端生成 16 个随机字节,并调用 POST /backend-api/bazaar/obi/sync-token(未登录时则调用 /backend-anon/)。后端返回一个 RS256 JWT:
{ "iss": "chatgpt-wadi", "aud": "bzr.openai.com", "purpose": "obi_sync", "operation": "set", "consent_decision": "analytics_allowed", "consent_policy_version": "user_granular_consent_v1", "sub": "«redacted: 64-hex account subject»", "subject_type": "account_user", "obi": "«redacted: 22-char identifier»", "exp": "«iat + 60s»" }
sub 是账户。obi 是标识符。token 将二者绑定,作用域限定于收集器,并在 60 秒后过期。bzr 代表 bazaar,即 OpenAI 内部对广告平台的称呼;wadi 是签发服务。
第 2 步。该标识符成为 OpenAI 域名下的一个 cookie。
客户端将 {"token": "«JWT»"} 跨站 POST 到 bzr.openai.com/v1/obi/sync。响应如下:
Set-Cookie: __obi=«redacted»; Domain=.openai.com; HttpOnly; Max-Age=31536000; Path=/; SameSite=none; Secure
SameSite=none 与 Secure 是 cookie 在跨站请求中被发送所需的配置。Max-Age 为一年。JWT 中的 obi 值与 cookie 中的值完全相同。
第 3 步。广告主网站将其回传。
有三类请求会从广告主的页面发往 OpenAI 的主机。在一台 jar 中含有 __obi 的手机上,这三类请求都携带了它:
请求 携带了 __obi 备注
GET bzrcdn.openai.com/sdk/oaiq.min.js 是 脚本本身的加载
POST bzr.openai.com/v1/sdk/events 与 obref 是 转化事件
POST bzr.openai.com/v1/sdk/events,裸请求体 是 该 SDK 的“无凭据”路径
GET bzrcdn.openai.com/pixel-config/… 完全没有 cookie 头 对照组
第一行尤其值得关注。像素 SDK 有一条省略凭据的代码路径,但这无济于事:在 OpenAI 的任何代码运行之前,浏览器就已经把 cookie 附加到了加载该 SDK 的 <script src> 请求上。仅仅因为加载了这个标签,标识符就被泄露了。
随之传输的内容
同一个 SDK 还会从广告主的页面上收集身份信息。其载荷将四个来源分开,并由 OpenAI 自己标注:in 对应广告主有意传入的值,而 fm、ht、js 则对应 SDK 从表单字段、渲染后的页面文本以及标签管理器总线中抓取的值。在观测到的流量中,抓取到的身份信息数量超过了广告主提供的身份信息,分别为 685 个事件对 255 个。
标签管理器总线是电子邮件最大的来源。该 SDK 替换了window.dataLayer.push用自己的函数,还读取adobeDataLayer,并通过解析l=参数(来自gtm.jsscript 标签)来定位被重命名的 GTM 层。当前版本从中获取电子邮件和电话。0.1.31 版本在 8 月 27 日缩小范围之前,还获取了姓名和地理位置。
电子邮件、电话、名字和姓氏在传输前均经过 SHA-256 哈希处理。国家、地区、城市和邮政编码则以明文发送。邮政编码是被收集最多的表单字段,在 28 个网站上共发生 100 次事件。
URL 在发送前会被缩减为源站加路径;在观测到的 23,929 个 URL 中,没有一个携带查询字符串。路径得以保留,而到达收集器的路径中包括一种医疗状况、一个债务解决方案漏斗以及一份诉讼受理表单。
在 881 个已知设置的像素中,有 638 个启用了自动匹配,包括所有观察到的信贷和借贷广告主。它由 OpenAI 的 Ads Manager 控制。一份拒绝名单排除了密码、一次性验证码、卡号、SSN、出生日期、病史、诊断和法院相关字段。
该 cookie 被设计为可跨站点使用
在相同的广告主页面请求中,浏览器屏蔽了所有其他 OpenAI cookie:
Cookie 结果
oai-did、oaicom-stable-id 已拦截,SameSite=Lax
oai-client-auth-info,会话 cookie 已拦截,域名不匹配
__obi 已发送
__obi 是唯一配置了 SameSite=None 的 OpenAI 标识符。
观测到的触达范围
在我的设备上,一个 __obi 值从 12 个商业网站通过 13 个不同的像素 ID 被发送至 OpenAI,其中包括 Chewy、Wayfair、ThriftBooks、Eventbrite、HelloFresh、Coursera 和 SeatGeek。每个请求都以 202 被接受。
在更广泛的流量中,30 个不同的 __obi 值中有 12 个出现在不止一个广告主名下,其中一个出现在十个广告主名下。
在你登出状态下它依然有效
在 932 个已解码的同步 token 中,736 个携带 subject_type: account_user,196 个携带 anonymous。匿名主体与账户主体一样稳定:每台设备一个,至少持续 27 天。
OpenAI 的 cookie 政策怎么说
OpenAI 将 __obi 列在分析类 Cookie 下,有效期一年,出现在 chatgpt.com 和 openai.com 上。它是该栏目中唯一的条目。该政策将分析类 Cookie 描述为帮助 OpenAI 了解其服务的表现及使用情况。
OpenAI 将分析类和营销类作为两个独立的同意选项来运行,即 oai_consent_analytics 和 oai_consent_marketing,而我解码的每一个同步 token 都带有 consent_decision: analytics_allowed。允许分析类但拒绝营销类的人就会得到这个。
OpenAI 的回应
我于 9 月 14 日将相关机制和两个问题发送至 press@openai.com 和 privacy@openai.com:为什么 __obi 被归类为分析类 cookie,以及一个授予分析同意但拒绝营销同意的用户是否仍会收到它。回复来自 OpenAI Support。它确认收到了询问,表示相关观察结果将在内部共享以供审查,但没有回答这两个问题中的任何一个。上述脚本加载观察是在询问发出之后做出的。如果 OpenAI 作出回应,我将更新本文。
局限
浏览器。 在 Android 版 Chrome 上观察到。Safari 的智能防跟踪会阻止所有第三方 cookie,而 iOS 上的 Chrome 运行于 WebKit,因此该机制在任何 iOS 浏览器上都不起作用。桌面版 Chrome 尚未测试。
门控。大约每五个 ChatGPT 会话中就有一个会生成同步 token。ChatGPT 的移动网页客户端在投放广告时完全不进行同步。按照以下步骤操作的人可能会看到像素触发,但没有附带任何 cookie。
这种关联并未被观测到。 202 意味着收集器接受了附带 cookie 的事件。OpenAI 在服务端将其解析到账户,这一点从设计上可以推断;我并未亲眼观察到这一过程。
Meta 多年前就构建了结构上等价的东西。一个已登录的账户、像素触发时的第三方 cookie、站外转化被解析到某个用户画像。这套机制是广告技术的标准做法。没有先例的是将其运行在 AI 聊天产品上。人们会向这些产品倾诉他们不会发在社交网络上的事情,而这些产品正越来越多地代表他们行事。
该像素的另一个 cookie 不会这样做。 __obref 设置在广告主自己的域名上。每个站点获得不同的值,任何站点都无法看到其他站点的值。在观测到的 2,860 个值中,有 2,828 个仅出现在一个广告主之下。
广告主看不到这一点。 __obi 属于一个他们的脚本无法读取的域名。他们安装了一个转化像素,却无从得知自己的访客正被解析到某个 ChatGPT 身份。
原文
Original Title
ChatGPT 现在可以通过广告收集器了解你在其他网站上的行为
Source
Hacker News 热门(buzzing.cc 中文翻译)
Site
buchodi.com
Author
lmbbuchodi
Published
2026-09-21 02:05