Parameter Labs 披露了一条针对 ChatGPT 产物(artifacts)机制的完整攻击链。所谓产物机制,指的是在沙箱 iframe 中展示可交互的自定义 HTML 应用。OpenAI 早期将这一功能称为 Canvas,而最新版本似乎改名为 HTML 预览。由于这些 HTML 应用直接运行在 ChatGPT 的主页面环境中,一旦沙箱隔离不够严密,不受信任的代码就可能与 OpenAI 的 API 交互,读取用户的私有数据。因此,严格的沙箱边界是这项功能安全性的核心前提。
Parameter Labs 发现的攻击链相当复杂,并非单点漏洞,而是多个看似无害的设计细节串联起来的结果。第一步,OpenAI 在图表支持中使用了 MathLive JavaScript 库,而该库自带一个虚拟键盘组件。这个键盘可以被父页面中的代码触发,触发方式正是来自沙箱 iframe 的 postMessage() 消息。
问题出在接收这条消息的代码:它使用 innerHTML 把收到的内容写入父页面,这意味着任何能够发送消息的一方都可以向父页面注入自定义 HTML。更关键的是,当时没有任何机制阻止其他沙箱帧去调用这个方法,包括 HTML 预览帧本身。于是,iframe 中的不受信任代码获得了向父页面插入 HTML 的能力。虽然 innerHTML 不会直接执行 script 元素,但攻击者可以利用它注入一个新的、不带沙箱限制的 iframe,从而绕过原有的隔离。
接下来要解决的是脚本执行问题。OpenAI 的内容安全策略(CSP)完全禁止内联脚本,并且只允许从少数几个域名加载脚本,YouTube 正是其中之一。攻击者发现,YouTube 的 oEmbed 端点可以被用来反射 JavaScript,并让其在页面中执行。这样,攻击链的最后一块拼图也补齐了。
一旦攻击者在 ChatGPT 页面上取得 JavaScript 执行权限,后续操作就变得非常简单:他们可以调用 API 获取用户的私有数据,再通过图片引用将数据外泄。最终效果是,攻击者可以构造一个 ChatGPT 分享链接,当另一名已登录用户访问该链接时,其私有数据就可能被窃取,或者攻击者能够以该用户的名义执行操作。
OpenAI 在收到报告后修复了这个漏洞,并支付了 5,000 美元的漏洞赏金。Simon Willison 认为,对于如此严重的安全问题,这个金额略显偏低。该事件也提醒人们,在集成第三方库、使用 postMessage 通信以及配置 CSP 白名单时,任何一处疏忽都可能被组合利用,形成影响用户账户安全的完整攻击路径。