Firefox 5 中禁用了跨域 WebGL 纹理

在 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 警告,解释发生的情况并链接到该维基页面。

必须做出此更改令人遗憾,因为它会破坏某些现有的 Web 内容。我们最初希望等到 CORS 方法实现之后再阻止跨域纹理。但是,我们的首要任务始终是保障用户安全,因此我们决定立即在 Firefox 5 中修复安全问题。这种时机也考虑到,随着在线内容提供商推出支持,CORS 处理将变得越来越有用。

9 条评论

  1. phillihp

    我以前没听说过这个,很有意思。你总是可以简单地通过一个小的隧道脚本把它传递过去。

    2011 年 6 月 10 日 下午 12:19

  2. Gary Coding

    这破坏了从文件加载带有纹理的 WebGL 页面:URL。
    我认为它应该将同一目录或任何子目录中的纹理文件视为位于同一域中。但它没有这么做。

    2011 年 6 月 21 日 下午 11:21

    1. Benoit Jacob

      @ Gary
      如果您想将 file:// URI 视为同源,可以在 about:config 中将 security.fileuri.strict_origin_policy 设置为 true。这与 WebGL 纹理无关。默认情况下,我们会对 file:// URI 强制执行严格的来源策略。

      2011 年 6 月 22 日 上午 4:34

      1. Julian Adams

        @Benoit

        这与这个页面相矛盾:http://kb.mozillazine.org/Security.fileuri.strict_origin_policy,该页面表示,同一目录或子目录算作同源(即使 strict_origin_policy 为 true)。我应该将其作为错误提交吗?

        2011 年 6 月 22 日 上午 5:39

        1. Benoit Jacob

          @ Julian:我没有别的意思,如果表达不清楚,我道歉。只有在您发现 file:// URI 对 WebGL 纹理的处理方式与其他适用同源限制的项目不同时才提交错误。

          2011 年 6 月 22 日 上午 5:55

  3. Gry Coding

    @Benoit:是的,file:// URI 对 WebGL 纹理的处理方式与其他适用同源限制的项目不同。

    @Julian:感谢您澄清我的帖子。

    一个易于设置的测试:获取此文件http://learningwebgl.com/lessons/lesson05/index.html 以及它使用的两个 JS 文件和 1 个 GIF,并将所有文件放到本地目录中。

    2011 年 6 月 22 日 上午 9:27

  4. skierpage

    请修复《星际航行》,在 Windows Vista 上使用 Firefox 5 时,它会输出大量

    警告:WebGL:用作 texImage2D 来源的画布已受污染(只写)。禁止从受污染的画布加载 WebGL 纹理。例如,当跨域图像绘制到画布上时,画布就会被污染。请参阅https://mdn.org.cn/en/WebGL/Cross-Domain_Textures
    源文件:http://videos.mozilla.org/serv/mozhacks/flight-of-the-navigator/
    行号:446

    错误:未捕获的异常:[[Exception… “Failure arg 5 [nsIDOMWebGLRenderingContext.texImage2D]” nsresult: “0x80004005 (NS_ERROR_FAILURE)” location: “JS frame :: http://videos.mozilla.org/serv/mozhacks/flight-of-the-navigator/ :: updateFlickrTexture :: line 446″ data: no]

    2011 年 7 月 19 日 下午 2:55

    1. louisremi

      现在,Firefox nightly 中启用了跨域 WebGL 纹理,**前提是具有适当的 CORS 标头**。
      修复此演示需要编写一个代理,该代理将从 Flickr 获取图像并添加适当的标头……

      2011 年 7 月 20 日 上午 7:37

  5. Henri Astre

    在非常特定的情况下,我发现了一种解决方法,可以无需 CORS 标头即可显示来自跨域的纹理:http://www.visual-experiments.com/2011/10/03/how-to-bypass-webgl-sop-restriction/

    2011 年 10 月 4 日 上午 9:34

本文的评论已关闭。