Skip to content

Commit

Permalink
ima: enable loading of build time generated key on .ima keyring
Browse files Browse the repository at this point in the history
The kernel currently only loads the kernel module signing key onto the
builtin trusted keyring. Load the module signing key onto the IMA keyring
as well.

Signed-off-by: Nayna Jain <nayna@linux.ibm.com>
Acked-by: Stefan Berger <stefanb@linux.ibm.com>
Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
  • Loading branch information
naynajain authored and mimizohar committed Apr 9, 2021
1 parent 0165f4c commit 6cbdfb3
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 11 deletions.
13 changes: 12 additions & 1 deletion certs/system_certificates.S
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@
.globl system_certificate_list
system_certificate_list:
__cert_list_start:
#ifdef CONFIG_MODULE_SIG
__module_cert_start:
#if defined(CONFIG_MODULE_SIG) || defined(CONFIG_IMA_APPRAISE_MODSIG)
.incbin "certs/signing_key.x509"
#endif
__module_cert_end:
.incbin "certs/x509_certificate_list"
__cert_list_end:

Expand All @@ -35,3 +37,12 @@ system_certificate_list_size:
#else
.long __cert_list_end - __cert_list_start
#endif

.align 8
.globl module_cert_size
module_cert_size:
#ifdef CONFIG_64BIT
.quad __module_cert_end - __module_cert_start
#else
.long __module_cert_end - __module_cert_start
#endif
50 changes: 40 additions & 10 deletions certs/system_keyring.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ static struct key *platform_trusted_keys;

extern __initconst const u8 system_certificate_list[];
extern __initconst const unsigned long system_certificate_list_size;
extern __initconst const unsigned long module_cert_size;

/**
* restrict_link_to_builtin_trusted - Restrict keyring addition by built in CA
Expand Down Expand Up @@ -132,19 +133,11 @@ static __init int system_trusted_keyring_init(void)
*/
device_initcall(system_trusted_keyring_init);

/*
* Load the compiled-in list of X.509 certificates.
*/
static __init int load_system_certificate_list(void)
static __init int load_cert(const u8 *p, const u8 *end, struct key *keyring)
{
key_ref_t key;
const u8 *p, *end;
size_t plen;

pr_notice("Loading compiled-in X.509 certificates\n");

p = system_certificate_list;
end = p + system_certificate_list_size;
while (p < end) {
/* Each cert begins with an ASN.1 SEQUENCE tag and must be more
* than 256 bytes in size.
Expand All @@ -159,7 +152,7 @@ static __init int load_system_certificate_list(void)
if (plen > end - p)
goto dodgy_cert;

key = key_create_or_update(make_key_ref(builtin_trusted_keys, 1),
key = key_create_or_update(make_key_ref(keyring, 1),
"asymmetric",
NULL,
p,
Expand All @@ -186,6 +179,43 @@ static __init int load_system_certificate_list(void)
pr_err("Problem parsing in-kernel X.509 certificate list\n");
return 0;
}

__init int load_module_cert(struct key *keyring)
{
const u8 *p, *end;

if (!IS_ENABLED(CONFIG_IMA_APPRAISE_MODSIG))
return 0;

pr_notice("Loading compiled-in module X.509 certificates\n");

p = system_certificate_list;
end = p + module_cert_size;

return load_cert(p, end, keyring);
}

/*
* Load the compiled-in list of X.509 certificates.
*/
static __init int load_system_certificate_list(void)
{
const u8 *p, *end;
unsigned long size;

pr_notice("Loading compiled-in X.509 certificates\n");

#ifdef CONFIG_MODULE_SIG
p = system_certificate_list;
size = system_certificate_list_size;
#else
p = system_certificate_list + module_cert_size;
size = system_certificate_list_size - module_cert_size;
#endif

end = p + size;
return load_cert(p, end, builtin_trusted_keys);
}
late_initcall(load_system_certificate_list);

#ifdef CONFIG_SYSTEM_DATA_VERIFICATION
Expand Down
7 changes: 7 additions & 0 deletions include/keys/system_keyring.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,16 @@ extern int restrict_link_by_builtin_trusted(struct key *keyring,
const struct key_type *type,
const union key_payload *payload,
struct key *restriction_key);
extern __init int load_module_cert(struct key *keyring);

#else
#define restrict_link_by_builtin_trusted restrict_link_reject

static inline __init int load_module_cert(struct key *keyring)
{
return 0;
}

#endif

#ifdef CONFIG_SECONDARY_TRUSTED_KEYRING
Expand Down
2 changes: 2 additions & 0 deletions security/integrity/digsig.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ static int __init __integrity_init_keyring(const unsigned int id,
} else {
if (id == INTEGRITY_KEYRING_PLATFORM)
set_platform_trusted_keys(keyring[id]);
if (id == INTEGRITY_KEYRING_IMA)
load_module_cert(keyring[id]);
}

return err;
Expand Down

0 comments on commit 6cbdfb3

Please sign in to comment.