模块装载版本检查机制
参考资料:
https://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/index.html
https://yq.aliyun.com/articles/1724
背景:
Linux 的迅速发展致使相邻版本的内核之间亦存在较大的差异,即在版本补丁号(Patch Level,即内核版本号的第四位数)相邻的内核之间。为此 Linux 的开发者为了保证内核的稳定,Linux 在加载模块到内核时对模块采用了版本校验机制。
就是确保,一个module只能在编译的内核版本上运行。
技术实现:
Linux 对可装载模块采取了两层验证:模块的 CRC 值校验和 vermagic 的检查。其中模块 CRC 值校验针对模块(内核)导出符号,是一种简单的 ABI(即 Application Binary Interface)一致性检查;而模块 vermagic(即 Version Magic String)则保存了模块编译时的内核版本以及 SMP 等配置信息,当模块 vermagic 与主机信息不相符时亦将终止模块的加载。
意思就是说,每个内核的导出符号表都有一个CRC,当引用这个符号的时候,需要拿编译时候的CRC来跟内核中已经存在的该符号的CRC匹配;模块Vermagic版本就比较就是内核编译时候,会通过顶层的 Makefile 获取到内核版本信息,模块加载时候会check,如果不匹配不能加载。
1.CRC校验信息
objdump --section=__versions -s <module_name>.ko
CRC 校验信息在模块 section “__versions” 中。
//内核的CRC信息应该只能通过编译生成的 Module.symvers 得到,如果可以通过用户态通过正常手段获取,那就给系统留了很大的后门。
2.Vermagic信息
objdump --section=.modinfo -s <module_name>.ko
版本信息在模块 section ".modinfo" 中。
//这个比较容易获取到,“uname -a” 就可以看到了。
有关module相关的命令
名称 | 说明 |
---|---|
insmod | 装载模块到当前运行的内核中 |
rmmod | 从当前运行的内核中卸载模块 |
lsmod | 显示当前内核已加装的模块信息 |
modinfo | 检查与内核模块相关联的目标文件,并打印出所有得到的信息 |
modprobe | 利用 depmod 创建的依赖关系文件自动加载相关的模块 |
depmod | 创建一个内核可装载模块的依赖关系文件,modprobe 用它来自动加载模块 |
在需要进一步了解,需要看内核加载code~~~