关于kernel module签名

在实际应用中,为了安全,一般会使用将发布的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 ""

重新编译后,启动正常。

该方法只能用于调试,在生产环境中应该将这些配置恢复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值