在网页端窃取已登录的 ChatGPT 账号,不需要骗取密码。不需要诱导安装恶意插件,也不需要受害者在聊天框里粘贴代码。点开一条看似平常的官方分享链接,是整个过程中唯一必需的操作。4.5 秒之后,账号里从未公开过的私密对话,就会静默送进攻击者的后台。
这是安全公司 Parameter 在 2026 年 10 月公开复盘的一起高危漏洞。OpenAI 随后将该漏洞定级为最高严重程度的 P1 级别,并在 10 月 26 日完成修复。令人深思的是,整条攻击链路没有依赖任何未公开的浏览器零日漏洞。全部链路都由十多年前的老式 Web 技术拼接而成。
许多人习惯把安全寄托在坚固的防线上。比如与世隔绝的沙箱,或者严格的域名名单。但这起事故给出了相反的答案。现代系统的溃败很少发生在模块核心,往往发生在拼接处的裂缝里。组件被拼进同一个页面时,接缝成了没人看管的突破口。
受限沙箱防得住偷窥,却留了个投信口
为了让用户安全运行代码,ChatGPT 提供了 HTML 预览功能。预览页面运行在独立的沙箱域名下。沙箱被锁在隔离的 iframe 框架内,物理隔绝了对主页面 DOM 树和登录凭证的访问。这项设计本身没有缺陷,沙箱里的脚本确实逃不出来。
攻击者避开了坚固的正门,转而寻找主页面对外通信的信箱。现代网页通过 postMessage 机制传递跨域消息。它相当于留在墙上的一个投信口。只要主页面注册了监听器,任何框架都能往里投递文本。如果接收端不查寄信人,投进来的内容就会直接变成执行指令。
破绽藏在对话框里另一个不起眼的功能:交互式数学图表。为了排版复杂的数学公式,页面后台加载了开源库 MathLive。MathLive 在初始化时,顺手在主页面注册了一个全局 postMessage 监听器,用于支持虚拟键盘输入。一个普通的输入辅助功能,悄然在 ChatGPT 的防线上凿开了一个通信孔洞。
数学键盘把恶意标签直接写进主页面
在这个接缝处,两道防线同时失守。MathLive 对收到的跨域消息采取了默认开放策略,既不核对来源网址,也不核验发送窗口。它甚至允许键盘布局中包含原始 HTML 代码。隔离沙箱里的预览程序虽然摸不到主页面,却能往投信口里塞入消息,要求主站加载一套伪造的键盘界面。
ChatGPT 主页面并非毫无防备,它设有一个名为 createHTML 的过滤函数。开发者原本希望用它清理危险输入,但它实际上只是一个 Trusted Types 包装器。它在未做实质清洗的情况下,把外部传入的字符串直接打上「可信」标签。这段恶意 HTML,随即被写入真实 ChatGPT 页面的 innerHTML 属性中。
直接向 innerHTML 插入 <script> 标签并不会运行,攻击者借此展现了老练的手段。他们构造了一个带有 srcdoc 属性的新 iframe,将恶意载荷写进文档属性中。这个新框架由 ChatGPT 主页面动态创建,且未被赋予 sandbox 隔离标记,因而直接继承了 chatgpt.com 的完整域名权限。此前构筑的沙箱防线,至此被轻松跨过。
图:攻击代码在 chatgpt.com 真实身份下运行,页面弹出受控警报。来源:Parameter 复盘文章
借道十几年前的老接口拆掉最后一道防线
此时挡在攻击者面前的只剩下内容安全策略(CSP)。ChatGPT 配置了严格的策略,禁止页面执行内联 JavaScript 脚本。即便成功写入脚本标签,浏览器也会当场拦截。但庞大的现代前端为了业务集成,往往要在安全名单里放行一些可信域名。
YouTube 恰好就在这份被允许加载脚本的白名单之中。攻击者盯上了 YouTube 十多年前上线的 oEmbed 接口。这是一个典型的 JSONP 接口,允许前端通过 callback 参数接收数据。该接口有一个古老的特性:当参数校验失败时,它会先把回调函数名写进响应体,再附加上错误信息。
攻击者抓住这个反射特性,把长达 5533 字符的代码塞进了回调参数。为了防止末尾追加的错误对象导致语法报错,攻击者在代码后追加了 ;void 语句,吞掉后面的字符。请求 URL 最终膨胀到 7309 字符,浏览器将其视为一段合法的 YouTube 脚本。安全拦截层瞬间失效,恶意代码在真实会话里跑了起来。
五千美元赏金填不上一条拼接裂缝
脚本在 chatgpt.com 域下跑通后,攻击者便拿到了该账号的操作权。代码静默调用内部接口 GET /backend-api/conversations,拉取用户的会话列表。随后精准读取一段从未公开的私密对话,通过普通图片请求发往站外。测试过程中,研究团队主动清除了凭证引用,完成了安全受控的实证。
图:测试账号内未公开的私密对话内容被传至外部服务器。来源:Parameter 复盘文章
受害者甚至不需要多余的交互。在团队最初的验证中,受害者点开链接后还需点击一次预览按钮。经过进一步改进,团队实现了打开分享链接即自动触发预览。在另一个独立测试账号上,页面加载后约 4.5 秒便稳定弹出漏洞结果。整个过程无需下载附件,无需授权应用,在受害者屏幕上几乎不露痕迹。
Parameter 团队于 10 月 18 日向官方提交报告,OpenAI 迅速复现并定级为最高严重的 P1 漏洞。官方团队在数日内紧急修改了前端逻辑,封堵了通信漏洞,并向研究员发放了 5000 美元赏金。但在技术社区的讨论中,5000 美元的数额被普遍认为偏低:对一个能接管账号、读走私密对话的漏洞来说,这个价格与其影响明显不匹配。
安全防线必须退守到通信接缝上
复盘整条链路,每个模块单独看都合格。预览有独立沙箱,数学库能正常排版,安全策略也拦住了内联脚本。但拼成大型应用后,防线在交界处脱节。漏洞寄生在模块之间的无主盲区里。
这起事件给现代 Web 架构留下了清晰的工程启示。任何跨窗口的消息传递,接收端都必须严格校验来源域名与具体窗口对象。接收外部配置的组件绝不能信任传入的原始 HTML 结构。更基础的原则在于,内容安全策略只能作为后备防御手段,它无法替代业务前端对不可信输入的严格隔离。
大模型正在让软件的交互形态变得更加动态和开放。代码生成越快,功能集成越多,系统接缝处的裂痕就越容易被掩盖。筑起单点高墙并不能保证系统安全。只有把组件之间的每条连接缝隙都视为潜在通道,现代软件的防线才算真正成立。
参考链接:
- Parameter Labs 复盘分析
- Hacker News 讨论