模块装载版本检查机制

参考资料:

  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相关的命令

 

 

 

 

 

 

 

 

在需要进一步了解,需要看内核加载code~~~

 

posted on 2019-03-13 20:24  rivsidn  阅读(269)  评论(0编辑  收藏  举报

导航