summaryrefslogtreecommitdiff
path: root/kernel/module_signature.c
diff options
context:
space:
mode:
authorFrank van der Linden <fllinden@amazon.com>2021-01-14 22:21:46 +0000
committerJessica Yu <jeyu@kernel.org>2021-01-19 10:24:45 +0100
commitec2a29593c83ed71a7f16e3243941ebfcf75fdf6 (patch)
tree31f2fa7d8c0a0a7667d5c45acd61bdca4db080c0 /kernel/module_signature.c
parentebfac7b778fac8b0e8e92ec91d0b055f046b4604 (diff)
downloadlwn-ec2a29593c83ed71a7f16e3243941ebfcf75fdf6.tar.gz
lwn-ec2a29593c83ed71a7f16e3243941ebfcf75fdf6.zip
module: harden ELF info handling
5fdc7db644 ("module: setup load info before module_sig_check()") moved the ELF setup, so that it was done before the signature check. This made the module name available to signature error messages. However, the checks for ELF correctness in setup_load_info are not sufficient to prevent bad memory references due to corrupted offset fields, indices, etc. So, there's a regression in behavior here: a corrupt and unsigned (or badly signed) module, which might previously have been rejected immediately, can now cause an oops/crash. Harden ELF handling for module loading by doing the following: - Move the signature check back up so that it comes before ELF initialization. It's best to do the signature check to see if we can trust the module, before using the ELF structures inside it. This also makes checks against info->len more accurate again, as this field will be reduced by the length of the signature in mod_check_sig(). The module name is now once again not available for error messages during the signature check, but that seems like a fair tradeoff. - Check if sections have offset / size fields that at least don't exceed the length of the module. - Check if sections have section name offsets that don't fall outside the section name table. - Add a few other sanity checks against invalid section indices, etc. This is not an exhaustive consistency check, but the idea is to at least get through the signature and blacklist checks without crashing because of corrupted ELF info, and to error out gracefully for most issues that would have caused problems later on. Fixes: 5fdc7db6448a ("module: setup load info before module_sig_check()") Signed-off-by: Frank van der Linden <fllinden@amazon.com> Signed-off-by: Jessica Yu <jeyu@kernel.org>
Diffstat (limited to 'kernel/module_signature.c')
-rw-r--r--kernel/module_signature.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/module_signature.c b/kernel/module_signature.c
index 4224a1086b7d..00132d12487c 100644
--- a/kernel/module_signature.c
+++ b/kernel/module_signature.c
@@ -25,7 +25,7 @@ int mod_check_sig(const struct module_signature *ms, size_t file_len,
return -EBADMSG;
if (ms->id_type != PKEY_ID_PKCS7) {
- pr_err("%s: Module is not signed with expected PKCS#7 message\n",
+ pr_err("%s: not signed with expected PKCS#7 message\n",
name);
return -ENOPKG;
}