ChatGPT 通过广告采集器掌握了你在其他网站上的行为

OpenAI 的广告收集器bzr.openai.com设置一个名为__obi,范围为.openai.com.价值在于你在ChatGPT上并且绑定了你的ChatGPT账号。__obi然后,这些数据会从你访问的普通网站发送到OpenAI。

任何在ChatGPT上购买广告的公司都会安装一小段 OpenAI 代码在自己的网站上,就像零售商已经安装Meta和Google的追踪码一样。加载那个代码,发送__obi对OpenAI以及你正在浏览页面的数据。

这包括你正在搜索的产品、正在阅读的文章以及购买行为。

关键是,OpenAI可以将你在这些网站上的操作与你的ChatGPT账户连接起来。

我在自己的手机上重现了完整的机制,使用了两种独立的捕获方法验证,并与数月来覆盖1029个主机名、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是标识符。令牌绑定它们,作用域为收集器,并在60秒内失效。bzr代表bazaar,OpenAI对广告平台的内部称呼;wadi是发行服务。

步骤2。该标识符会成为OpenAI域名上的cookie。

客户端POSTs(发布){"token": "«JWT»"}跨站点到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是一年。该obiJWT 中的值与 cookie 中的值是相同的。

第三步。广告主网站会把它退回去。

三个请求类从广告主页面发送到OpenAI的主机。在手机上__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 头 控制

第一行尤其有趣。Pixel SDK 的代码路径省略了凭证,这无济于事:浏览器会在 OpenAI 代码运行前,将 cookie 附加到加载 SDK 的请求上。

通过加载标签,标识符被披露。

随之而来的旅行

同一SDK还会从广告主页面收集身份信息。该有效载荷将四个来源分开,由OpenAI本身标记:in对于 ,广告主故意传递,fm,ht,js对于数值,SDK从表单字段、渲染的页面文本和标签管理器总线中抓取。

在观察到的流量中,抓取的身份数量超过广告主提供的身份事件685,超过255次。

标签管理器总线是最大的邮件来源。SDK 取代了window.dataLayer.push具有自身功能,也读为adobeDataLayer并通过解析l=参数gtm.js脚本标签。

当前版本从中获取电子邮件和电话功能。0.1.31版本在8月27日范围缩小前也曾采用姓名和地理位置。

电子邮件、电话、名字和姓氏在传输前经过SHA-256哈希处理。国家、地区、城市和邮政编码均以明文形式发送。邮政编码是收集最多的表单字段,涵盖28个站点的100个事件。

URL在发送前被缩减为来源加路径;观察到的23,929条URL中没有一个携带查询字符串。路径得以保留,且到达催收方的路径包括医疗状况、债务解决方案漏斗和诉讼受理表。

在已知设置下,881个像素中的638个已启用自动匹配,包括所有信用和贷款广告主观察到的。该匹配由OpenAI的广告管理器控制。拒销名单排除密码、一次性代码、卡号、社会安全号码、出生日期、病史、诊断和法院字段。

Cookie 设计用于跨站点

在同一广告主页面请求中,浏览器屏蔽了所有其他OpenAI cookie:

饼干 结果
oai-did,oaicom-stable-id 被封锁,SameSite=Lax
oai-client-auth-info,会话Cookie 被封锁,域名不匹配
__obi 已发送

__obi是唯一配置为SameSite=None.

观察到的覆盖范围

在我的设备上,只有一个__obi价值来自12个商业网站,使用13个不同像素ID,包括Chewy、Wayfair、ThriftBooks、Eventbrite、HelloFresh、Coursera和SeatGeek。

所有请求均被接受202.

在更广泛的交通中,30辆中有12辆是独立的__obi价值出现在多个广告主下,一个低于十个广告商。

当你登出时它能正常工作

在932个解码同步令牌中,有736个携带subject_type: account_user196辆anonymous.匿名对象和账户对象一样稳定:每设备一个,至少持续27天。

OpenAI 的 cookie 政策说明

OpenAI 的Cookie 政策列表__obi在分析 cookies 下,一年后chatgpt.com以及openai.com.这是该部分中唯一的条目。该政策描述分析Cookie有助于OpenAI理解其服务的表现和使用情况。

OpenAI将分析和营销视为两个独立的同意选项,oai_consent_analytics以及oai_consent_marketing,我解码的每个同步令牌都携带consent_decision: analytics_allowed.允许分析却拒绝营销的人懂这一点。

OpenAI的回应

我于9月14日将机制和两个问题发给 press@openai.com 和 privacy@openai.com:为什么__obi被归类为分析Cookie,而授予分析同意但拒绝营销同意的用户是否仍会收到该Cookie。

回复来自OpenAI支持。他们承认了询问,表示观察将内部共享以供审核,但未回答任何问题。上述脚本加载观察是在询问发送后做出的。

如果OpenAI回复,我会更新这篇帖子。

界限

浏览器。在Android版Chrome上观察到。Safari 的智能追踪预防它会阻断所有第三方 Cookie,iOS 版 Chrome 运行在 WebKit 上,因此该机制在任何 iOS 浏览器上都无法运行。

桌面版 Chrome 尚未测试。

在门槛上。大约每五次ChatGPT会话中就有一次产生了同步令牌。ChatGPT的移动网页客户端投放广告时完全没有同步。按照以下步骤操作的人可能会看到像素发射,但没有附加Cookie。

连接不会被观察到。 202意味着收集者接受了带有Cookie的事件。OpenAI将其解析到账户服务器端,这从设计上可见一斑;我没有亲眼看到。

Meta多年前就建了结构上的对应物。登录账户、第三方 Cookie 在 Pixel Fire 上、将异地转化为个人资料。这种机制是标准的广告技术。

在 AI 聊天产品上运行它从未有先例。人们告诉这些产品他们不会在社交网络上发布的内容,而这些产品也越来越多地代表他们行动。

Pixel 的另一个 cookie 不会这样。 __obref设置在广告主自己的域名上。每个网站获得不同的值,且没有网站能看到其他网站的。在观察到的2860个值中,有2828个出现在恰好一个广告主的名下。

广告商看不到这一点。 __obi属于他们的脚本无法读取的域名。他们安装了一个转换像素,无法确定访客是否被解析为ChatGPT身份。

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论