可加载内核模块(LKM,)

概述

可加载模块(LKM)是为了扩展操作系统基本内核功能的object代码文件,通常使用LKM为新的硬件或文件系统添加支持,或添加系统调用,当LKM所提供的功能不需要时,也可以卸载LKM以达到释放内存和资源。

优点

如果没有可加载内核模块,操作系统必须将可能的功能全部编译到基础内核中,大部分功能驻留在内存中但不会被使用,造成内存浪费。如果再有新的功能加入,用户就需要重建并重启基础内核。

在Linux上的实现

通过modprobe命令,Linux可以挂载或卸载可加载内核模块。从内核2.6版本开始,这些可加载模块就以.ko的形式放置在/lilb/modules文件夹中。lsmod命令列出所有可加载的内核模块,在紧急情况下,当启动因为损坏的模块而不能启动时,可以通过修改内核启动参数来允许/禁止某些特定模块的加载(修改GRUB内核配置菜单)

二进制兼容性

Linux没有为内核模块提供稳定的API或ABI,这意味着不同的内核版本中的模块内部结构和功能是有区别的,这会造成兼容性问题,为了解决这个问题,需要将符号版本控制数据放置在可加载ELF模块的.modinfo部分中。在加载一个模块前,会将版本信息与正在运行的内核进行比较,如果版本信息不兼容,这个模块就不会被加载。

安全性

虽然可加载模块对运行的内核来说是一个方便的方法,攻击者也可能在一个受感染的系统上阻止检查他的进程或文件,从而保持对系统的控制权。许多rookit都使用这种方式控制系统。需要注意的是,无论在任何系统上,模块都不会帮助提升特权,只是可以让攻击者的入侵隐藏的更好。
1.对于Linux
Linux可以通过sysctl选项/proc/sys/kernel/modules_disabled禁用模块加载,initramfs系统会首先加载启动机器所需要的特定模块,然后禁用模块加载功能。