AI 热点快报:ChatGPT 账号被一枚跨站标识符绑定——AI 助手正在变成广告测量网(2026-09-21)
事件与背景
9 月 20 日,安全研究者 Jamie Larson(Buchodi’s Threat Intel)发布了一份基于本人真机抓包的拆解:OpenAI 在 .openai.com 域下配置了一枚名为 __obi 的跨站标识符——HttpOnly、Secure、SameSite=None、Max-Age 一年。它由 ChatGPT 客户端在 chatgpt.com 上申请一个 60 秒有效的 RS256 JWT(iss: chatgpt-wadi、aud: bzr.openai.com、purpose: obi_sync、consent_decision: analytics_allowed、subject_type: account_user),再跨站 POST 到 bzr.openai.com/v1/obi/sync 落地成 Cookie。bzr 是 OpenAI 内部对广告平台 bazaar 的命名,wadi 是签发服务。
之后发生的事情是标准的 adtech 闭环:任何在 ChatGPT 上投过广告的商家,只要在自己网站装上 OpenAI 的像素(bzrcdn.openai.com/sdk/oaiq.min.js),浏览器就会把 __obi 带回 OpenAI 的收集端。作者在自己设备上观察到同一个 __obi 值从 12 个商业网站、13 个像素 ID 发出(含 Chewy、Wayfair、ThriftBooks、Eventbrite、HelloFresh、Coursera、SeatGeek),全部返回 202。更棘手的是回传内容:该 SDK 除了接收商家主动传入的字段(in),还会从表单、渲染后的页面文本与标签管理器总线抓取身份(fm/ht/js),观测中抓取量是商家主动提供量的约 2.7 倍(685 : 255);邮箱主要来自 dataLayer 总线,邮箱/电话/姓名经 SHA-256 后回传,国家/省/市/邮编为明文。回传路径保留 path、去掉 query(观测 23,929 条 URL 均无查询串),而作者看到的路径里出现过具体医疗状况、债务重组漏斗与诉讼登记表单。
作者解码的 932 个 sync token 中,736 个标注为 account_user、196 个标注为 anonymous;后者同样是每设备一个、至少在 27 天内保持稳定。也就是说,即使你在 ChatGPT 上退出登录,同一台设备依然会带着一个稳定标识符出现在装了 OpenAI 像素的站点上——而观测到的 936 个广告主像素分布在 1,029 个主机名上。
来源:
- ChatGPT now knows what you do on other websites via ad collector(9/20 拆解,含完整的 JWT 字段、Cookie 属性与观测统计)
- How ChatGPT serves ads — the full attribution loop(同一作者 4/28 前作,509 分/361 评论,记录了会话内广告单元与 OAIQ 归因链)
- HN 讨论(207 分/105 评论)
- Bloomberry:Companies that use ChatGPT Ads(9 月 19 日更新,识别出 12,421 家公司在用 ChatGPT 广告)
为什么现在重要
一、这是标准广告技术第一次跑在 AI 聊天产品上。 作者自己写下了最锋利的一句判断:机制是标准 adtech,没有先例的是把它跑在 AI 聊天产品上——人们会向这些产品说不会发到社交网络的事,而它们正在越来越多地代表用户行动。影响判断:你的用户在 ChatGPT 里说的内容,其商业价值密度远高于社交平台的公开动态,跨站身份解析的杠杆因此被放大。
二、同意分类是错的位。 OpenAI 的 Cookie 政策把 __obi 列在 Analytics 一栏(且是该栏目下唯一的条目),按描述 analytics 用于理解服务表现;但该标识符实际承担身份解析与归因功能。作者解码的 932 个 sync token 全部携带 consent_decision: analytics_allowed,而 OpenAI 把 analytics 与 marketing 拆成两个独立同意项。影响判断:同意标签本身就是一道工程门禁,标错等于把营销追踪伪装成统计。
三、归因闭环已经跑通半年,这次只是补上了最后一环。 4 月的拆解已记录广告单元以 single_advertiser_ad_unit 注入会话 SSE 流、每支广告携带四个 Fernet 加密 token(AES-128-CBC + HMAC-SHA256)、target.open_externally: false 让点击后导航留在应用内 webview 里被观测、OAIQ 用 __oppref 做 30 天前向归因。9/20 的发现把「点击级归因」升级为「账号级身份解析」。影响判断:广告栈的分层是点击归因 → 跨站身份 → 会话内投放,第三层已经上线。
四、规模侧的数字让这件事不再是个案。 Bloomberry 以「检测客户网站上的 JS 片段」为方法统计,9 月 19 日更新时已识别 12,421 家公司在使用 ChatGPT 广告,其中软件开发行业占 19%、11–50 人的公司占 30%。而商家本人看不到全貌:__obi 属于商家脚本读不到的域,__obref 则每个站点各不相同。影响判断:付钱投放的一方,对自己访客被解析到 ChatGPT 身份这件事没有可见性。
五、敏感行业承受的是路径级泄漏。 作者观测到自动匹配在 881 个已知设置的像素中开启了 638 个,含所有信用卡与借贷类广告主;黑名单排除了密码、验证码、卡号、SSN、生日、病史与法院字段。影响判断:收什么、不收什么是被明确配置过的选择——这说明团队有能力做对,只是当前配置偏向收集。
工程师/产品人今天能做什么
- 先排查有没有中招:在你的站点源码与 GTM 容器里搜
bzrcdn.openai.com、bzr.openai.com、oaiq,并把__obi、__oppref、__oaiq_domain_probe三个 Cookie 加入 Cookie 清单与隐私声明。 - 清洗 dataLayer:该 SDK 会替换
window.dataLayer.push、读取adobeDataLayer,还通过 gtm.js 的l=参数寻找被改名的 GTM 容器来取邮箱与电话。不要把邮箱、电话、用户 ID 直接 push 进 dataLayer;必须传就先做哈希与最小化。 - 重做同意映射:如果一个标识符能跨站解析到账号,它就该落在营销/广告同意之下,而不是 analytics。检查你向后端提交的 consent 状态是否把 analytics 与 marketing 正确分开,并确认拒绝 marketing 时相关像素不会加载(注意浏览器侧差异:iOS 上所有浏览器与 Safari ITP 都会阻断这套机制,Chrome for Android 不会)。
- 自建对照实验:在一台 Android Chrome 上登录 ChatGPT,再访问两个装了 OpenAI 像素的站点,抓包看
oaiq.min.js的脚本加载请求上是否带着__obi。作者提醒约五次会话才有一次成功签发 sync token,所以样本要够。 - 做一次「谁在读 dataLayer」的盘点:把这一项并入你的第三方脚本与 AI 插件准入流程,AI 时代的脚本审计对象已经从「分析工具」扩展到「广告投放 + 归因 + 助手插件」三类。如果你自己也在做 AI 助手类产品,把「归因标识符落在哪一层同意之下」写进隐私设计评审的检查表——这套架构的可复制性远高于它的复杂度,一个能绑定账号的跨站 Cookie 加一个从 dataLayer 取邮箱的像素 SDK,两周就能抄完。
待观察
- OpenAI 尚未回答关键问题。 作者 9 月 14 日去信 press@openai.com 与 privacy@openai.com,问为何把
__obi归为 analytics,以及只同意 analytics、拒绝 marketing 的用户是否仍会收到它;OpenAI Support 仅回复称会内部复核,两个问题均未作答。值得关注其是否更新 Cookie 政策。 - 作者主动划出的证据边界。 服务端的身份 join 并未被直接观测到(202 只说明带 Cookie 的事件被接收);桌面 Chrome 未测;约五分之一会话才产出 sync token。要把它当作已确认的行业事实,还需要更多独立复现。
- 同一周的另一条线。 9 月 16 日 OpenAI 把广告产品扩展到 Sponsored Agents(HN 157 分/180 评论;官方页在本环境被 Cloudflare 拦截,未能读取原文,故此处只作线索)。如果广告单元开始代替用户行动,那么在测量层之外还要多一层「权限与花钱授权」的审计面。