WebGL 2011安全漏洞?

3
2011年,出现了一系列博客文章,例如https://www.contextis.com/resources/blog/webgl-more-webgl-security-flaws/,指出WebGL的安全漏洞。当时似乎可以使用WebGL来获取WebGL帧缓冲区范围之外的像素数据。在Khronos安全站点上,似乎已经解决了这个问题 https://www.khronos.org/webgl/security/。他们讨论了所有新内存都是以零清空的,以便不能看到旧数据。
简而言之,我没有在最近几年中听到过这方面的讨论,WebGL仍然不安全吗,还是现在已经安全可用?当前的安全问题是什么?

1
微软支付了寻找安全漏洞的费用。现在微软正在发布WebGL。 - gman
2个回答

4
WebGL的目标一直是要保证安全性,正如您在Khronos网站上提到的那样。但是回到2011年,许多WebGL实现仍处于初级阶段,并且需要解决很多问题。正如您发现的那样,有很多“天塌下来了”的博客文章,其实只是指出这些早期实现中的差距。

快进到今天,我认为现代WebGL实现非常紧密。考虑到WebGL安全性的差距现在不仅会影响到启用WebGL的页面,而且会影响到任何网页,因为没有什么可以防止恶意站点或注入代码在其他非WebGL页面上创建WebGL上下文。浏览器厂商非常重视此事,如果他们认为存在未解决的安全问题,就不会默认启用WebGL。

许多现代实现也包含黑名单或白名单(链接),以确保只有当已知能够保持安全模型的驱动程序存在时才启用WebGL。

因此,对于任何默认启用WebGL的浏览器,可以安全地假定供应商对其WebGL实现的安全性充满信心。


4

WebGL采取了许多措施来防止任何问题的发生。

  1. CORS

    WebGL不允许使用来自其他域的任何图像,除非该域给予跨域资源共享权限。

    请注意,这与Canvas 2D API不同,后者允许您使用任何图像,但如果您使用来自不同域的图像并且没有获得CORS权限,则画布将被标记为不可读;您无法再调用getImageDatatoDataURL

  2. 清除所有内存

    WebGL清除所有缓冲区、纹理、渲染缓冲区等,因此没有来自其他程序的数据遗留。

  3. 检查所有边界

    所有访问内存的函数都经过边界检查。您不能在纹理或缓冲区的边界之外上传数据等。

  4. 强制执行着色器限制

    在将着色器发送到驱动程序之前,会对其进行预解析并检查它们是否超出了某些限制。函数只能嵌套8层。标识符长度不能超过256个字符。检查并强制执行Uniform和Attribute限制。

  5. 重新编写所有着色器

    用户提供的着色器不会直接传递给驱动程序。相反,它们将使用生成的变量名进行重写,在适当的位置插入边界检查,以解决驱动程序错误。

  6. WebGL实现通常具有黑名单

    如果特定驱动程序出现问题,浏览器厂商将尝试添加解决方法或将其列入黑名单。

  7. 一些浏览器采取了更严格的措施

    Chrome(可能很快也包括Firefox)不会授予运行网页的进程直接访问GPU的权限。因此,如果JavaScript中存在错误或HTML5中存在错误允许页面运行某些代码,则该代码无法访问GPU(或任何其他系统部分)。

    此外,Chrome中实际访问GPU的进程没有访问除GPU以外的任何内容的权限。例如,该进程无法访问磁盘。

WebGL旨在安全,就像JavaScript、HTML5、图像解压缩或视频解码一样,如果存在漏洞,浏览器会立即修复它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接