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身份。