一条分享链接劫持 ChatGPT 账号

Parameter Labs 原文研究截图(来源)
一条链接的完整链条
据 Parameter Labs 10 月 28 日在官网发布的复盘,2026 年 10 月,他们把一条普通的 ChatGPT 公开分享链接,变成了运行在受害者登录会话里的代码:点开链接,页面即以 chatgpt.com 的身份调用认证接口,枚举对话列表,读取从未分享过的私聊,再把数据送出站外。OpenAI 于 10 月 26 日完成修复,定级 P1,支付赏金 5000 美元。博主 Simon Willison 在 10 月 31 日的博客里转述了整个事件。
四步走完的攻击链
起点是两个各自无害的功能。ChatGPT 的 HTML Preview(旧称 Canvas)把任意网页代码装进隔离的 iframe,地址与主站不同,读不到主页面;同一段对话里的交互图表则加载了开源数学库 MathLive,并在主页面装上一个监听器,等候虚拟键盘的消息。
监听器不问来信者是谁:来源策略是“none”,任何帧的消息照单全收,而键盘布局恰好允许携带 HTML,经 innerHTML 写进真实页面。innerHTML 不执行 script 标签,却足以插入一个不带 sandbox 属性的 srcdoc iframe,新文档随即继承 chatgpt.com 的身份。最后一道门是 CSP:内联脚本被挡住,白名单里却有 YouTube,其 oEmbed 端点会以 JSONP 回调的形式把代码原样反射回来。最终回调长 5533 字符,最外层 iframe 标记 7390 字符。
受害者只需点开链接
早期版本要求受害者先连接一个研究者控制的 App。研究团队随后把真正的图表与恶意 Preview 放进同一段普通对话,导出为公开的 /share/ 链接,完整链条随链接同行。最稳定的复现需要点一次 Preview 按钮;把 HTML 块标记为可自动预览之后,打开链接就是受害者的唯一动作。研究团队在另一个账户复现了 3 次,硬刷新后依然有效,弹窗约在 4.5 秒后出现——全程不需要装 App、加入 Project,也不必打开开发者工具。
拿到的是登录态本身:代码从页面解析出会话令牌与账户 ID,以受害者身份请求 /backend-api/conversations 接口,外传只动用了一次普通的图片请求。受害者没有做错任何事。Parameter Labs 的结论是,这实质上等于接管对方的 ChatGPT 账号。

Parameter Labs 在受控测试中验证私聊数据访问的原始截图(来源)
5000 美元的价签
时间线显示:10 月 13 日确认 MathLive 通路,14 日升级为任意代码执行,18 日提交报告;OpenAI 于 21 日复现,定级从 P2 升至 P1;26 日确认两个前端版本都拒绝跨帧消息,总计支付 5000 美元。对这笔赏金,Willison 的评价只有一句:以漏洞的严重程度计,偏低。
留给同行的教训有四条:postMessage 接收方必须同时校验来源地址与来源窗口;跨窗口的设置不应携带原始 HTML;动态创建的文档应全程保持 sandbox;CSP 只是纵深防御的一层,救不回已经失守的渲染路径。

AI 生成的披露时间轴,依据 Parameter Labs 原始复盘整理(来源)
缝隙里的漏洞
链条上每个零件都通过了单独的审查:预览被隔离,图表可以挂数学键盘,CSP 放行最大的视频站点,对话本来就可以分享。漏洞藏在它们相遇的缝隙里,每一环单独看都合理,合在一起却打开了一扇门。功能不断生长,桥就越修越多;沙箱画得再小,也小不过它自己同意接听的那扇门。
沙箱的强度,等于所有桥中最弱的那一座。