在 Firefox 5 中,不再可以使用跨域元素作为 WebGL 纹理的来源。我们做出此更改是为了应对围绕跨域信息泄露可能性而产生的安全问题。不幸的是,这意味着某些使用 WebGL 的页面不再起作用。我们正在与 WebGL 工作组合作寻找解决方案,以便尽快让这些页面恢复正常工作 - 请继续阅读以了解详细信息。
关于跨域图像的安全规则
跨域图像是指来自与画布不同域的图像。Web 安全的一项基本规则是,脚本不得读取来自跨域图像的像素数据 - 它们只能“盲目地”显示它们。更具体地说,想象一下,您当前在银行网站上有一个会话打开,允许您下载您开具的支票的扫描副本。您不希望在其他网站上的其他选项卡中加载的脚本能够读取您扫描的支票!类似地,当您使用 drawImage() 将跨域图像绘制到 2D 画布上时,画布会变为“受污染”,因此脚本不再能够读取其像素。这将防止出现一个漏洞,即画布被用作读取跨域图像的代理。
将跨域图像用作 WebGL 纹理的问题
当跨域图像用作 WebGL 纹理时,WebGL 画布会“受污染”,因此不再能够从其读取。理论上,这消除了这一问题。但不久前,一位研究人员向公共 WebGL 列表写信,提出了一个可能的攻击,该攻击仍然可以读取来自 WebGL 纹理的像素。这个想法是使用一个精心设计的 WebGL 片段着色器以与亮度成正比的时间量一次绘制一个像素的纹理,然后计时所需的时间:这可以想象地允许获取原始图像的近似值。最初,这种攻击似乎很难在实践中执行,但从那时起,已经发布了包括一个概念验证在内的进一步研究,表明这种攻击比最初预期的更现实。
回应
WebGL 规范已更新,禁止将跨域图像用作 WebGL 纹理,并且 Mozilla 在 Firefox 5 中的实现已更新以反映这一点。还添加了一个非规范性部分,允许具有CORS 审批的跨域图像。在这种情况下使用 CORS 是一种方法,允许服务器明确说明何时可以由跨域脚本读取图像。我们非常重视 WebGL 的 CORS 支持,并将尽快实现它。
一个维基页面解释了更多详细信息。受影响的脚本将生成 DOM_SECURITY_ERR 异常,并且在发生异常之前,将显示一个 JS 警告,解释发生的情况并链接到该维基页面。
9 条评论