ChatGPT HTML 预览漏洞:沙箱隔离如何被突破
漏洞影响:打开分享页面也可能触发风险
ChatGPT 的 HTML 预览功能使用带有沙箱限制的 iframe 展示交互式 HTML 应用。这类设计的关键,是让不可信代码始终留在隔离环境内,不能访问主页面的接口或用户私密数据。
此次披露的漏洞突破了这条边界。攻击者可以构造一个 ChatGPT 分享地址;其他已登录用户访问后,恶意代码便可能读取并外传其私密数据,或以其身份执行操作。
这一问题已被 OpenAI 修复,相关漏洞赏金为 5000 美元。
攻击链为何能够成立
1. 虚拟键盘的消息处理缺少隔离
ChatGPT 在图形功能中使用了 MathLive JavaScript 库。该库自带虚拟键盘,沙箱 iframe 可以通过 postMessage() 请求父页面触发键盘。
问题在于,接收消息的代码使用了 innerHTML,而且没有有效阻止其他沙箱框架调用这一处理逻辑。HTML 预览中的不可信代码因此也能向父页面插入自定义 HTML。
2. HTML 注入进一步突破沙箱
通过 innerHTML 插入的脚本元素不会直接执行,但攻击者仍可借此插入一个不带沙箱限制的新 iframe。这使攻击链从受限的预览环境,延伸到了隔离更弱的执行环境。
3. 脚本加载白名单存在可利用路径
ChatGPT 的内容安全策略(CSP)禁止内联脚本,仅允许从少数域名加载脚本,其中包括 YouTube。
攻击链利用了 YouTube oEmbed 接口能够返回可执行 JavaScript 的特性,绕过这层脚本加载限制,最终在 ChatGPT 页面环境中执行代码。
4. 页面执行权限转化为数据访问能力
获得页面内的 JavaScript 执行能力后,恶意代码便能够调用接口获取用户私密数据,并借助图片请求将数据传出,也可能代替用户执行操作。
关键问题是多层边界同时失守
这并非单一的 HTML 注入问题,而是一条跨组件攻击链:消息处理缺少调用方约束、innerHTML 允许插入不可信内容、新 iframe 未受到沙箱限制,以及脚本白名单中的接口存在可利用行为。
对于允许展示模型生成 HTML 的产品,这起事件凸显了一个安全重点:预览 iframe 本身具有沙箱属性,并不意味着整条交互链都受到可靠隔离。 与父页面通信的组件、动态插入的内容,以及允许加载脚本的域名,都属于需要检查的安全边界。