Back to home page

OSCL-LXR

 
 

    


0001 Kernel module signing facility
0002 ------------------------------
0003 
0004 .. CONTENTS
0005 ..
0006 .. - Overview.
0007 .. - Configuring module signing.
0008 .. - Generating signing keys.
0009 .. - Public keys in the kernel.
0010 .. - Manually signing modules.
0011 .. - Signed modules and stripping.
0012 .. - Loading signed modules.
0013 .. - Non-valid signatures and unsigned modules.
0014 .. - Administering/protecting the private key.
0015 
0016 
0017 ========
0018 Overview
0019 ========
0020 
0021 The kernel module signing facility cryptographically signs modules during
0022 installation and then checks the signature upon loading the module.  This
0023 allows increased kernel security by disallowing the loading of unsigned modules
0024 or modules signed with an invalid key.  Module signing increases security by
0025 making it harder to load a malicious module into the kernel.  The module
0026 signature checking is done by the kernel so that it is not necessary to have
0027 trusted userspace bits.
0028 
0029 This facility uses X.509 ITU-T standard certificates to encode the public keys
0030 involved.  The signatures are not themselves encoded in any industrial standard
0031 type.  The facility currently only supports the RSA public key encryption
0032 standard (though it is pluggable and permits others to be used).  The possible
0033 hash algorithms that can be used are SHA-1, SHA-224, SHA-256, SHA-384, and
0034 SHA-512 (the algorithm is selected by data in the signature).
0035 
0036 
0037 ==========================
0038 Configuring module signing
0039 ==========================
0040 
0041 The module signing facility is enabled by going to the
0042 :menuselection:`Enable Loadable Module Support` section of
0043 the kernel configuration and turning on::
0044 
0045         CONFIG_MODULE_SIG       "Module signature verification"
0046 
0047 This has a number of options available:
0048 
0049  (1) :menuselection:`Require modules to be validly signed`
0050      (``CONFIG_MODULE_SIG_FORCE``)
0051 
0052      This specifies how the kernel should deal with a module that has a
0053      signature for which the key is not known or a module that is unsigned.
0054 
0055      If this is off (ie. "permissive"), then modules for which the key is not
0056      available and modules that are unsigned are permitted, but the kernel will
0057      be marked as being tainted, and the concerned modules will be marked as
0058      tainted, shown with the character 'E'.
0059 
0060      If this is on (ie. "restrictive"), only modules that have a valid
0061      signature that can be verified by a public key in the kernel's possession
0062      will be loaded.  All other modules will generate an error.
0063 
0064      Irrespective of the setting here, if the module has a signature block that
0065      cannot be parsed, it will be rejected out of hand.
0066 
0067 
0068  (2) :menuselection:`Automatically sign all modules`
0069      (``CONFIG_MODULE_SIG_ALL``)
0070 
0071      If this is on then modules will be automatically signed during the
0072      modules_install phase of a build.  If this is off, then the modules must
0073      be signed manually using::
0074 
0075         scripts/sign-file
0076 
0077 
0078  (3) :menuselection:`Which hash algorithm should modules be signed with?`
0079 
0080      This presents a choice of which hash algorithm the installation phase will
0081      sign the modules with:
0082 
0083         =============================== ==========================================
0084         ``CONFIG_MODULE_SIG_SHA1``      :menuselection:`Sign modules with SHA-1`
0085         ``CONFIG_MODULE_SIG_SHA224``    :menuselection:`Sign modules with SHA-224`
0086         ``CONFIG_MODULE_SIG_SHA256``    :menuselection:`Sign modules with SHA-256`
0087         ``CONFIG_MODULE_SIG_SHA384``    :menuselection:`Sign modules with SHA-384`
0088         ``CONFIG_MODULE_SIG_SHA512``    :menuselection:`Sign modules with SHA-512`
0089         =============================== ==========================================
0090 
0091      The algorithm selected here will also be built into the kernel (rather
0092      than being a module) so that modules signed with that algorithm can have
0093      their signatures checked without causing a dependency loop.
0094 
0095 
0096  (4) :menuselection:`File name or PKCS#11 URI of module signing key`
0097      (``CONFIG_MODULE_SIG_KEY``)
0098 
0099      Setting this option to something other than its default of
0100      ``certs/signing_key.pem`` will disable the autogeneration of signing keys
0101      and allow the kernel modules to be signed with a key of your choosing.
0102      The string provided should identify a file containing both a private key
0103      and its corresponding X.509 certificate in PEM form, or — on systems where
0104      the OpenSSL ENGINE_pkcs11 is functional — a PKCS#11 URI as defined by
0105      RFC7512. In the latter case, the PKCS#11 URI should reference both a
0106      certificate and a private key.
0107 
0108      If the PEM file containing the private key is encrypted, or if the
0109      PKCS#11 token requires a PIN, this can be provided at build time by
0110      means of the ``KBUILD_SIGN_PIN`` variable.
0111 
0112 
0113  (5) :menuselection:`Additional X.509 keys for default system keyring`
0114      (``CONFIG_SYSTEM_TRUSTED_KEYS``)
0115 
0116      This option can be set to the filename of a PEM-encoded file containing
0117      additional certificates which will be included in the system keyring by
0118      default.
0119 
0120 Note that enabling module signing adds a dependency on the OpenSSL devel
0121 packages to the kernel build processes for the tool that does the signing.
0122 
0123 
0124 =======================
0125 Generating signing keys
0126 =======================
0127 
0128 Cryptographic keypairs are required to generate and check signatures.  A
0129 private key is used to generate a signature and the corresponding public key is
0130 used to check it.  The private key is only needed during the build, after which
0131 it can be deleted or stored securely.  The public key gets built into the
0132 kernel so that it can be used to check the signatures as the modules are
0133 loaded.
0134 
0135 Under normal conditions, when ``CONFIG_MODULE_SIG_KEY`` is unchanged from its
0136 default, the kernel build will automatically generate a new keypair using
0137 openssl if one does not exist in the file::
0138 
0139         certs/signing_key.pem
0140 
0141 during the building of vmlinux (the public part of the key needs to be built
0142 into vmlinux) using parameters in the::
0143 
0144         certs/x509.genkey
0145 
0146 file (which is also generated if it does not already exist).
0147 
0148 It is strongly recommended that you provide your own x509.genkey file.
0149 
0150 Most notably, in the x509.genkey file, the req_distinguished_name section
0151 should be altered from the default::
0152 
0153         [ req_distinguished_name ]
0154         #O = Unspecified company
0155         CN = Build time autogenerated kernel key
0156         #emailAddress = unspecified.user@unspecified.company
0157 
0158 The generated RSA key size can also be set with::
0159 
0160         [ req ]
0161         default_bits = 4096
0162 
0163 
0164 It is also possible to manually generate the key private/public files using the
0165 x509.genkey key generation configuration file in the root node of the Linux
0166 kernel sources tree and the openssl command.  The following is an example to
0167 generate the public/private key files::
0168 
0169         openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \
0170            -config x509.genkey -outform PEM -out kernel_key.pem \
0171            -keyout kernel_key.pem
0172 
0173 The full pathname for the resulting kernel_key.pem file can then be specified
0174 in the ``CONFIG_MODULE_SIG_KEY`` option, and the certificate and key therein will
0175 be used instead of an autogenerated keypair.
0176 
0177 
0178 =========================
0179 Public keys in the kernel
0180 =========================
0181 
0182 The kernel contains a ring of public keys that can be viewed by root.  They're
0183 in a keyring called ".builtin_trusted_keys" that can be seen by::
0184 
0185         [root@deneb ~]# cat /proc/keys
0186         ...
0187         223c7853 I------     1 perm 1f030000     0     0 keyring   .builtin_trusted_keys: 1
0188         302d2d52 I------     1 perm 1f010000     0     0 asymmetri Fedora kernel signing key: d69a84e6bce3d216b979e9505b3e3ef9a7118079: X509.RSA a7118079 []
0189         ...
0190 
0191 Beyond the public key generated specifically for module signing, additional
0192 trusted certificates can be provided in a PEM-encoded file referenced by the
0193 ``CONFIG_SYSTEM_TRUSTED_KEYS`` configuration option.
0194 
0195 Further, the architecture code may take public keys from a hardware store and
0196 add those in also (e.g. from the UEFI key database).
0197 
0198 Finally, it is possible to add additional public keys by doing::
0199 
0200         keyctl padd asymmetric "" [.builtin_trusted_keys-ID] <[key-file]
0201 
0202 e.g.::
0203 
0204         keyctl padd asymmetric "" 0x223c7853 <my_public_key.x509
0205 
0206 Note, however, that the kernel will only permit keys to be added to
0207 ``.builtin_trusted_keys`` **if** the new key's X.509 wrapper is validly signed by a key
0208 that is already resident in the ``.builtin_trusted_keys`` at the time the key was added.
0209 
0210 
0211 ========================
0212 Manually signing modules
0213 ========================
0214 
0215 To manually sign a module, use the scripts/sign-file tool available in
0216 the Linux kernel source tree.  The script requires 4 arguments:
0217 
0218         1.  The hash algorithm (e.g., sha256)
0219         2.  The private key filename or PKCS#11 URI
0220         3.  The public key filename
0221         4.  The kernel module to be signed
0222 
0223 The following is an example to sign a kernel module::
0224 
0225         scripts/sign-file sha512 kernel-signkey.priv \
0226                 kernel-signkey.x509 module.ko
0227 
0228 The hash algorithm used does not have to match the one configured, but if it
0229 doesn't, you should make sure that hash algorithm is either built into the
0230 kernel or can be loaded without requiring itself.
0231 
0232 If the private key requires a passphrase or PIN, it can be provided in the
0233 $KBUILD_SIGN_PIN environment variable.
0234 
0235 
0236 ============================
0237 Signed modules and stripping
0238 ============================
0239 
0240 A signed module has a digital signature simply appended at the end.  The string
0241 ``~Module signature appended~.`` at the end of the module's file confirms that a
0242 signature is present but it does not confirm that the signature is valid!
0243 
0244 Signed modules are BRITTLE as the signature is outside of the defined ELF
0245 container.  Thus they MAY NOT be stripped once the signature is computed and
0246 attached.  Note the entire module is the signed payload, including any and all
0247 debug information present at the time of signing.
0248 
0249 
0250 ======================
0251 Loading signed modules
0252 ======================
0253 
0254 Modules are loaded with insmod, modprobe, ``init_module()`` or
0255 ``finit_module()``, exactly as for unsigned modules as no processing is
0256 done in userspace.  The signature checking is all done within the kernel.
0257 
0258 
0259 =========================================
0260 Non-valid signatures and unsigned modules
0261 =========================================
0262 
0263 If ``CONFIG_MODULE_SIG_FORCE`` is enabled or module.sig_enforce=1 is supplied on
0264 the kernel command line, the kernel will only load validly signed modules
0265 for which it has a public key.   Otherwise, it will also load modules that are
0266 unsigned.   Any module for which the kernel has a key, but which proves to have
0267 a signature mismatch will not be permitted to load.
0268 
0269 Any module that has an unparseable signature will be rejected.
0270 
0271 
0272 =========================================
0273 Administering/protecting the private key
0274 =========================================
0275 
0276 Since the private key is used to sign modules, viruses and malware could use
0277 the private key to sign modules and compromise the operating system.  The
0278 private key must be either destroyed or moved to a secure location and not kept
0279 in the root node of the kernel source tree.
0280 
0281 If you use the same private key to sign modules for multiple kernel
0282 configurations, you must ensure that the module version information is
0283 sufficient to prevent loading a module into a different kernel.  Either
0284 set ``CONFIG_MODVERSIONS=y`` or ensure that each configuration has a different
0285 kernel release string by changing ``EXTRAVERSION`` or ``CONFIG_LOCALVERSION``.