可以在现代 Linux 内核上全局禁用模块加载吗?

可以在现代 Linux 内核上全局禁用模块加载吗?

曾几何时(在内核 2.6.25 之前),人们可以使用/proc/sys/kernel/cap-bounddropCAP_SYS_MODULE系统范围的内容,并确保当前加载到内核空间的代码集是全部,没有漏洞利用或重新启动。

然后决定CAP_NET_ADMIN即使没有(!)也允许加载内核模块CAP_SYS_MODULE,并且的值CAP_SYS_MODULE就结束了 - 通过现代内核进行 grepping,我发现没有运行时检查CAP_SYS_MODULE仍然存在。

现代的替代品是什么?

答案1

Kees Cook 在 2009 年初实现了一个 sysctl 来满足这一需求。如文档中所述文档/sysctl/kernel.txt:

modules_disabled:

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


kexec_load_disabled如前所述,如果目标是控制内核空间中哪些代码处于活动状态,则应使用此方法:

kexec_load_disabled:

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

相关内容