ESC
AI 1 分钟阅读

ChatGPT 现在能通过广告采集器知晓你在其他网站上的行为

文章披露 OpenAI 正构建广告追踪体系:其 pixel SDK 通过 JWT 同步机制在 .openai.com 域名下设置 __obi cookie(SameSite=none,有效期一年),实现跨站追踪,并从广告主页面抓取邮箱、电话等信息。观测显示同一标识符出现在 Chewy、HelloFresh 等 12 个网站,用户即使拒绝营销、仅允许分析,仍会被追踪。

来源:Hacker News

{
 "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 是签发令牌的服务。

第二步:该标识符成为 OpenAI 域名下的 cookie。

客户端通过跨站 POST 将 {"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 为一年。JWT 中的 obi 值与 cookie 中的值完全相同。

从广告主页面发往 OpenAI 服务器的请求有三类。在 __obi 已进入 cookie 容器的手机上,这三类请求全部携带了它:

第一行尤其值得注意。该 pixel SDK 有一条省略凭据的代码路径,但这并无帮助:在任何 OpenAI 代码运行之前,浏览器就已经把 cookie 附加到加载 SDK 的 <script src> 请求上。仅仅加载该标签,标识符就被披露了。

同一个 SDK 还会从广告主页面收集身份信息。其载荷区分四种来源,由 OpenAI 自己标注:in 为广告主主动传入的值,fm、ht、js 为 SDK 从表单字段、渲染后的页面文本以及标签管理器总线(tag-manager bus)中抓取的值。在观测到的流量中,抓取得到的身份数据以 685 比 255 远超广告主主动提供的身份数据。

标签管理器总线是电子邮件的最大来源。该 SDK 用自己的函数替换了 window.dataLayer.push,同时读取 adobeDataLayer,并通过解析 gtm.js 脚本标签上的 l= 参数来定位被重命名的 GTM 数据层。当前版本会从中提取电子邮件和电话号码。0.1.31 版本还曾提取姓名和地理信息,直到 8 月 27 日才收窄了采集范围。

电子邮件、电话、名字和姓氏在传输前会经过 SHA-256 哈希处理。国家、地区、城市和邮政编码则以明文发送。邮政编码是被采集最多的表单字段,在 28 个站点上共有 100 次事件。

URL 在发送前会被简化为源(origin)加路径(path);观测到的 23,929 个 URL 中没有一个携带查询字符串。但路径得以保留,到达采集器的路径中包括某种医疗病症、一个债务解决方案流程以及一份诉讼受理表单。

在设置已知的 881 个 pixel 中,有 638 个启用了自动匹配,其中包括观测到的所有信贷和借贷类广告主。该功能通过 OpenAI 的 Ads Manager 控制。一份排除名单禁止采集密码、一次性验证码、卡号、SSN、出生日期、病史、诊断和法庭相关字段。

在同样的广告主页面请求中,其他所有 OpenAI cookie 都被浏览器拦截了:

__obi 是唯一配置为 SameSite=None 的 OpenAI 标识符。

在我的设备上,同一个 __obi 值从 12 个商业网站、以 13 个不同的 pixel ID 被发送到 OpenAI,其中包括 Chewy、Wayfair、ThriftBooks、Eventbrite、HelloFresh、Coursera 和 SeatGeek。每个请求都收到了 202 接受响应。

在更大范围的流量中,30 个不同的 __obi 值里有 12 个出现在不止一个广告主名下,其中一个出现在十个广告主名下。

在 932 个已解码的同步令牌中,736 个携带 subject_type: account_user,196 个携带 anonymous。匿名主体与账户主体一样稳定:每台设备一个,至少持续存在 27 天。

OpenAI 的 cookie 政策 将 __obi 列在分析类(Analytics)cookie 之下,有效期一年,适用于 chatgpt.com 和 openai.com。它是该分类下唯一的条目。该政策将分析类 cookie 描述为帮助 OpenAI 了解其服务的性能与使用情况。

OpenAI 将分析和营销设为两个独立的同意选项 oai_consent_analytics 和 oai_consent_marketing,而我解码的每一个同步令牌都携带 consent_decision: analytics_allowed。允许分析、拒绝营销的用户,得到的就是这种结果。