我们的 AI 引擎 Neutron 在加州大学伯克利分校的 CyberGym 基准测试中取得了 97.1% 的成绩。 了解更多

深度解析

深度解析

ChatGPT:通过共享链接与 MathLive 沙箱逃逸接管账户

恶意的 ChatGPT 共享链接可借助 MathLive 的未校验消息在受害者会话中执行攻击者 JavaScript;OpenAI 已于 10 月 26 日修复。

摘要

  • 恶意的公开 ChatGPT 共享链接可在打开者的登录会话中执行攻击者的 JavaScript,从而以该 ChatGPT 账户行事。Parameter Security 于 2026 年 10 月 18 日向 OpenAI 报告了这条链。
  • 2026 年 10 月 26 日之前打开过攻击者共享会话的人都可能是受害者:既不需要安装应用,也不需要加入工作区,更不需要通过攻击者登录,只需打开链接。
  • OpenAI 将报告定为 P1,并于 2026 年 10 月 26 日在两个 Web 前端版本上完成服务端修复。未分配 CVE,也没有报告真实滥用。
  • ChatGPT 的修复已部署。嵌入 MathLive 的团队应审计自己的消息处理器;公开文章并未确定各集成的修复状态。

我受影响吗?

作为 ChatGPT 用户,以下条件必须同时成立:

  • 您在 2026 年 10 月 26 日之前打开过由不可信来源通过公开 /share/ 链接共享的 ChatGPT 会话。
  • 该会话被刻意设计成同时包含一个图表和一段 HTML Preview。
  • 在最可靠的攻击版本中,您在页面打开后点击过一次 ChatGPT 的 Preview 按钮。在后续版本中,打开链接是唯一步骤;Parameter 将该自动路径复现了三次,包括硬刷新之后。

该漏洞位于 ChatGPT 的 Web 前端并已修复,因此如今打开被做过手脚的共享链接不会执行载荷。Parameter 的私密会话验证是在其自控的两个独立账户之间完成的,并报告该漏洞没有真实滥用。

如果您构建的 Web 应用嵌入了 MathLive(ChatGPT 用来渲染交互图表的库),则存在另一种暴露:

  • 您的页面加载 MathLive,它为屏幕上的数学键盘安装一个 postMessage 监听器。
  • 可受攻击者影响的内容能在同页面的某个框架中运行,例如内嵌预览、沙箱化小组件或用户编写的 HTML。
  • 该监听器会处理改变键盘设置的消息,因为 MathLive 的顶层控制器接受来自任意来源的消息。

请检查您的项目是否嵌入 MathLive:

grep -A1 '"node_modules/mathlive"' package-lock.json
grep -rn "mathlive" --include=*.ts --include=*.js --include=*.vue --include=*.tsx src | head -20

如何修复?

ChatGPT 用户无需安装或重置任何内容。OpenAI 已在两个 Web 前端版本中部署修复,到 2026 年 10 月 26 日两者都会拒绝攻击所依赖的跨框架 MathLive 消息。

对于您自己的 MathLive 集成,公开文章并未指定已修复的上游版本。npm 注册表将 v0.111.1 列为最新版,但 GitHub Releases 仍将 v0.100.0 标记为最新版,因此不能仅凭该页面判断包的全部发布情况。不要假定升级即可阻断这条链,应检查相关消息处理器。在集成层面落实 Parameter 的防御建议:

  1. 在处理任何改变状态的消息之前先验证发送者:同时检查 event.origin(发送者的网址)和 event.source(获得授权的确切窗口)。
  2. 将跨窗口设置当作数据而非 HTML:键盘布局及类似结构不得赋给接收页面的 innerHTML。
  3. 只要动态创建的文档内容可能受不可信框架影响,就保持其沙箱化,使被构造的 srcdoc iframe 无法继承您页面的身份。
  4. 将内容安全策略视为后备控制,而不是攻击者 HTML 到达主页面之后的唯一屏障。

这些措施针对集成边界。请查看该库的安全公告和发行说明,并验证您部署版本中相关消息处理的行为。

根本原因是什么?

Preview 的沙箱本身守住了;同一页面里的第二个功能,MathLive 的屏幕键盘,在边界上留了一扇门。Parameter 的文章完整记录了这条链。

ChatGPT 通过 Preview 功能在另一个网址的受限框架中渲染 HTML 代码块,因此该框架无法读取周围已登录的页面。同一会话中的交互图表会把数学排版库 MathLive 加载到主 chatgpt.com 页面。加载 MathLive 会安装一个处理其虚拟键盘消息的监听器。Parameter 发现该监听器接受来自任意发送者的、改变键盘布局的消息,而且布局可以携带原始 HTML。反混淆后的控制流等价于:

window.addEventListener("message", (event) => {
  if (event.data?.type !== "mathlive#virtual-keyboard-message") return;
  if (!validateOrigin(event.origin, this.originValidator)) return;
  this.handleMessage(event.data, event.source);
});

if (message.action === "update-setting" && message.layouts) {
  this.layouts = message.layouts;
}

Parameter 指出,顶层控制器使用 none 来源策略,意味着任意网址都能发送该消息。它也不要求 update-setting 消息来自事先批准的窗口。布局规范化保留了 markup 字段,因此攻击者的 HTML 得以存活。当键盘显示时,布局会到达真实 ChatGPT 页面中的 HTML 汇点:

keyboardContainer.innerHTML = MathfieldElement.createHTML(keyboardHtml);

createHTML 辅助函数看起来像净化器,实际却是一个原样返回输入的包装函数,把字符串标记为可信并原样放行。按 Parameter 的总结,三个设计决策将此变成完整利用:

  • MathLive 在未证明是哪个框架发送的情况下接受改变状态的消息。
  • 消息格式允许原始 HTML 作为键盘布局数据。
  • 该 HTML 能创建继承 chatgpt.com 身份的非沙箱化文档。

如何被利用?

  1. 攻击者编写一个包含真实交互图表、并在其后放置助手生成的 HTML 块的 ChatGPT 会话。图表将 MathLive 加载到主页面,HTML 块被渲染为 Preview。
  2. 攻击者通过 ChatGPT 的正常分享功能发布该会话,并通过邮件、聊天、工单或社交媒体把公开 /share/<id> 链接发给受害者。
  3. 受害者打开链接。Preview 框架向主页面发送两条消息:一条 update-setting 消息用攻击者的 HTML 替换虚拟键盘布局,一条 show 消息让 MathLive 渲染它。
  4. MathLive 将该 HTML 写入主 chatgpt.com 页面的 innerHTML。插入的 HTML 是一个带 srcdoc 属性但没有 sandbox 属性的 iframe,因此浏览器创建一个继承 chatgpt.com 身份的新文档。
  5. ChatGPT 的内容安全策略阻止内联脚本,但允许来自 www.youtube.com 的脚本。该框架加载一个 YouTube oEmbed URL,其 JSONP 风格回调参数携带攻击者的 JavaScript,端点在自身的校验错误响应中把它返回。
  6. 回调在新的框架中作为 chatgpt.com 运行,携带受害者的已登录会话,可直接调用 ChatGPT 的已认证 API。

发送消息的代码和 YouTube URL 都发布在 Parameter 的文章中,上面的两段代码摘录也来自该文章。

攻击如何展开?

共享链接加载图表并安装一个受信任的监听器,沙箱化的 Preview 借助它把攻击者 HTML 推入主页面,再由一个被允许的 YouTube 脚本完成收尾。

flowchart LR A["攻击者分享含图表和
Preview 的会话"] --> B["受害者打开公开
/share 链接"] B --> C["图表将 MathLive 加载
到 chatgpt.com"] C --> D["Preview 发送 update-setting
postMessage(来源未校验)"] D --> E["MathLive 将布局 HTML 写入
innerHTML(无净化)"] E --> F["非沙箱 srcdoc iframe
继承 chatgpt.com 身份"] F --> G["YouTube JSONP 脚本执行
(CSP 允许 youtube)"] G --> H["攻击者 JS 充当受害者:
读取私密聊天,任意操作"]

攻击者能做什么?

载荷以与真实 ChatGPT 页面相同的已认证访问权限运行,因此其影响范围不限于屏幕上恰好显示的内容。Parameter 演示了三项具体能力:

  • 调用 GET /backend-api/conversations 枚举受害者最近的会话。
  • 调用会话详情端点,获取从未与攻击者共享过的私密会话内容。
  • 通过一个普通的图片请求,把该会话中被选中的一小段发送到研究者控制的服务器。

载荷解析页面自身的引导数据以获取会话访问令牌和账户 ID,并在请求头中使用。Parameter 的评估是,这相当于通过 Web 应用对受害者账户的完全控制。研究者写道:"essentially, we could perform any action on behalf of the victim's ChatGPT account"。其边界在于已认证前端能做什么,而不在验证所选的端点。

攻击条件并不苛刻:攻击者只需一个普通 ChatGPT 账户来编写会话、一条传送链接的渠道,以及至多一次受害者交互。OpenAI 在复现代码执行和私密聊天验证后将其定为 P1。

修复为何有效?

OpenAI 的修复让主页面不再信任发送者。两个 Web 前端版本现在都会拒绝报告所用的跨框架 MathLive 消息,因此不可信的 Preview 无法再替换键盘布局并向已登录页面注入 HTML。修复在服务端,用户无需安装。部署期间 OpenAI 还修改了内容安全策略,在其中一个前端仍在等待更新时挡住了链条的一部分。

正如 Parameter 指出,YouTube 这一步是对内容安全策略的绕过,而非原因。仅封禁该端点只会移除通向 JavaScript 的一条路径,而不可信的 Preview 仍能把 HTML 推入主页面。因此修复针对的是每个载荷变体都必须跨越的消息边界。

如何检查是否已被入侵?

Parameter 未公布可靠的事后检测流程。载荷使用受害者已有的浏览器会话,因此正常的会话记录不能排除遭到利用的可能。如果怀疑存在未授权活动,请在 ChatGPT 的安全设置中检查活跃会话,并遵循 OpenAI 账户安全指南。按照事件响应流程调查可能泄露的秘密信息和可用的组织日志;不要假定读取私密聊天一定会生成数据导出事件。

对于您自己的 MathLive 集成,审计在代码侧而非日志侧:搜索每一个处理设置的 postMessage 监听器,确认每个都验证了发送者。未验证 event.origin 与 event.source 就处理消息的监听器属于同一类缺陷,无论页面是什么。

从 10 月 13 日首次确认到 10 月 26 日 OpenAI 修复、10 月 28 日公开文章的披露时间线。
图 1:Parameter 于 2026 年 10 月 13 日确认注入路径,五天后提交报告,OpenAI 于 10 月 26 日修复两个 Web 前端版本。来源:Parameter Security 文章,2026 年 10 月 31 日核对。

时间线

  • 2026-10-13:Parameter 针对 ChatGPT 生产代码确认 MathLive 消息转 HTML 路径。
  • 2026-10-14:通过正常 UI 复现该链并升级为任意 JavaScript。
  • 2026-10-16:在不同账户和工作区之间确认公开共享链接投递,仅需一次 Preview 点击。
  • 2026-10-17:确认从共享导航自动打开 Preview,并在硬刷新后复现。
  • 2026-10-18:Parameter 向 OpenAI 漏洞赏金计划提交报告。
  • 2026-10-19:加入受控的私密会话泄露验证。
  • 2026-10-21:OpenAI 复现问题,将严重程度从 P2 提升至 P1。
  • 2026-10-22:OpenAI 报告一个 Web 前端已修复,第二个仍在更新。
  • 2026-10-23:内容安全策略变更挡住链条的一部分,仍待一次前端更新。
  • 2026-10-26:OpenAI 确认两个前端都拒绝所报告的消息,关闭问题并支付总额 5,000 美元赏金。
  • 2026-10-28:Parameter 发布技术文章。

常见问题

ChatGPT 用户需要做什么吗?

不需要。修复在 OpenAI 一侧,已部署到两个 Web 前端版本,无需安装或重置任何内容。

它在野外被利用了吗?

没有报告真实滥用。Parameter 的私密聊天验证是在其自控的独立账户之间完成的,The Hacker News 于 2026 年 10 月 31 日报道称该公司没有报告任何真实滥用。严重程度来自被演示的能力,而非已观察到的滥用。

MathLive 本身修复了吗?

公开文章并未指定 MathLive 的修复版本。请检查已安装的包及其消息处理行为;GitHub Releases 并未列出所有 npm 版本。落实上面的集成层面检查。

Preview 的沙箱为什么没拦住它?

沙箱确实拦住了直接访问:Preview 内的代码无法读取 ChatGPT 主页面。入口来自同一页面的第二个功能。图表加载了 MathLive,而 MathLive 的键盘监听器接受来自任意框架的指令,使不可信的 Preview 能把 HTML 交给受信任的页面。

暴露规模有多大?

ChatGPT 的 Web 前端是使用最广的 Web 应用之一;OpenAI 自己曾在 2025 年 9 月报告每周活跃用户 7 亿。在 2026 年 10 月 26 日之前,任何可能打开共享链接的登录用户都在范围内。但暴露规模不等于实际影响:没有报告真实滥用。

载荷能做的比读取聊天更多吗?

能。载荷以受害者的会话调用 ChatGPT 自身的已认证 API,因此能触及正常前端可触及的一切,而不只是会话。Parameter 演示了读取私密聊天并外传选中的一小段,并将该原语评估为代表账户执行任意操作的能力。

用 Ostorlab 找出您自己的应用在哪里嵌入 MathLive

如果您的 Web 应用嵌入了 MathLive,第一个问题是在哪里。Ostorlab 的软件成分分析会构建项目的依赖清单,一次扫描即可告诉您哪些应用引入了 MathLive,以及"如何修复?"中的集成审查应在何处进行。

参考文献

  • Parameter Security,Do the Math: How We Took Over ChatGPT Accounts,2026 年 10 月 28 日:https://www.parameter.ai/labs/we-found-a-gap-at-openai(2026 年 10 月 31 日核对)
  • The Hacker News,A Shared ChatGPT Link Could Run Attacker Code in Your Session and Read Private Chats,2026 年 10 月 31 日:https://thehackernews.com/2026/10/a-shared-chatgpt-link-could-run.html(2026 年 10 月 31 日核对)
  • MathLive 安全公告:https://github.com/arnog/mathlive/security/advisories(2026 年 10 月 31 日核对)
  • MathLive: https://registry.npmjs.org/mathlive/latest ; https://github.com/arnog/mathlive/releases
  • MathLive 包页面及每周下载数字:https://www.npmjs.com/package/mathlive(2026 年 10 月 31 日核对)
  • OpenAI, How people are using ChatGPT (2025-09-15): https://openai.com/index/how-people-are-using-chatgpt/