OpenGL 是一个安全问题吗?

信息安全 硬件 opengl 司机 显卡
2021-08-15 02:54:50

今天,几乎所有桌面和大多数移动操作系统和设备都支持某些版本的 OpenGL。我想知道这对安全的影响:

  • 在许多情况下,GPU 可以完全且不受限制地访问主内存(用于集成图形设备)或至少是视频 RAM,其中也可能存储敏感信息(想想合成窗口管理器或硬件加速的 Web 浏览器)。
  • 在一些实现中,OpenGL 客户端通过直接将数据和命令写入共享内存来与 GPU 通信。
  • 只有最近的 GPU 似乎支持内存虚拟化,即便如此,目前也只有一些驱动程序实现正在使用它。
  • WebGL 要求对新分配的缓冲区对象进行零初始化;我怀疑这意味着标准 OpenGL 中不需要这样做。这是否意味着理论上可以在视频内存中分配缓冲区并读取潜在的安全敏感数据?

那么是谁或什么让我无法编写一个着色器程序来读取视频中的数据,甚至是不属于我的主存储器?

我在 Linux 图形系统中找到了有关当前事务状态的演示文稿,其中提到对 GPU 的命令要么由内核验证,要么在 GPU 上使用虚拟内存来分隔用户。

对于其他操作系统,尤其是移动操作系统,例如 Android,其中的各个应用程序都被强沙盒化,但几乎可以无限访问 OpenGL,这是否也是如此?该演示文稿中甚至特别提到了 Tegra 2,它允许驱动程序的用户潜在地无限访问内存。

2个回答

我在 Linux 和各种 GPU 和驱动程序上进行了一些实验。我为纹理映射学习了一个基本的 OpenGL 教程,并将调用 glTexImage2D 中指向纹理数据的指针替换为空指针。

在 Nvidia GPU 上使用 nouveau 驱动程序,结果非常有趣:

使用 nouveau 的未初始化的 OpenGL 缓冲区

立方体上的文本似乎包含了我的终端窗口以前的内容,这些内容是由 Compiz 在 GPU 上合成的。

英特尔 GMA 驱动程序只显示一个黑色立方体;在 Android 上也是如此(使用 Adreno 和 Nvidia Tegra 3 GPU 进行测试)。

当然,这并不能证明这些驱动程序/系统中的任何一个都是安全的;OpenGL 实现也可以只在驱动程序的用户空间组件中而不是在内核中初始化内存。

为了获得适当的安全性,显卡必须像所有其他类型的可以访问 RAM 的硬件一样对待:它们必须属于MMU和内核控制的调度程序,以便同时执行的任务不会相互影响,并且可以交互只能通过内核精心管理的通信渠道。

正如您所注意到的,3D 图形控制器的这种隔离和共享只是最近的一项功能。在前两个十年的大部分时间里,加速 3D 图形一直是通往漏洞的开放之路……事实证明,这些漏洞很少被利用,原因如下:

  • 在大多数系统(Windows、Linux...)上,只有坐在机器前面的用户才有权访问 3D 卡,因为流畅的 3D 动画无论如何都不会通过网络切断它。与摆弄 GPU 相比,可以物理访问机器的邪恶人员拥有更有效的进入系统的途径。

  • 处理 GPU 的低级细节是一项艰巨的工作,尤其是因为其中很多都没有记录(这就是为什么在 Linux 中仍然使用专有驱动程序的原因)。攻击者也是人,因此天生懒惰。

像智能手机这样的沙盒平台可能会改变这一点,因为它们确实托管了可以访问 3D 硬件但彼此敌对的应用程序。但他们为什么会在意呢?在安装时要求广泛的访问权限要简单得多(用户只是对所有都说是)。