• 内核如何签名


    转自:http://blog.csdn.net/hui872370036/article/details/69950869

    最近在调试一个驱动的时候,用insmod加载.ko的时候,提示Required key not available,第一反应是签名有问题,内核模块也开始使用类似apk的签名了吗?查资料后果然是这样。这个问题可以说不算是Android的问题,而应该是Linux系统的问题,android本身就是个linux系统。

    下来一步一步分析问题的所在。

    内核配置

    内核从3.7后开始支持模块签名,这个功能使能以后,内核只允许安装特定key签名的模块。 
    内核配置项

    CONFIG_MODULE_SIG=y
    • 1
    • 1

    表示开启了签名机制,但是这时候模块签名或不签名都可以使用。

    CONFIG_MODULE_SIG_FORCE=y
    • 1
    • 1

    如果上述配置项使能,则模块必须有正确的签名才能正常使用。

    CONFIG_MODULE_SIG_ALL=y
    • 1
    • 1

    内核在编译的时候,并不会主动去给模块签名,除非你把上述配置项打开。 
    查看内核配置文件,发现上面3个配置项确实都打开了,因此肯定是ko签名的问题。

    内核如何签名

    在内核kernel/kernel下的Makefile中有如下:

    signing_key.priv signing_key.x509: x509.genkey
        @echo "###"
        @echo "### Now generating an X.509 key pair to be used for signing modules."
        @echo "###"
        @echo "### If this takes a long time, you might wish to run rngd in the"
        @echo "### background to keep the supply of entropy topped up.  It"
        @echo "### needs to be run as root, and uses a hardware random"
        @echo "### number generator if one is available."
        @echo "###"
        openssl req -new -nodes -utf8 -$(CONFIG_MODULE_SIG_HASH) -days 36500 
            -batch -x509 -config x509.genkey 
            -outform DER -out signing_key.x509 
            -keyout signing_key.priv 2>&1
        @echo "###"
        @echo "### Key pair generated."
        @echo "###"
    
    x509.genkey:
        @echo Generating X.509 key generation config
        @echo  >x509.genkey "[ req ]"
        @echo >>x509.genkey "default_bits = 4096"
        @echo >>x509.genkey "distinguished_name = req_distinguished_name"
        @echo >>x509.genkey "prompt = no"
        @echo >>x509.genkey "string_mask = utf8only"
        @echo >>x509.genkey "x509_extensions = myexts"
        @echo >>x509.genkey
        @echo >>x509.genkey "[ req_distinguished_name ]"
        @echo >>x509.genkey "O = Magrathea"
        @echo >>x509.genkey "CN = Glacier signing key"
        @echo >>x509.genkey "emailAddress = slartibartfast@magrathea.h2g2"
        @echo >>x509.genkey
        @echo >>x509.genkey "[ myexts ]"
        @echo >>x509.genkey "basicConstraints=critical,CA:FALSE"
        @echo >>x509.genkey "keyUsage=digitalSignature"
        @echo >>x509.genkey "subjectKeyIdentifier=hash"
        @echo >>x509.genkey "authorityKeyIdentifier=keyid"
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    其中,x509.genkey是生成key pair时的配置项,signing_key.priv signing_key.x509分别为private key和数字证书。数字证书会打包进内核,里面有公钥等,用来解密嘛。每编译一次,虽然配置文件每次都相同,但是生成的key pair是不同的。

    查看签名信息

    利用下面命令查看设备中的ko文件信息:

    hexdump -C spidev.ko | tail
    • 1
    • 1

    下面是输出(内核签名后会把签名信息附在模块的最后面):

    00004900  9e 94 0a 08 dd 24 a8 a4  7d 44 a6 63 bc 8a 94 7c  |.....$..}D.c...||
    00004910  6d aa 74 28 3c 42 bb df  62 ec ad a6 e8 6e 65 4c  |m.t(<B..b....neL|
    00004920  bd 79 79 3c 74 60 a3 e4  ef 0f 4d 02 29 fa dc 9a  |.yy<t`....M.)...|
    00004930  06 b4 b2 1d 78 b9 c2 ff  11 1e c1 e0 4d e3 bb 45  |....x.......M..E|
    00004940  02 f9 e6 43 b7 fc 46 9e  a6 98 fc a1 12 84 ce d8  |...C..F.........|
    00004950  4c 32 d1 b8 ba 6b 4c 4d  3e 33 02 20 01 06 01 1e  |L2...kLM>3. ....|
    00004960  14 00 00 00 00 00 02 02  7e 4d 6f 64 75 6c 65 20  |........~Module |
    00004970  73 69 67 6e 61 74 75 72  65 20 61 70 70 65 6e 64  |signature append|
    00004980  65 64 7e 0a                                       |ed~.|
    00004984
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    由上面输出,我们发现这个ko已经有签名信息(Module signature appended),为何还是提示key不对。于是我将编译机中版本的spidev.ko和设备中的做比较,发现唯有最后部分不同,我猜一定是两个ko的签名不同,这应该就是初步原因。

    仔细分析后,得到原因: 
    设备中的内核是后来编译的,编译完成后我将内核单独烧录进设备(内核肯定就放在kernel的分区),而未改变文件系统(这样会造成新kernel中的数字证书已经改变,但是文件系统中的ko未改变,而是用以前的内核中private key进行签名的)。重新完整烧录版本后,一切功能正常!

  • 相关阅读:
    科普 | 验证码有什么用?
    验证码是什么?有什么作用?(风控必看)
    银保监会提示信用卡逾期风险 简析“以卡养卡”背后的三个原因
    微信、电商、机票、抖音上的黑灰产“生意”
    假“信用卡”坑用户害商家 如何帮助银行构建反欺诈模型
    “羊毛党”们最喜欢用的手机号码分析
    是贫穷限制了想象力?双11黑产薅一天可吃一年,史上最强反羊毛党科普
    一场直播成交过亿?揭开数字背后的猫腻
    关联网络的特点有哪些?
    “双十一”购物节 电商平台面临的五大业务风险
  • 原文地址:https://www.cnblogs.com/x_wukong/p/7451877.html
Copyright © 2020-2023  润新知