linux module签名问题

前言

内核对于可信计算支持的越来越完善,linux发行版在这个基础上也逐渐默认使能一些它的安全功能,其中一项就是内核module签名。
原来是只要有root权限就可以随意insmod,后来DAC这套权限机制太过于宽松,出现了MAC,可信计算,就是使用两套权限模型,而且保持向后兼容,即同时满足两套模型的权限要求才能正确执行。
可信计算主要解决BIOS -> grub -> kernel -> 根文件系统 中间不会被hack的问题,它通过证书签名这套机制来满足,证书签名只要足够长,解的空间足够大,需要破解的时间越长,它是一个数学命题。

同时也给简单的linux系统增加了复杂性,它为了安全牺牲了简单性和性能,也变相的提升了使用的门槛。

问题

安装内核module的时候被拒绝了

# insmod jprobe_example.ko 
insmod: ERROR: could not insert module jprobe_example.ko: Operation not permitted

$ dmesg|tail

[ 1507.135964] jprobe_example: loading out-of-tree module taints kernel.
[ 1507.136031] jprobe_example: module verification failed: signature and/or required key missing - tainting kernel
[ 1507.137744] register_jprobe failed, returned -38

$ modinfo jprobe_example.ko

filename:       /home/linux/xxx/jprobe_example.ko
license:        GPL
srcversion:     3A62E1A1D3207CB7518F7AC
depends:        
retpoline:      Y
name:           jprobe_example
vermagic:       4.15.0-76-generic SMP mod_unload

内核配置:

CONFIG_MODULE_SIG=y                                                             
CONFIG_MODULE_SIG_FORCE=y                                                                                                                                                                          
CONFIG_MODULE_SIG_ALL=y

没有签名就对其添加证书签名:

openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -outform DER -out \
signing_key.x509 -keyout signing_key.priv

kmodsign sha256 signing_key.priv signing_key.x509 jprobe_example.ko

$ dmesg|tail

[ 2088.742235] PKCS#7 signature not signed with a trusted key
[ 2088.743903] register_jprobe failed, returned -38

UEFI模式启动系统可以尝试这两种方法
1.disable证书检查

通过UEFI并且使能了secure boot启动ubuntu系统,此时需要签名。可以通过mokutil工具 --disable-validation重启系统来解决

2.导入自己的证书

mkdir ~/opensslkeys
cd ~/opensslkeys
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=YOURUSERNAME/"
sudo apt install mokutil
sudo mokutil --import MOK.der

Reboot and follow prompts int enroll certificate (before GRUB loads). Follow steps in this article and then:

kmodsign sha512 ~/opensslkeys/MOK.priv ~/opensslkeys/MOK.der r8152.ko
sudo make install
sudo depmod -a

其他

签名检查逻辑在module_sig_check中,比较简单,感兴趣自行查看

通过内核源码编译升级内核的时候,在centos下也默认需要签名,参考另外一篇文章

在华为手机上内核配置也是同样强制要求签名的,没办法搞到它的签名,这只能通过hack的方法,幸运的是他开源了内核代码。可以先将它的boot.img从MMC上dump下来,解压出kernel内核镜像。通过它提供的/proc/config.gz来编译源码,反编译module_sig_check,之后在kernel二进制文件中找到同样的位置,修改检查指令使其永远返回成功,并且再重新烧写回去,这样绕过证书检查。其实这中间需要一个解锁的步骤,bootloader不再验证kernel镜像的签名值,不然我们修改了内核镜像之后启动的时候就可能加载失败了。

链接

https://wiki.ubuntu.com/UEFI/SecureBoot

你可能感兴趣的:(linux)