ChatGPT 通过广告收集器知道你访问了哪些网站:链路与边界

先说结论

  • 这不是“ChatGPT 在偷看你的屏幕”,而是一条可复现的跨站数据链路:ChatGPT 生成 __obi 标识,广告主页面加载 OpenAI 的广告测量 SDK 时,浏览器会把这个标识回传给 OpenAI。
  • __obi 是 OpenAI 域下唯一配置为 SameSite=None; Secure 的 cookie,因此能在第三方网站请求中被发送;其他常见 OpenAI cookie 均因 SameSite=Lax 或域名不匹配被浏览器拦截。
  • 独立研究者的抓包数据显示,SDK 不仅接收广告主主动传入的身份,还会从页面表单、渲染文本和标签管理器总线抓取字段;其中抓取到的事件数量高于广告主主动传入事件。
  • 官方 cookie 政策把 __obi 归入 Analytics cookies;但能否仅靠拒绝 analytics 选项彻底关闭 __obi,目前未能核实。
  • 终端用户可以做几件事:检查 ChatGPT 的同意选项、在浏览器中观察 bzr.openai.com / bzrcdn.openai.com 请求、用第三方 cookie 策略限制跨站发送。

证据与过程

链路:从 ChatGPT 登录态到广告商网页

2026-09-20,独立研究者 buchodi 发布了复现报告 《ChatGPT now knows what you do on other websites via ad collector》。该报告不是新闻稿,而是作者在自己的手机上用两种独立抓包方式交叉验证,并观察了数月流量。以下数字如无特别说明,均为社区二手数据(独立研究者一手复现,非 OpenAI 官方数据)。

流程分三步:

  1. ChatGPT 客户端生成 16 个随机字节,请求 POST /backend-api/bazaar/obi/sync-token,后端返回一个 RS256 JWT。JWT 中 sub 字段是 ChatGPT 账户主体,obi 字段是 22 字符标识,aud 指向 bzr.openai.comexp 约为签发后 60 秒。
  2. 客户端把这个 JWT 以 {"token": "<JWT>"} 形式 POST 到 bzr.openai.com/v1/obi/sync,响应设置 __obi cookie。响应属性如下:
Set-Cookie: __obi=<redacted>; Domain=.openai.com; HttpOnly;
Max-Age=31536000; Path=/; SameSite=None; Secure

这个 SameSite=None; Secure 组合是浏览器允许跨站请求携带 cookie 的关键配置。Max-Age=31536000 约等于一年。

  1. 广告商页面加载 OpenAI 的广告测量 SDK。该 SDK 的脚本请求本身就会携带 __obi。报告中三类请求都会携带 __obi:脚本加载 GET bzrcdn.openai.com/sdk/oaiq.min.js、带 obref 的转化事件、以及 SDK 的“无凭证”路径;而一个 GET bzrcdn.openai.com/pixel-config/... 的控制请求则不携带 cookie。

这里有一个重要发现:即使 SDK 有“无凭证”代码路径,浏览器在加载 <script src> 请求时就会自动附加 __obi,所以只要广告主页面装上 OpenAI 代码,标识披露就可能发生。

采集什么、不采集什么

报告把 SDK 采集来源分为四类:广告主主动传入的 in、从表单字段抓取的 fm、从页面渲染文本抓取的 ht、以及标签管理器总线的 js。在观察到的流量里,抓取到的身份事件 685 次,高于广告主主动传入的 255 次。

具体字段上,邮箱、电话、姓名会做 SHA-256 哈希后传输;国家、地区、城市、邮政编码则明文传输。邮政编码是抓取最多的表单字段,报告称 28 个网站共 100 次。URL 在发送前被精简为“origin + path”,原文观察到的 23,929 条 URL 都没有携带查询字符串;但路径本身仍可能包含敏感上下文,例如医疗状况、债务解决方案、诉讼咨询等敏感业务入口。

自动匹配在已知设置的 881 个像素里启用了 638 个,包括全部被观测到的信贷和贷款类广告商。OpenAI 侧还维护了一个拒绝名单,排除密码、一次性验证码、卡号、SSN、出生日期、医疗历史、诊断和法院字段。

这些信息至少说明:该链路的目标之一是广告转化测量和身份匹配,而不是无差别收集密码或卡号。但它仍然会把散落在不同网站上的行为片段,用同一个 __obi 标识串起来。

登录与匿名状态都受影响

原文解码了 932 个同步 token,其中 736 个携带 subject_type: account_user,196 个携带 anonymous。也就是登录账户主体占多数,但匿名设备也会生成稳定标识。下面是用这两组数字做的一个可复算比例:

total = 736 + 196
account_ratio = 736 / total
anonymous_ratio = 196 / total
print(f"total={total}, account={account_ratio:.1%}, anonymous={anonymous_ratio:.1%}")

自己推算结果是:登录账户主体约 79.0%,匿名约 21.0%。原文还提到匿名标识每台设备一个,至少持续 27 天。

账号和匿名两种状态并存,意味着“退出登录就一定不关联”的说法并不严谨。退出登录可能只是切换成匿名标识,却仍然可能被用于跨站测量。

官方文档与 cookie 政策

OpenAI 的 cookie 政策__obi 列为 Analytics cookies,有效期一年,使用域包括 chatgpt.comopenai.com。政策对该类 cookie 的描述是帮助 OpenAI 了解服务表现和使用情况。这是官方数据。

OpenAI 的 广告测量像素开发者页面 也被原文作为接入代码的官方参考链接。我在这里不展开原文没有逐条验证的接入参数,只把它列为当事方官方来源之一。

原文还提到,OpenAI 实际运行了 oai_consent_analyticsoai_consent_marketing 两个同意选项;所有被研究者解码的 sync token 都带有 consent_decision: analytics_allowed。这不能证明拒绝 analytics 后不会生成 __obi,但至少说明在研究者观测到的样本里,__obi 与 analytics 同意绑定。

自己判断与检查清单

我的判断是:这更像一次“广告技术栈向生成式 AI 产品迁移”的典型案例,而不是一个突发的 0-day 漏洞。__obi 的机制与 Meta Pixel、Google Tag Manager 的跨站 cookie 设计思路相似,但它把 ChatGPT 账户或匿名设备同外部网页行为联系起来,隐私敏感度更高。

对普通用户,可以按以下清单自查:

  • 打开 OpenAI 的 cookie 政策页面,确认 __obi 的官方分类和有效期。
  • 在浏览器开发者工具的 Network 面板里过滤 bzr.openai.combzrcdn.openai.com,看自己访问广告主页面时是否出现这些请求。
  • 检查浏览器第三方 cookie 设置。如果浏览器阻止第三方 cookie 或启用更严格的跟踪预防,__obi 这类跨站 cookie 可能被限制,但这也会影响正常跨站功能。
  • 如果 ChatGPT 账号设置中存在 analytics 或 marketing 同意选项,优先复核 analytics 选项;但不要假设关闭后 __obi 一定失效,等待 OpenAI 官方明确说明。
  • 对安全团队或隐私团队来说,应当把 bzr.openai.combzrcdn.openai.com 纳入第三方脚本和 cookie 审计范围,并重新评估使用生成式 AI 工具时的跨站可观测性。

这次没核实的

  • OpenAI 官方是否会在用户拒绝 analytics 同意后停止 __obi 同步,未能核实。
  • 该机制是否已在所有地区、所有 ChatGPT 用户或所有广告主中全面上线,未能核实;原文只代表一名研究者的设备与观测样本。
  • __obi 关联后的数据是否被 OpenAI 用于广告定向、建模或对外出售,未能核实。原文只证明从广告商网页回传到了 OpenAI 的域名。
  • OpenAI 广告测量像素的完整接入规则、允许传入字段和官方隐私承诺,未能逐条核实;相关页面仅作为官方链接列入参考。
  • 原文提到的版本 0.1.31 在 8 月 27 日收窄字段范围前后的官方变更和影响范围,未能核实。

参考来源

评论区

0 条评论

登录后可评论。

白日梦想家 104 阅读