为什么要保护 Linux 内核免受 root 用户的攻击?

信息安全 linux 核心
2021-09-04 04:33:49

modules_disabledkexec_load_disabledsysctls 以及锁定 and 之/dev/mem的东西的目的是什么/dev/kmem他们背后的想法似乎是防止root接管内核,但我不确定为什么这很有用。如果攻击者获得了 root 权限,即使没有内核访问权限,他们通过修改二进制文件之类的操作是否也几乎拥有了这台机器?

我知道结合安全启动,这可以使内核保持良好状态,但同样,如果整个用户空间都受到损害,为什么这很有用?

4个回答

如果攻击者获得了 root 权限,即使没有内核访问权限,他们通过修改二进制文件之类的操作是否也几乎拥有了这台机器?

也许,也许不是。使用 SELinux,您可以限制对块设备的访问,即使是 root 用户。因此,如果您的根分区是只读的(并且系统使用 OverlayFS 运行以提供非持久性修改),那么保护内核免受 root 影响可以保证重新启动时的一致状态,即使机器在根级别。

然而,如果内核不受 root 用户的保护,您就无法获得这样的保证。

如果没有经过验证的引导以及经过验证的模块,kexec您将为内核提供更好的机会来保护自己免受特权升级的攻击。默认情况下,这两个功能被禁用:

kexec_load_disabled

指示 kexec_load 系统调用是否已禁用的切换​​。该值默认为 0(false:启用 kexec_load),但可以设置为 1(true:禁用 kexec_load)。一旦为真,就不能再使用 kexec,并且不能将切换设置回假。这允许在禁用系统调用之前加载 kexec 映像,从而允许系统在不更改映像的情况下设置(并稍后使用)映像。一般与“modules_disabled”sysctl 一起使用。

modules_disabled:

一个切换值,指示是否允许将模块加载到其他模块化内核中。此切换默认为关闭 (0),但可以设置为 true (1)。一旦为 true,模块既不能加载也不能卸载,并且切换不能设置回 false。通常与“kexec_load_disabled”切换一起使用。

这不仅适用于反黑客测量,而且我相信也是一种一致性保护。

想象一下,如果一个用户(甚至是 root)修改了他/她不应该在内核中拥有的东西。它很容易破坏系统。因此,它不仅是为了保护恶意软件(即使内核漏洞至关重要),也是为了系统一致性。

但是,root 可以加载内核模块。

这些模块具有完整的内核功能,尽管它们通常自己调用任意函数。在此处查看更多信息...

是的,生根机器等同于拥有它 - 无需破解/访问内核。(有趣的事实:pwn来自own这个词)

其中之一就是虚拟化硬件并不总是只运行一个操作系统。在运行虚拟机时,虚拟机的内核在某种程度上仍然可以访问硬件,或者它与主机共享部分内存。

我记得最突出的例子是VENOM 漏洞它使用软盘驱动程序退出来宾机器。现在,易受攻击的内核可以设置kernel.modules_disabled=1而不加载软盘驱动程序。此外,通过访问内核内存,有人可能会在不经过的情况下注入驱动程序modprobe(这将非常困难但并非不可能)。