WebGL 2011 安全漏洞?
WebGL 2011 security flaws?
2011 年有一波像 https://www.contextis.com/resources/blog/webgl-more-webgl-security-flaws/ which pointed out security flaws of WebGL. It seems at that point in time WebGL could be used to get pixel data from outside the scope of the WebGL's frame buffer. On the Khronos security site it appears that this problem is fixed https://www.khronos.org/webgl/security/ 这样的博文。他们谈到所有新的内存都归零了,这样陈旧的数据就看不到了。
简而言之,在过去的几年里我并没有看到很多关于这个的讨论,WebGL 仍然不安全还是现在就可以了?当前的安全问题是什么?
WebGL 的目标始终是安全的,正如您在 link 对 Khronos 站点的描述。但回到 2011 年,许多 WebGL 实现仍处于起步阶段,还有很多问题需要解决。正如您所发现的,有很多 "sky is falling" 博客文章实际上只是指出了这些早期实施中的差距。
快进到今天,我会说现代 WebGL 实现非常紧凑。考虑到现在 WebGL 安全性的漏洞不仅仅会影响启用 WebGL 的页面,它会影响任何网页,因为没有什么可以阻止恶意站点或注入代码在其他非 WebGL 页面上创建 WebGL 上下文。浏览器供应商对此非常重视,如果他们认为存在未解决的安全问题,则不会默认启用 WebGL。
许多现代实现还包含 blacklists or whitelists 以确保仅在存在已知可保护安全模型的驱动程序时才启用 WebGL。
所以是的,对于默认启用 WebGL 的任何浏览器,可以安全地假设供应商对其 WebGL 实施的安全性充满信心。
WebGL 做了很多事情来尝试防止任何问题。
CORS
WebGL 不允许使用来自其他域的任何图像,除非该域授予跨源资源共享权限。
请注意,这与 Canvas 2D API 不同,它允许您使用任何图像,但如果您使用来自不同域的图像并且您没有获得 CORS 许可 canvas 将被标记为不可读;您不能再调用 getImageData
或 toDataURL
。
清除所有内存
WebGL 会清除所有缓冲区、纹理、渲染缓冲区等,因此不会有其他程序留下的数据
检查所有边界
所有访问内存的函数都检查了它们的边界。您不能在纹理或缓冲区等边界之外上传数据
强制执行着色器限制
着色器在发送给驱动程序之前会进行预解析,并检查它们是否超过某些限制。函数只能嵌套 8 层。标识符不能超过 256 个字符。检查并强制执行制服和属性限制。
重写所有着色器
用户提供的着色器不会直接传递给驱动程序。相反,它们使用生成的变量名重写,在适当的地方插入边界检查,重写表达式以解决驱动程序错误。
WebGL 实现通常有一个黑名单
如果某个特定驱动程序出现问题,浏览器供应商将尝试添加解决方法或将其列入黑名单。
一些浏览器采取更极端的措施
Chrome(也许很快 Firefox)不会给进程 运行ning 网页直接访问 GPU 的权限。因此,如果 JavaScript 中存在错误或 HTML5 中存在错误,导致页面 运行 某些代码无法访问 GPU(或系统的任何其他部分)。
除此之外,在 Chrome 中实际访问 GPU 的进程无权访问 GPU 以外的任何内容。例如那个进程不能访问磁盘。
WebGL 的设计是安全的,就像 JavaScript 或 HTML5 或图像解压缩或视频解码如果有错误浏览器会立即修复它。
2011 年有一波像 https://www.contextis.com/resources/blog/webgl-more-webgl-security-flaws/ which pointed out security flaws of WebGL. It seems at that point in time WebGL could be used to get pixel data from outside the scope of the WebGL's frame buffer. On the Khronos security site it appears that this problem is fixed https://www.khronos.org/webgl/security/ 这样的博文。他们谈到所有新的内存都归零了,这样陈旧的数据就看不到了。
简而言之,在过去的几年里我并没有看到很多关于这个的讨论,WebGL 仍然不安全还是现在就可以了?当前的安全问题是什么?
WebGL 的目标始终是安全的,正如您在 link 对 Khronos 站点的描述。但回到 2011 年,许多 WebGL 实现仍处于起步阶段,还有很多问题需要解决。正如您所发现的,有很多 "sky is falling" 博客文章实际上只是指出了这些早期实施中的差距。
快进到今天,我会说现代 WebGL 实现非常紧凑。考虑到现在 WebGL 安全性的漏洞不仅仅会影响启用 WebGL 的页面,它会影响任何网页,因为没有什么可以阻止恶意站点或注入代码在其他非 WebGL 页面上创建 WebGL 上下文。浏览器供应商对此非常重视,如果他们认为存在未解决的安全问题,则不会默认启用 WebGL。
许多现代实现还包含 blacklists or whitelists 以确保仅在存在已知可保护安全模型的驱动程序时才启用 WebGL。
所以是的,对于默认启用 WebGL 的任何浏览器,可以安全地假设供应商对其 WebGL 实施的安全性充满信心。
WebGL 做了很多事情来尝试防止任何问题。
CORS
WebGL 不允许使用来自其他域的任何图像,除非该域授予跨源资源共享权限。
请注意,这与 Canvas 2D API 不同,它允许您使用任何图像,但如果您使用来自不同域的图像并且您没有获得 CORS 许可 canvas 将被标记为不可读;您不能再调用
getImageData
或toDataURL
。清除所有内存
WebGL 会清除所有缓冲区、纹理、渲染缓冲区等,因此不会有其他程序留下的数据
检查所有边界
所有访问内存的函数都检查了它们的边界。您不能在纹理或缓冲区等边界之外上传数据
强制执行着色器限制
着色器在发送给驱动程序之前会进行预解析,并检查它们是否超过某些限制。函数只能嵌套 8 层。标识符不能超过 256 个字符。检查并强制执行制服和属性限制。
重写所有着色器
用户提供的着色器不会直接传递给驱动程序。相反,它们使用生成的变量名重写,在适当的地方插入边界检查,重写表达式以解决驱动程序错误。
WebGL 实现通常有一个黑名单
如果某个特定驱动程序出现问题,浏览器供应商将尝试添加解决方法或将其列入黑名单。
一些浏览器采取更极端的措施
Chrome(也许很快 Firefox)不会给进程 运行ning 网页直接访问 GPU 的权限。因此,如果 JavaScript 中存在错误或 HTML5 中存在错误,导致页面 运行 某些代码无法访问 GPU(或系统的任何其他部分)。
除此之外,在 Chrome 中实际访问 GPU 的进程无权访问 GPU 以外的任何内容。例如那个进程不能访问磁盘。
WebGL 的设计是安全的,就像 JavaScript 或 HTML5 或图像解压缩或视频解码如果有错误浏览器会立即修复它。