为了提高进程间安全性(UID
相同)和特权下降,已经做了很多userland
工作,但使用专有的 Linux 内核组件是很常见的(遗憾的是,GPLv2 似乎并没有真正解决闭源内核模块问题)。
我的问题是关于“沙箱”一个封闭源代码内核模块的概念(现有的或正在开发的)。
在我看来,在合理的偏执时期(维基解密、斯诺登之后),人们一直在寻找如何防止专有内核模块中潜在后门的方法,对吗?
答案1
是的,专有驱动程序有一个沙箱概念。它称为用户层驱动程序。
如果您在内核中运行代码,它就可以访问所有内容,因此不可能对其进行沙箱处理。 (对于 Linux 系统来说这是不可能的——该系统可以在虚拟机中运行,然后虚拟机将执行沙箱操作。)
用户态驱动程序可用于某些类型的外设。例如,一些 USB 外设可以通过用户态驱动libusb和USBFS. 文件系统可以在用户空间通过以下方式实现保险丝。
鉴于外设的恶意驱动程序通常可以利用其对外设的访问来访问系统的其余部分(例如,通过将外设配置为DMA并因此访问任意内存),尝试沙箱驱动程序没有多大意义。如果您不信任该驱动程序,请不要使用它。
可以通过在虚拟机内运行驱动程序并配置虚拟机管理程序以允许虚拟机仅访问特定外围设备来执行一些沙箱操作。仅当外设本身只能访问内存的特定部分时,这才有用,这可以通过IOMMU(当然,IOMMU 必须保持在虚拟机管理程序的控制之下)。并非所有系统都支持此类沙箱 - 再说一次,如果您不信任外围设备,为什么要将它放在计算机中?
答案2
我认为这是可能的,CPU 提供了一些支持来限制部分内核代码的访问。
但有两个困难:专有内核模块是由硬件公司编写的,因此,即使内核可以限制对某些地址的访问,硬件端也可以不受限制地访问。
第二个困难:我怀疑内核人员是否会实施这样的计划:隐含的Linux内核规则规定“不喜欢闭源人员”,这样的计划将使他们的任务更容易/更容易接受。