曾几何时(在内核 2.6.25 之前),人们可以使用/proc/sys/kernel/cap-bound
dropCAP_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 一起使用。