會跨越網站的 Cookie:解剖 OpenAI 的 __obi 廣告像素,以及它對你的了解
一份逆向工程調查揭露,OpenAI 位於 bzr.openai.com 的廣告衡量像素會鑄造一個與 JWT 綁定的 __obi Cookie,默默將你在廣告主網站上的瀏覽行為連結到 ChatGPT 帳號——過程中還搜集雜湊化的 Email、電話與位置資料。
當 OpenAI 今年稍早在 ChatGPT 內部推出廣告業務時,對行銷人員的說法很直白:這是一種全新的版位,使用者正在思考、比較、做決定。對使用者的說法同樣簡單——廣告會尊重你的隱私,OpenAI 的開發者文件至今仍將其「衡量像素」(Measurement Pixel)描述為採用「隱私保護識別碼」。本週,一份獨立的逆向工程調查把這個說法逐條拆解,浮出水面的,是今年最重要的隱私新聞之一:一套會默默把你在一般網站上的行為,連結到你 ChatGPT 帳號的追蹤機制。
研究者發現了什麼
9 月 20 日,以 Buchodi 名義發表的獨立威脅情報研究者,發布了一份關於 OpenAI 廣告基礎設施的詳細技術分析。主角是一個名為 bzr.openai.com 的端點——「bzr」代表「bazaar」(市集),是 OpenAI 內部對廣告平台的稱呼——以及它所鑄造的 Cookie:__obi。
整個機制分三步,每一步單獨看都很平凡,加起來卻威力驚人。
第一步:ChatGPT 產生識別碼並簽名。 你登入 chatgpt.com 時,用戶端會產生 16 個隨機位元組,並呼叫一個後端端點(/backend-api/bazaar/obi/sync-token)。伺服器回傳一個以 RS256 簽署的 JWT,其酬載將你的帳號主體(一段 64 位元的十六進位識別碼)、一個 22 字元的 obi 識別碼,以及同意決策綁在一起。權杖在 60 秒後失效。
第二步:識別碼變成跨網站 Cookie。 用戶端將該 JWT POST 到 bzr.openai.com/v1/obi/sync,回應會設定:
Set-Cookie: __obi=…; Domain=.openai.com; HttpOnly;
Max-Age=31536000; Path=/; SameSite=none; Secure
SameSite=None 是關鍵細節。這是唯一能讓 Cookie 附著在跨網站請求上的設定。研究中觀察到的其他所有 OpenAI Cookie,都會被瀏覽器擋在廣告主頁面之外——oai-did 與 oaicom-stable-id 是 SameSite=Lax,工作階段 Cookie 則受限於網域。__obi 是唯一被設定為可跨越網站的 OpenAI 識別碼,而 Max-Age=31536000 意味著它會存活整整一年。
第三步:廣告主網站把它送回去。 任何在 ChatGPT 上投放廣告的公司,都可以安裝 OpenAI 的衡量像素——一段從 bzrcdn.openai.com/sdk/oaiq.min.js 載入的小型 JavaScript 標籤,就像零售商過去十年安裝 Meta 與 Google 標籤那樣。在研究者自己的手機上,同一個 __obi 值從 12 個商業網站、13 個不同的像素 ID 傳送給 OpenAI,包括 Chewy、Wayfair、ThriftBooks、Eventbrite、HelloFresh、Coursera 與 SeatGeek。每個請求都以 202 狀態被接受。
與 Cookie 同行的是什麼
這個像素不只是轉發識別碼。SDK 還會從廣告主的頁面上搜集身分資料,並依來源分成四個頻道——OpenAI 自家的酬載標籤寫得明白:in 是廣告主刻意傳入的值,fm、ht、js 則是從表單欄位、頁面渲染文字與標籤管理器匯流排上抓取的值。
數字相當刺眼。在觀察到的流量中,抓取來的身分資料以 685 比 255 的懸殊比例,超過廣告主主動提供的身分資料。標籤管理器匯流排是最大的 Email 來源:SDK 會用自己的函式取代 window.dataLayer.push,讀取 adobeDataLayer,並透過解析 gtm.js 標籤上的 l= 參數,找到被改名的 Google Tag Manager 層。
Email、電話與姓名在傳輸前會經過 SHA-256 雜湊——算是對隱私的致意,但對握有 Email 字典的人而言,雜湊識別碼幾乎可以反向還原。國家、地區、城市與郵遞區號則是以明文傳送。郵遞區號是被搜集最多的表單欄位:28 個網站上的 100 次事件。
有一個細節值得強調:光是載入 SDK 這個動作,就會揭露識別碼。像素的程式碼裡有一條省略憑證的路徑,但沒有用——瀏覽器會在 OpenAI 的任何程式碼執行之前,就把 Cookie 附著在載入 SDK 的 <script src> 請求上。網站只要嵌入這個標籤,就已經揭露了訪客的身分。
研究者資料集的規模也為結論增添了分量:數個月的流量觀察,涵蓋 1,029 個主機名稱上的 936 個不同廣告像素,解碼了 932 個同步權杖。其中 736 個攜帶 account_user 主體,196 個攜帶 anonymous 主體——而匿名識別碼同樣持久:每台裝置一個,即使登出也能存活至少 27 天。
同意欄位的缺口
故事從工程轉向政策的部分在這裡。OpenAI 的 Cookie 政策將 __obi 歸類在分析 Cookie 之下,效期一年——是該區塊唯一的條目。OpenAI 將分析與行銷拆成兩個獨立的同意選項(oai_consent_analytics 與 oai_consent_marketing),而研究者解碼的每一個同步權杖,都攜帶 consent_decision: analytics_allowed。
換句話說:一個授予分析同意、但明確拒絕行銷同意的使用者,仍然會收到一個跟著自己穿越網路、且能回連到 ChatGPT 帳號的廣告識別碼。研究者在 9 月 14 日向 OpenAI 的媒體與隱私信箱提出兩個問題——為什麼 __obi 被歸類為分析 Cookie,以及僅授予分析同意的使用者是否仍會收到它。OpenAI 客服承認收到詢問、表示會轉交內部審查,但沒有回答任何一個問題。
存活下來的路徑資料也不總是無害。URL 在傳送前會被化約為來源加路徑,但送達搜集器的路徑中,包括一項醫療狀況、一個債務解決方案的轉換漏斗,以及一份訴訟接案表單。在 881 個已知設定的像素中,有 638 個啟用了自動比對——包括觀察到的每一家信貸與放貸廣告主。一份黑名單確實排除了密碼、一次性驗證碼、卡號、身分證字號、出生日期、病史、診斷與法院欄位,這顯示 OpenAI 預見了敏感性——然後照樣上線。
標準廣告技術,前所未有的產品
研究者對證據的邊界很謹慎:帳號層級的連結依設計是在伺服器端完成,但並未直接觀察到。文章也誠實地寫出反方觀點:Meta 多年前就建好了結構上等價的機制——登入帳號、像素觸發時的第三方 Cookie、離站轉換回連到個人檔案。這套機制是教科書級的廣告技術。
前所未有的,是把它跑在一個 AI 聊天產品上。人們對這類產品傾訴不會在社群網路上說出口的事——健康症狀、法律糾紛、職涯徬徨、感情困境——而這些產品越來越常代替使用者行動:瀏覽、預訂、購買。把一個為期一年的跨網站識別碼接進這個情境,等於把「匿名網路瀏覽」與「對話紀錄」之間的牆整個推倒,這是任何社群平台都做不到的。
技術上的限制確實存在。這套機制是在 Android 版 Chrome 上觀察到的;Safari 的智慧追蹤防護(ITP)會封鎖所有第三方 Cookie,而所有 iOS 瀏覽器都跑在 WebKit 上,因此這套機制在 iOS 上完全無法運作。大約每五次 ChatGPT 工作階段只有一次會產生同步權杖,行動網頁版投放廣告時甚至不會同步。至於 Chrome 自身拖延多時的第三方 Cookie 退場計畫——一再延後、如今據報已改為讓使用者自行選擇——正是這整類追蹤機制至今仍能大規模運作的原因。
為什麼重要
連廣告主自己都被蒙在鼓裡。__obi 屬於一個他們的腳本無法讀取的網域;一個只是裝了轉換追蹤像素的商家,無從得知自己的訪客正在被連結到 ChatGPT 身分。廣告主自己的 Cookie __obref 則是分別設定在各廣告主自己的網域上——觀察到的 2,860 個值中,有 2,828 個只出現在一個廣告主之下,意味著網站之間無法透過它互相觀察。
這份揭露在張貼三小時內就衝上 Hacker News 150 多分,並已在隱私圈發酵。對 OpenAI 而言,時機格外敏感:公司正一邊擴張廣告業務以支撐據報超越 1,000 億美元的營收野心,一邊又要求全世界信任其能代替使用者自主行動的代理型產品。一個悄悄跟著 ChatGPT 使用者穿越網路、被歸類為「分析」、由細項同意預設值開啟、被直接詢問時不予回應的 Cookie,正是代理型產品最承受不起的那種信任裂縫。
對使用者來說,實際的因應手段有限但確實存在:iOS 瀏覽器不受影響;Safari 與 Firefox 會封鎖這套機制;在 Chrome 上,清除 .openai.com 的 Cookie,或在 ChatGPT 的資料控制中拒絕分析同意,就能移除這個識別碼。至於其他人,那些安靜的 202 回應仍會繼續,一次一個瀏覽工作階段。