关于kernel module签名【转】

转自:https://blog.csdn.net/jiang010/article/details/109133301

在实际应用中,为了安全,一般会使用将发布的ko进行签名,特别是像android这样的系统。例如:在android系统中,kernel在bootimage中,如果编译的ko文件在vednor或其他分区,并且打开了模块签名与校验配置,那么在调试的时候就需要同时编译ko与bootimage,否则外部的ko将安装失败。

关于kernel module签名可以参考:https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/module-signing.rst,已经写的非常详细了。

下面是一次调试实例:在调试kernel过程中,当重新编译bootimage后,独立编译在其他分区的ko文件安装失败了,根据上面的参考链接与本地代码发现打开了如下开关:

CONFIG_MODULE_SIG=y
CONFIG_MODULE_SIG_FORCE=y
由于没有配置CONFIG_MODULE_SIG_KEY来指定签名的密钥,所以每次在编译的时候都会动态生成一个密钥对,导致每次前面的密钥不一样,从而安装失败。为了调试,根据上面参考链接的介绍,关闭了CONFIG_MODULE_SIG_FORCE,重新编译,启动的时候出现了如下报错信息:

xxx:disagrees about version of symbol module_layout
根据stackexchange上的回答,只能先关闭CONFIG_MODVERSIONS配置选项。重新编译,还是安装失败,报如下错误:

xxx: version magic '4.9.193+ SMP preempt mod_unload modversions aarch64' should be '4.9.193+ SMP preempt mod_unload aarch64'
根据 include/linux/vermagic.h中对VERMAGIC_STRING的定义,可以知道CONFIG_MODVERSIONS在打开的时候MODULE_VERMAGIC_MODVERSIONS的值为"modversions ",因为外部xxx.ko在编译的时候CONFIG_MODVERSIONS=yes,所以我们在CONFIG_MODVERSIONS关闭的时候MODULE_VERMAGIC_MODVERSIONS的值也要为"modversions "。修改如下:

--- a/include/linux/vermagic.h
+++ b/include/linux/vermagic.h
@@ -19,7 +19,7 @@
#ifdef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MODVERSIONS "modversions "
#else
-#define MODULE_VERMAGIC_MODVERSIONS ""
+#define MODULE_VERMAGIC_MODVERSIONS "modversions "
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC ""
重新编译后,启动正常。

该方法只能用于调试,在生产环境中应该将这些配置恢复。
————————————————
版权声明:本文为CSDN博主「jiang010」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jiang010/article/details/109133301

【作者】张昺华
【大饼教你学系列】https://edu.csdn.net/course/detail/10393
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【微信公众号】 张昺华
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/sky-heaven/p/14926923.html