KEYS: Measure keys when they are created or updated
Subsystems (5)
v5 cover KEYS: Measure keys when they are created or updated
Problem Statement:
Keys created or updated in the system are currently not being measured. Therefore an attestation service, for instance, would not be able to attest whether or not the trusted keys keyring(s), for instance, contain only known good (trusted) keys.
IMA measures system files, command line arguments passed to kexec, boot aggregate, etc. It can be used to measure keys as well. But there is no mechanism available in the kernel for IMA to know when a key is created or updated.
This change aims to address measuring keys created or updated in the system:
=> Patches #1 through #5 update IMA policy functions to handle
measurement of keys based on configured IMA policy.
=> Patches #6 and #7 add IMA hook for measuring keys and the call
to the IMA hook from key_create_or_update function. Keys are processed immediately - no support for deferred processing.
=> Patches #8 through #10 add support for queuing keys if
custom IMA policies have not been applied yet and process the queued keys when custom IMA policies are applied.
To achieve the above the following changes have been made:
- Added a new IMA hook namely, ima_post_key_create_or_update, which measures the key. This IMA hook is called from key_create_or_update function. The key measurement can be controlled through IMA policy.
In this change set a new IMA policy function KEYRING_CHECK has been added to measure keys. The policy can optionally specify a set of keyrings to measure. By default all keyrings are included in the measurement when KEYRING_CHECK policy is specified.
# measure all keys measure func=KEYRING_CHECK
# measure keys on the IMA keyring measure func=KEYRING_CHECK keyring=".ima"
# measure keys on the BUILTIN and IMA keyrings into a different PCR measure func=KEYRING_CHECK keyring=".builtin_trusted_keys|.ima" pcr
Testing performed:
* Booted the kernel with this change.
* Executed keyctl tests from the Linux Test Project (LTP)
* All keys are measured when only KEYRING_CHECK is set.
* Only keys added to the given keyrings are measured when keyrings option is set.
* Keys are not measured when KEYRING_CHECK is not set.
* Key is queued for measurement if IMA is not yet initialized and processed when IMA is initialized.
* Key is measured rightaway when IMA is initialized.
* Added a new key to a keyring and verified "key create" code path. => In this case added a key to .ima keyring.
* Added the same key again and verified "key update" code path. => Add the same key to .ima keyring.
Change Log:
v5:
=> Reorganized the patches to add measurement of keys through
the IMA hook without any queuing and then added queuing support.
=> Updated the queuing functions to minimize code executed inside mutex. => Process queued keys after custom IMA policies have been applied.
v4:
=> Rebased the changes to v5.4-rc3
=> Applied the following dependent patch set first
and then added new changes.
https://lore.kernel.org/linux-integrity/[email protected]
=> Refactored the patch set to separate out changes related to
func KEYRING_CHECK and options keyrings into different patches.
=> Moved the functions to queue and dequeue keys for measurement
from ima_queue.c to a new file ima_asymmetric_keys.c.
=> Added a new config namely CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS
to compile ima_asymmetric_keys.c
v3:
=> Added KEYRING_CHECK for measuring keys. This can optionally specify
keyrings to measure.
=> Updated ima_get_action() and related functions to return
the keyrings if specified in the policy.
=> process_buffer_measurement() function is updated to take keyring
as a parameter. The key will be measured if the policy includes the keyring in the list of measured keyrings. If the policy does not specify any keyrings then all keys are measured.
v2:
=> Per suggestion from Mimi reordered the patch set to first
enable measuring keys added or updated in the system. And, then scope the measurement to keys added to builtin_trusted_keys keyring through ima policy.
=> Removed security_key_create_or_update function and instead
call ima hook, to measure the key, directly from key_create_or_update function.
v1:
=> LSM function for key_create_or_update. It calls ima. => Added ima hook for measuring keys
=> ima measures keys based on ima policy.
v0:
=> Added LSM hook for key_create_or_update.
=> Measure keys added to builtin or secondary trusted keys keyring.
Background:
Currently ima measures file hashes and .ima signatures. ima signatures are validated against keys in the ".ima" keyring. If the kernel is built with CONFIG_IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY enabled, then all keys in ".ima" keyring must be signed by a key in ".builtin_trusted_keys" or ".secondary_trusted_keys" keyrings.
Although ima supports the above configuration, not having an insight into what keys are present in these trusted keys keyrings would prevent an attestation service from validating a client machine.
On systems with CONFIG_IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY enabled, measuring keys in the ".builtin_trusted_keys" keyring provides a mechanism to attest that the client's system binaries are indeed signed by signers that chain to known trusted keys.
Without this change, to attest the clients one needs to maintain an "allowed list" of file hashes of all versions of all client binaries that are deployed on the clients in the enterprise. That is a huge operational challenge in a large scale environment of clients with heterogenous builds. This also limits scalability and agility of rolling out frequent client binary updates.
Questions and concerns raised by reviewers on this patch set:
Question 1:
Is "Signed with a trusted key" equal to "Trusted file"? Doesn't the service need the hashes of the system files to determine whether a file is trusted or not?
"Signed with a trusted key" does not equal "Trusted"
Answer:
Agree "Signed with a trusted key" may not equal "Trusted". To address this, the attesting service can maintain a small manageable set of bad hashes (a "Blocked list") and a list of trusted keys expected in client's .builtin_trusted_keys" keyring. Using this data, the service can detect the presence of "Disallowed (untrusted) version of client binaries".
Question 2:
Providing more data to the service (such as ".builtin_trusted_keys"), empowers the service to deny access to clients (block clients). IMA walks a fine line in enforcing and measuring file integrity. This patchset breaches that fine line and in doing so brings back the fears of trusted computing.
Answer:
Any new measurement we add in IMA will provide more data to service and can enable it to deny access to clients. It is not clear why this patch set would breach the fine line between measuring and enforcing. Since this patch set is disabled by default and enabled through CONFIG_IMA_MEASURE_TRUSTED_KEYS, only those enterprises that require this new measurement can opt-in for it. Since it is disabled by default, it does not restrict the autonomy of independent users who are unaffected by attestation.
Question 3:
IMA log already contains a pointer to the IMA keys used for signature verification. Why does the service need to care what keys were used to sign (install) the IMA keys? What is gained by measuring the keys in the ".builtin_trusted_keys"
Answer:
To attest the clients using the current IMA log, service needs to maintain hashes of all the deployed versions of all the system binaries for their enterprise. This will introduce a very high operational overhead in a large scale environment of clients with heterogenous builds. This limits scalability and agility of rolling out frequent client binary updates.
On the other hand, with the current patch set, we will have IMA validate the file signature on the clients and the service validate that the IMA keys were installed using trusted keys.
This provides a chain of trust:
=> IMA Key validates file signature on the client => Built-In trusted key attests IMA key on the client => Attestation service attests the Built-In trusted keys
reported by the client in the IMA log
This approach, therefore, would require the service to maintain a manageble set of trusted keys that it receives from a trusted source. And, verify if the clients only have keys from that set of trusted keys.
Question 4:
Where will the attestation service receive the keys to validate against?
Answer:
Attestation service will receive the keys from a trusted source such as the enterprise build services that provides the client builds. The service will use this set of keys to verify that the keys reported by the clients in the IMA log contains only keys from this trusted list.
Question 5:
What is changing in the IMA log through this patch set?
Answer:
This patch set does not remove any data that is currently included in the IMA log. It only adds more data to the IMA log - the data on ".builtin_trusted_keys"
Lakshmi Ramasubramanian (10):
IMA: Added KEYRING_CHECK func in IMA policy to measure keys
IMA: Added keyrings= option in IMA policy to only measure keys added
to the specified keyrings.
IMA: Read keyrings= option from the IMA policy into ima_rule_entry
IMA: Updated IMA policy functions to return keyrings option read from
the policy
IMA: Measure key if the IMA policy allows measurement for the keyring
to which the key is linked to
IMA: Defined an IMA hook to measure keys on key create or update
KEYS: Call the IMA hook to measure key when a new key is created or an
existing key is updated
IMA: Added a flag to determine whether IMA hook can process the key
now or has to queue for processing later
IMA: Defined functions to queue and dequeue keys for measurement
IMA: Call queue and dequeue functions to measure keys.
Documentation/ABI/testing/ima_policy | 16 +- include/linux/ima.h | 13 ++ security/integrity/ima/Kconfig | 14 ++ security/integrity/ima/Makefile | 1 + security/integrity/ima/ima.h | 32 ++- security/integrity/ima/ima_api.c | 8 +- security/integrity/ima/ima_appraise.c | 4 +- security/integrity/ima/ima_asymmetric_keys.c | 201 +++++++++++++++++++ security/integrity/ima/ima_main.c | 31 ++- security/integrity/ima/ima_policy.c | 53 ++++- security/keys/key.c | 9 + 11 files changed, 366 insertions(+), 16 deletions(-) create mode 100644 security/integrity/ima/ima_asymmetric_keys.c
Signature · 1 line
2.17.1
PATCH v5 1/10 IMA: Added KEYRING_CHECK func in IMA policy to measure keys
IMA policy needs to support a func to enable measurement of asymmetric keys.
This patch defines a new IMA policy func namely KEYRING_CHECK to measure asymmetric keys.
--- Documentation/ABI/testing/ima_policy | 6 ++++++ security/integrity/ima/ima.h | 1 + security/integrity/ima/ima_policy.c | 4 +++- 3 files changed, 10 insertions(+), 1 deletion(-)
Documentation/ABI/testing/ima_policy +6 -0
@@ -30,6 +30,7 @@ Description: [FIRMWARE_CHECK] [KEXEC_KERNEL_CHECK] [KEXEC_INITRAMFS_CHECK] [KEXEC_CMDLINE] + [KEYRING_CHECK] mask:= [[^]MAY_READ] [[^]MAY_WRITE] [[^]MAY_APPEND] [[^]MAY_EXEC] fsmagic:= hex value
@@ -113,3 +114,8 @@ Description: Example of appraise rule allowing modsig appended signatures: appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig|modsig + + Example of measure rule using KEYRING_CHECK to measure + all keys: + + measure func=KEYRING_CHECK
security/integrity/ima/ima.h +1 -0
@@ -193,6 +193,7 @@ static inline unsigned long ima_hash_key(u8 *digest) hook(KEXEC_INITRAMFS_CHECK) \ hook(POLICY_CHECK) \ hook(KEXEC_CMDLINE) \ + hook(KEYRING_CHECK) \ hook(MAX_CHECK) #define __ima_hook_enumify(ENUM) ENUM,
security/integrity/ima/ima_policy.c +3 -1
@@ -373,7 +373,7 @@ static bool ima_match_rules(struct ima_rule_entry *rule, struct inode *inode, {int i; -if (func =KEXEC_CMDLINE ) { +if ((func =KEXEC_CMDLINE ) || (func =KEYRING_CHECK )) {if ((rule->flags &IMA_FUNC ) && (rule->func = func))return true;return false;
@@ -997,6 +997,8 @@ static int ima_parse_rule(char *rule, struct ima_rule_entry *entry) entry->func =POLICY_CHECK ; else if (strcmp(args[0].from, "KEXEC_CMDLINE") = 0) entry->func = KEXEC_CMDLINE; + else if (strcmp(args[0].from, "KEYRING_CHECK") = 0) + entry->func = KEYRING_CHECK; else result = -EINVAL ;if (!result)
Signature · 1 line
2.17.1
Mimi Zohar
maintainerRe: [PATCH v5 01/10] IMA: Added KEYRING_CHECK func in IMA policy to measure keys
Quoted 5 lines · Lakshmi Ramasubramanian
IMA policy needs to support a func to enable measurement of asymmetric keys.
This patch defines a new IMA policy func namely
KEYRING_CHECKto measure asymmetric keys.
This new feature measures "keys" based on policy, not "keyrings". Please change the name to KEY_CHECK.
Quoted 63 lines
Signed-off-by Lakshmi Ramasubramanian <[email protected]>--- Documentation/ABI/testing/ima_policy | 6 ++++++ security/integrity/ima/ima.h | 1 + security/integrity/ima/ima_policy.c | 4 +++- 3 files changed, 10 insertions(+), 1 deletion(-)Documentation/ABI/testing/ima_policy +6
-0@@ -30,6 +30,7 @@ Description: [FIRMWARE_CHECK] [KEXEC_KERNEL_CHECK] [KEXEC_INITRAMFS_CHECK] [KEXEC_CMDLINE] + [KEYRING_CHECK] mask:= [[^]MAY_READ] [[^]MAY_WRITE] [[^]MAY_APPEND] [[^]MAY_EXEC] fsmagic:= hex value@@ -113,3 +114,8 @@ Description: Example of appraise rule allowing modsig appended signatures: appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig|modsig + + Example of measure rule using KEYRING_CHECK to measure + all keys: + + measure func=KEYRING_CHECKsecurity/integrity/ima/ima.h +1
-0@@ -193,6 +193,7 @@ static inline unsigned long ima_hash_key(u8 *digest) hook(KEXEC_INITRAMFS_CHECK) \ hook(POLICY_CHECK) \ hook(KEXEC_CMDLINE) \ + hook(KEYRING_CHECK) \ hook(MAX_CHECK) #define __ima_hook_enumify(ENUM) ENUM,security/integrity/ima/ima_policy.c +3
-1@@ -373,7 +373,7 @@ static bool ima_match_rules(struct ima_rule_entry *rule, struct inode *inode, {int i; -if (func =KEXEC_CMDLINE ) { +if ((func =KEXEC_CMDLINE ) || (func =KEYRING_CHECK )) {if ((rule->flags &IMA_FUNC ) && (rule->func = func))return true;return false;@@ -997,6 +997,8 @@ static int ima_parse_rule(char *rule, struct ima_rule_entry *entry) entry->func =POLICY_CHECK ; else if (strcmp(args[0].from, "KEXEC_CMDLINE") = 0) entry->func = KEXEC_CMDLINE; + else if (strcmp(args[0].from, "KEYRING_CHECK") = 0) + entry->func = KEYRING_CHECK; else result = -EINVAL ;if (!result)
Re: [PATCH v5 01/10] IMA: Added KEYRING_CHECK func in IMA policy to measure keys
Quoted 9 lines · Mimi Zohar
Quoted 5 lines · Lakshmi Ramasubramanian
IMA policy needs to support a func to enable measurement of asymmetric keys.
This patch defines a new IMA policy func namely
KEYRING_CHECKto measure asymmetric keys.This new feature measures "keys" based on policy, not "keyrings".
Please change the name toKEY_CHECK.
Good point - I will change the func name to KEY_CHECK.
-lakshmi
PATCH v5 2/10 IMA: Added keyrings= option in IMA policy to only measure keys added to the specified keyrings.
In reply to Lakshmi RamasubramanianIMA policy needs to support measuring only those keys linked to a specific set of keyrings.
This patch defines a new IMA policy option namely "keyrings=" that can be used to specify a set of keyrings. If this option is specified in the policy for func=KEYRING_CHECK then only the keys linked to the keyrings given in "keyrings=" option are measured.
If "keyrings=" option is not specified for func=KEYRING_CHECK then all keys are measured.
--- Documentation/ABI/testing/ima_policy | 10 +++++++++- security/integrity/ima/ima_policy.c | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-)
Documentation/ABI/testing/ima_policy +9 -1
@@ -25,7 +25,7 @@ Description: lsm: [[subj_user=] [subj_role=] [subj_type=] [obj_user=] [obj_role=] [obj_type=]] option: [[appraise_type=]] [template=] [permit_directio] - [appraise_flag=] + [appraise_flag=] [keyrings=] base: func:= [BPRM_CHECK][MMAP_CHECK][CREDS_CHECK][FILE_CHECK][MODULE_CHECK] [FIRMWARE_CHECK] [KEXEC_KERNEL_CHECK] [KEXEC_INITRAMFS_CHECK]
@@ -43,6 +43,9 @@ Description: appraise_flag:= [check_blacklist] Currently, blacklist check is only for files signed with appended signature. + keyrings:= list of keyrings + (eg, .builtin_trusted_keys|.ima). Only valid + when action is "measure" and func is KEYRING_CHECK. template:= name of a defined IMA template type (eg, ima-ng). Only valid when action is "measure". pcr:= decimal value
@@ -119,3 +122,8 @@ Description: all keys: measure func=KEYRING_CHECK + + Example of measure rule using KEYRING_CHECK to only measure + keys added to .builtin_trusted_keys or .ima keyring: + + measure func=KEYRING_CHECK keyrings=.builtin_trusted_keys|.ima
security/integrity/ima/ima_policy.c +2 -0
@@ -34,6 +34,7 @@#define IMA_EUID 0x0080#define IMA_PCR 0x0100#define IMA_FSNAME 0x0200 +#define IMA_KEYRINGS 0x0400#define UNKNOWN 0#define MEASURE 0x0001/* same as IMA_MEASURE */
@@ -79,6 +80,7 @@ struct ima_rule_entry {int type;/* audit type */ } lsm[MAX_LSM_RULES ];char *fsname; +char *keyrings;/* Measure keys added to these keyrings */ struct ima_template_desc *template; };
Signature · 1 line
2.17.1
Mimi Zohar
maintainerRe: [PATCH v5 02/10] IMA: Added keyrings= option in IMA policy to only measure keys added to the specified keyrings.
The C maximum line length is 80 characters. The subject line is even less than that (~50). The Subject line here could be "ima: add support to limit measuring keys".
Quoted 2 lines · Lakshmi Ramasubramanian
IMA policy needs to support measuring only those keys linked to a specific set of keyrings.
Patch descriptions should be written in the imperative. For example, "Limit measuring keys to those keys being loaded onto a specific keyring."
Quoted 5 lines
This patch defines a new IMA policy option namely "keyrings=" that can be used to specify a set of keyrings. If this option is specified in the policy for func=KEYRING_CHECK then only the keys linked to the keyrings given in "keyrings=" option are measured.
This description does not seem to match the code, which for some reason isn't included in this patch, nor in 3/10. Please combine/squash patches 2 & 3. Missing from the combined patch is the keyring matching code in ima_match_rules().
Quoted 3 lines
If "keyrings=" option is not specified for func=KEYRING_CHECK then all keys are measured.
The last sentence is unnecessary. Please remove.
Quoted 59 lines
Signed-off-by Lakshmi Ramasubramanian <[email protected]>--- Documentation/ABI/testing/ima_policy | 10 +++++++++- security/integrity/ima/ima_policy.c | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-)Documentation/ABI/testing/ima_policy +9
-1@@ -25,7 +25,7 @@ Description: lsm: [[subj_user=] [subj_role=] [subj_type=] [obj_user=] [obj_role=] [obj_type=]] option: [[appraise_type=]] [template=] [permit_directio] - [appraise_flag=] + [appraise_flag=] [keyrings=] base: func:= [BPRM_CHECK][MMAP_CHECK][CREDS_CHECK][FILE_CHECK][MODULE_CHECK] [FIRMWARE_CHECK] [KEXEC_KERNEL_CHECK] [KEXEC_INITRAMFS_CHECK]@@ -43,6 +43,9 @@ Description: appraise_flag:= [check_blacklist] Currently, blacklist check is only for files signed with appended signature. + keyrings:= list of keyrings + (eg, .builtin_trusted_keys|.ima). Only valid + when action is "measure" and func is KEYRING_CHECK. template:= name of a defined IMA template type (eg, ima-ng). Only valid when action is "measure". pcr:= decimal value@@ -119,3 +122,8 @@ Description: all keys: measure func=KEYRING_CHECK + + Example of measure rule using KEYRING_CHECK to only measure + keys added to .builtin_trusted_keys or .ima keyring: + + measure func=KEYRING_CHECK keyrings=.builtin_trusted_keys|.imasecurity/integrity/ima/ima_policy.c +2
-0@@ -34,6 +34,7 @@#define IMA_EUID 0x0080#define IMA_PCR 0x0100#define IMA_FSNAME 0x0200 +#define IMA_KEYRINGS 0x0400#define UNKNOWN 0#define MEASURE 0x0001/* same as IMA_MEASURE */ @@ -79,6 +80,7 @@ struct ima_rule_entry {int type;/* audit type */ } lsm[MAX_LSM_RULES ];char *fsname; +char *keyrings;/* Measure keys added to these keyrings */ struct ima_template_desc *template; };
Re: [PATCH v5 02/10] IMA: Added keyrings= option in IMA policy to only measure keys added to the specified keyrings.
Quoted 3 lines · Mimi Zohar
The C maximum line length is 80 characters. The subject line is even less than that (~50). The Subject line here could be "ima: add support to limit measuring keys".
I'll update the subject line for the patches - limit to max 50 chars.
Quoted 8 lines · Lakshmi Ramasubramanian
Quoted 2 lines
IMA policy needs to support measuring only those keys linked to a specific set of keyrings.
Patch descriptions should be written in the imperative. For example, "Limit measuring keys to those keys being loaded onto a specific keyring."
Will update.
Quoted 11 lines
Quoted 6 lines
This patch defines a new IMA policy option namely "keyrings=" that can be used to specify a set of keyrings. If this option is specified in the policy for func=KEYRING_CHECK then only the keys linked to the keyrings given in "keyrings=" option are measured.
This description does not seem to match the code, which for some reason isn't included in this patch, nor in 3/10. Please combine/squash patches 2 & 3. Missing from the combined patch is the keyring matching code in
ima_match_rules().
This patch defines "keyrings=" option in the IMA policy and adds the related field in ima_rule_entry struct.
The code for updating the new field in ima_rule_entry is in patch #4
[PATCH v5 04/10] IMA: Updated IMA policy functions to return keyrings option read from the policy
I'll update the description for this patch (#2).
-lakshmi
Mimi Zohar
maintainerRe: [PATCH v5 02/10] IMA: Added keyrings= option in IMA policy to only measure keys added to the specified keyrings.
Quoted 29 lines · Lakshmi Ramasubramanian
Quoted 3 lines · Mimi Zohar
The C maximum line length is 80 characters. The subject line is even less than that (~50). The Subject line here could be "ima: add support to limit measuring keys".
I'll update the subject line for the patches - limit to max 50 chars.
Quoted 8 lines · Lakshmi Ramasubramanian
Quoted 2 lines
IMA policy needs to support measuring only those keys linked to a specific set of keyrings.
Patch descriptions should be written in the imperative. For example, "Limit measuring keys to those keys being loaded onto a specific keyring."
Will update.
Quoted 11 lines
Quoted 6 lines
This patch defines a new IMA policy option namely "keyrings=" that can be used to specify a set of keyrings. If this option is specified in the policy for func=KEYRING_CHECK then only the keys linked to the keyrings given in "keyrings=" option are measured.
This description does not seem to match the code, which for some reason isn't included in this patch, nor in 3/10. Please combine/squash patches 2 & 3. Missing from the combined patch is the keyring matching code in
ima_match_rules().
Quoted 6 lines
This patch defines "keyrings=" option in the IMA policy and adds the related field in
ima_rule_entrystruct.The code for updating the new field in
ima_rule_entryis in patch #4 [PATCH v5 04/10] IMA: Updated IMA policy functions to return keyrings option read from the policy
That's the problem. The keyrings doesn't need to be returned, but processed in ima_match_rules().
Mimi
PATCH v5 3/10 IMA: Read keyrings= option from the IMA policy into ima_rule_entry
In reply to Lakshmi Ramasubramanian"keyrings=" option, if specified in the IMA policy, needs to be stored in the list of IMA rules when the configured IMA policy is read.
This patch defines a new policy token enum namely Opt_keyrings for reading "keyrings=" option from the IMA policy.
--- security/integrity/ima/ima_policy.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-)
security/integrity/ima/ima_policy.c +27 -1
@@ -768,7 +768,8 @@ enum { Opt_uid_gt, Opt_euid_gt, Opt_fowner_gt, Opt_uid_lt, Opt_euid_lt, Opt_fowner_lt, Opt_appraise_type, Opt_appraise_flag, - Opt_permit_directio, Opt_pcr, Opt_template, Opt_err + Opt_permit_directio, Opt_pcr, Opt_template, Opt_keyrings, + Opt_err }; static const match_table_t policy_tokens = {
@@ -804,6 +805,7 @@ static const match_table_t policy_tokens = { {Opt_permit_directio, "permit_directio"}, {Opt_pcr, "pcr=%s"}, {Opt_template, "template=%s"}, + {Opt_keyrings, "keyrings=%s"}, {Opt_err, NULL} };
@@ -1053,6 +1055,23 @@ static int ima_parse_rule(char *rule, struct ima_rule_entry *entry) result =0 ; entry->flags |=IMA_FSNAME ;break ; +case Opt_keyrings: +ima_log_string (ab,"keyrings" , args[0 ].from); + +if ((entry->keyrings) || + (entry->action !=MEASURE ) || + (entry->func !=KEYRING_CHECK )) { + result = -EINVAL ; +break ; + } + entry->keyrings =kstrdup (args[0 ].from,GFP_KERNEL ); +if (!entry->keyrings) { + result = -ENOMEM ; +break ; + } + result =0 ; + entry->flags |=IMA_KEYRINGS ; +break ;case Opt_fsuuid:ima_log_string (ab,"fsuuid" , args[0 ].from);
@@ -1428,6 +1447,13 @@ int ima_policy_show(struct seq_file *m, void *v)seq_puts (m," " ); } +if (entry->flags &IMA_KEYRINGS ) { +if (entry->keyrings !=NULL ) +snprintf (tbuf,sizeof (tbuf),"%s" , entry->keyrings); +seq_printf (m,pt (Opt_keyrings), tbuf); +seq_puts (m," " ); + } +if (entry->flags &IMA_PCR ) {snprintf (tbuf,sizeof (tbuf),"%d" , entry->pcr);seq_printf (m,pt (Opt_pcr), tbuf);
Signature · 1 line
2.17.1
PATCH v5 4/10 IMA: Updated IMA policy functions to return keyrings option read from the policy
In reply to Lakshmi Ramasubramaniankeyrings option read from the IMA policy needs to be provided to the callers that determine the action to be performed.
This patch updates ima_get_action() and ima_match_policy() functions to return the keyrings option specified in the IMA policy.
--- security/integrity/ima/ima.h | 6 ++++-- security/integrity/ima/ima_api.c | 8 +++++--- security/integrity/ima/ima_appraise.c | 2 +- security/integrity/ima/ima_main.c | 5 +++-- security/integrity/ima/ima_policy.c | 7 ++++++- 5 files changed, 19 insertions(+), 9 deletions(-)
security/integrity/ima/ima.h +4 -2
@@ -208,7 +208,8 @@ struct modsig;/* LIM API function definitions */ int ima_get_action (struct inode *inode,const struct cred *cred,u32 secid,int mask,enum ima_hooks func,int *pcr, -struct ima_template_desc **template_desc); +struct ima_template_desc **template_desc, +char **keyrings);int ima_must_measure (struct inode *inode,int mask,enum ima_hooks func); int ima_collect_measurement(struct integrity_iint_cache *iint, struct file *file, void *buf, loff_t size,
@@ -235,7 +236,8 @@ const char *ima_d_path(const struct path *path, char **pathbuf, char *filename);/* IMA policy related functions */ int ima_match_policy (struct inode *inode,const struct cred *cred,u32 secid,enum ima_hooks func,int mask,int flags,int *pcr, -struct ima_template_desc **template_desc); +struct ima_template_desc **template_desc, +char **keyrings);void ima_init_policy (void );void ima_update_policy (void );void ima_update_policy_flag (void );
security/integrity/ima/ima_api.c +4 -3
@@ -169,12 +169,13 @@ void ima_add_violation(struct file *file, const unsigned char *filename,* @func: caller identifier * @pcr: pointer filled in if matched measure policy sets pcr * @template_desc: pointer filled in if matched measure policy sets template+ * @keyrings: pointer filled in if matched measure policy sets keyrings * * The policy is defined in terms of keypairs: * subj=, obj=, type=, func=, mask=, fsmagic * subj,obj, and type: are LSM specific. * func: FILE_CHECK | BPRM_CHECK | CREDS_CHECK | MMAP_CHECK | MODULE_CHECK -* | KEXEC_CMDLINE +* | KEXEC_CMDLINE | KEYRING_CHECK * mask: contains the permission mask * fsmagic: hex value *
@@ -183,14 +184,15 @@ void ima_add_violation(struct file *file, const unsigned char *filename,*/ int ima_get_action (struct inode *inode,const struct cred *cred,u32 secid,int mask,enum ima_hooks func,int *pcr, -struct ima_template_desc **template_desc) +struct ima_template_desc **template_desc, +char **keyrings) {int flags =IMA_MEASURE |IMA_AUDIT |IMA_APPRAISE |IMA_HASH ; flags &= ima_policy_flag;return ima_match_policy (inode, cred, secid, func, mask, flags, pcr, - template_desc); + template_desc, keyrings); }/*
security/integrity/ima/ima_appraise.c +1 -1
@@ -55,7 +55,7 @@ int ima_must_appraise(struct inode *inode, int mask, enum ima_hooks func)security_task_getsecid (current, &secid);return ima_match_policy (inode,current_cred (), secid, func, mask, -IMA_APPRAISE |IMA_HASH ,NULL ,NULL ); +IMA_APPRAISE |IMA_HASH ,NULL ,NULL ,NULL ); } static int ima_fix_xattr(struct dentry *dentry,
security/integrity/ima/ima_main.c +3 -2
@@ -215,7 +215,7 @@ static int process_measurement(struct file *file, const struct cred *cred,* Included is the appraise submask. */ action =ima_get_action (inode, cred, secid, mask, func, &pcr, - &template_desc); + &template_desc,NULL ); violation_check = ((func =FILE_CHECK || func =MMAP_CHECK ) && (ima_policy_flag &IMA_MEASURE ));if (!action && !violation_check)
@@ -647,6 +647,7 @@ void process_buffer_measurement(const void *buf, int size, .buf = buf, .buf_len = size};struct ima_template_desc *template =NULL ; +char *keyrings =NULL ;struct {struct ima_digest_data hdr;char digest[IMA_MAX_DIGEST_SIZE ];
@@ -665,7 +666,7 @@ void process_buffer_measurement(const void *buf, int size,if (func) {security_task_getsecid (current, &secid); action =ima_get_action (NULL ,current_cred (), secid,0 , func, - &pcr, &template); + &pcr, &template, &keyrings);if (!(action &IMA_MEASURE ))return ; }
security/integrity/ima/ima_policy.c +6 -1
@@ -481,6 +481,7 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func)* @mask: requested action (MAY_READ | MAY_WRITE | MAY_APPEND | MAY_EXEC) * @pcr: set the pcr to extend * @template_desc: the template that should be used for this rule +* @keyrings: set the keyrings for this rule, if specified * * Measure decision based on func/mask/fsmagic and LSM(subj/obj/type) * conditions.
@@ -491,7 +492,8 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func)*/ int ima_match_policy (struct inode *inode,const struct cred *cred,u32 secid,enum ima_hooks func,int mask,int flags,int *pcr, -struct ima_template_desc **template_desc) +struct ima_template_desc **template_desc, +char **keyrings) {struct ima_rule_entry *entry;int action =0 , actmask = flags | (flags <<1 );
@@ -527,6 +529,9 @@ int ima_match_policy(struct inode *inode, const struct cred *cred, u32 secid,if ((pcr) && (entry->flags &IMA_PCR )) *pcr = entry->pcr; +if ((keyrings) && (entry->flags &IMA_KEYRINGS )) + *keyrings = entry->keyrings; +if (template_desc && entry->template) *template_desc = entry->template;
Signature · 1 line
2.17.1
Mimi Zohar
maintainerRe: [PATCH v5 04/10] IMA: Updated IMA policy functions to return keyrings option read from the policy
Quoted 23 lines · Lakshmi Ramasubramanian
security/integrity/ima/ima_policy.c +3
-1@@ -481,6 +481,7 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func)* @mask: requested action (MAY_READ | MAY_WRITE | MAY_APPEND | MAY_EXEC) * @pcr: set the pcr to extend * @template_desc: the template that should be used for this rule +* @keyrings: set the keyrings for this rule, if specified * * Measure decision based on func/mask/fsmagic and LSM(subj/obj/type) * conditions. @@ -491,7 +492,8 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func)*/ int ima_match_policy (struct inode *inode,const struct cred *cred,u32 secid,enum ima_hooks func,int mask,int flags,int *pcr, -struct ima_template_desc **template_desc) +struct ima_template_desc **template_desc, +char **keyrings) {struct ima_rule_entry *entry;int action =0 , actmask = flags | (flags <<1 );
security/integrity/ima/ima_policy.c int ima_match_policy(struct inode *inode, const struct cred *cred, u32 secid, · line 533
Quoted 5 lines
security/integrity/ima/ima_policy.c +2
-0@@ -527,6 +529,9 @@ int ima_match_policy(struct inode *inode, const struct cred *cred, u32 secid,if ((pcr) && (entry->flags &IMA_PCR )) *pcr = entry->pcr; +if ((keyrings) && (entry->flags &IMA_KEYRINGS )) + *keyrings = entry->keyrings;
ima_match_rules() determines whether the rule is in policy or not. It returns true on rule match, false on failure. There's no need to return the list of keyrings.
Mimi
Quoted 4 lines
security/integrity/ima/ima_policy.c +1
-0+if (template_desc && entry->template) *template_desc = entry->template;
Re: [PATCH v5 04/10] IMA: Updated IMA policy functions to return keyrings option read from the policy
Quoted 12 lines · Mimi Zohar
Quoted 12 lines
int ima_match_policy(struct inode *inode, const struct cred *cred, u32 secid,
enumima_hooksfunc, int mask, int flags, int *pcr,security/integrity/ima/ima_policy.c +2
-1- struct ima_template_desc **template_desc) +struct ima_template_desc **template_desc, + char **keyrings) { struct ima_rule_entry *entry;int action =0 , actmask = flags | (flags <<1 );@@ -527,6 +529,9 @@ int ima_match_policy(struct inode *inode, const struct cred *cred, u32 secid,if ((pcr) && (entry->flags &IMA_PCR )) *pcr = entry->pcr;
Quoted 6 lines
security/integrity/ima/ima_policy.c int ima_match_policy(struct inode *inode, const struct cred *cred, u32 secid, · line 533
Quoted 2 lines
security/integrity/ima/ima_policy.c +2
-0+if ((keyrings) && (entry->flags &IMA_KEYRINGS )) + *keyrings = entry->keyrings;
ima_match_rules()determines whether the rule is in policy or not. It returns true on rule match, false on failure. There's no need to return the list of keyrings.
But the above code change is in ima_match_policy() - not in ima_match_rules() function.
ima_match_rules() function is updated in Patch #1 -
[PATCH v5 01/10] IMA: Added KEYRING_CHECK func in IMA policy to measure keys
I've updated that function to check if func is "KEYRING_CHECK" and return true\false as appropriate.
Am I missing something?
-lakshmi
Mimi Zohar
maintainerRe: [PATCH v5 04/10] IMA: Updated IMA policy functions to return keyrings option read from the policy
Quoted 24 lines · Lakshmi Ramasubramanian
Quoted 12 lines · Mimi Zohar
Quoted 12 lines
int ima_match_policy(struct inode *inode, const struct cred *cred, u32 secid,
enumima_hooksfunc, int mask, int flags, int *pcr,security/integrity/ima/ima_policy.c +2
-1- struct ima_template_desc **template_desc) +struct ima_template_desc **template_desc, + char **keyrings) { struct ima_rule_entry *entry;int action =0 , actmask = flags | (flags <<1 );@@ -527,6 +529,9 @@ int ima_match_policy(struct inode *inode, const struct cred *cred, u32 secid,if ((pcr) && (entry->flags &IMA_PCR )) *pcr = entry->pcr;Quoted 6 lines
security/integrity/ima/ima_policy.c int ima_match_policy(struct inode *inode, const struct cred *cred, u32 secid, · line 533
Quoted 2 lines
security/integrity/ima/ima_policy.c +2
-0+if ((keyrings) && (entry->flags &IMA_KEYRINGS )) + *keyrings = entry->keyrings;
ima_match_rules()determines whether the rule is in policy or not. It returns true on rule match, false on failure. There's no need to return the list of keyrings.But the above code change is in
ima_match_policy()- not inima_match_rules()function.
Quoted 7 lines
ima_match_rules()function is updated in Patch #1 -
[PATCH v5 01/10] IMA: AddedKEYRING_CHECKfunc in IMA policy to measure keysI've updated that function to check if func is "
KEYRING_CHECK" and return true\false as appropriate.Am I missing something?
The first patch adds basic support for the new "func". This allows measuring all keys. ima_match_rules() then needs to be updated in the patch that adds the "keyrings=" or "keyring=" support to limit it to a specific keyring.
Mimi
PATCH v5 5/10 IMA: Measure key if the IMA policy allows measurement for the keyring to which the key is linked to
In reply to Lakshmi Ramasubramanianprocess_buffer_measurement() needs to check if the keyring to which the given key is linked to is listed in the keyrings option in the IMA policy.
This patch adds a new parameter "keyring" to process_buffer_measurement().
If process_buffer_measurement() is called with func KEYRING_CHECK and the name of the keyring to which the key is linked to, then the given key is measured if:
1, IMA policy did not specify "keyrings=" option.
2, Or, the given keyring name is listed in the "keyrings=" option.
--- security/integrity/ima/ima.h | 2 +- security/integrity/ima/ima_appraise.c | 2 +- security/integrity/ima/ima_main.c | 26 ++++++++++++++++++++++++-- 3 files changed, 26 insertions(+), 4 deletions(-)
security/integrity/ima/ima.h +1 -1
@@ -221,7 +221,7 @@ void ima_store_measurement(struct integrity_iint_cache *iint, struct file *file, struct ima_template_desc *template_desc);void process_buffer_measurement (const void *buf,int size,const char *eventname,enum ima_hooks func, -int pcr); +int pcr,const char *keyring);void ima_audit_measurement (struct integrity_iint_cache *iint,const unsigned char *filename); int ima_alloc_init_template(struct ima_event_data *event_data,
security/integrity/ima/ima_appraise.c +1 -1
@@ -330,7 +330,7 @@ int ima_check_blacklist(struct integrity_iint_cache *iint,if ((rc = -EPERM ) && (iint->flags &IMA_MEASURE ))process_buffer_measurement (digest, digestsize,"blacklisted-hash" ,NONE , - pcr); + pcr,NULL ); }return rc;
security/integrity/ima/ima_main.c +24 -2
@@ -632,12 +632,22 @@ int ima_load_data(enum kernel_load_data_id id)* @eventname: event name to be used for the buffer entry. * @func: IMA hook * @pcr: pcr to extend the measurement +* @keyring: keyring for the measurement +* +* The following scenarios are possible with respect to +* the parameter "keyring": +* 1, keyring is NULL. In this case buffer is measured. +* 2, keyring is not NULL, but ima_get_action returned +* a NULL keyrings. In this case also the buffer is measured. +* 3, keyring is not NULL and ima_get_action returned +* a non-NULL keyrings. In this case measure the buffer +* only if the given keyring is present in the keyrings. * * Based on policy, the buffer is measured into the ima log. */ void process_buffer_measurement (const void *buf,int size,const char *eventname,enum ima_hooks func, -int pcr) +int pcr,const char *keyring) {int ret =0 ;struct ima_template_entry *entry =NULL ;
@@ -656,6 +666,13 @@ void process_buffer_measurement(const void *buf, int size,int action =0 ;u32 secid; +/* +* If IMA is not yet initialized or IMA policy is empty +* then there is no need to measure. +*/ +if (!ima_policy_flag) +return ; +/* * Both LSM hooks and auxilary based buffer measurements are * based on policy. To avoid code duplication, differentiate
@@ -671,6 +688,11 @@ void process_buffer_measurement(const void *buf, int size,return ; } +if ((keyring !=NULL ) && (keyrings !=NULL ) + && (strstr (keyrings, keyring) =NULL )) { +return ; + } +if (!pcr) pcr =CONFIG_IMA_MEASURE_PCR_IDX ;
@@ -719,7 +741,7 @@ void ima_kexec_cmdline(const void *buf, int size) {if (buf && size !=0 )process_buffer_measurement (buf, size,"kexec-cmdline" , -KEXEC_CMDLINE ,0 ); +KEXEC_CMDLINE ,0 ,NULL ); }static int __init init_ima (void )
Signature · 1 line
2.17.1
PATCH v5 6/10 IMA: Defined an IMA hook to measure keys on key create or update
In reply to Lakshmi RamasubramanianAsymmetric keys used for verifying file signatures or certificates are currently not included in the IMA measurement list.
This patch defines a new IMA hook namely ima_post_key_create_or_update() to measure asymmetric keys.
The IMA hook is defined in a new file namely ima_asymmetric_keys.c
Note that currently IMA subsystem can be enabled without enabling KEYS subsystem.
Adding support for measuring asymmetric keys in IMA requires KEYS subsystem to be enabled. To handle this dependency a new config namely CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS has been added. Enabling this config requires the following configs to be enabled:
CONFIG_IMA, CONFIG_KEYS, CONFIG_ASYMMETRIC_KEY_TYPE, and CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE.
The new file ima_asymmetric_keys.c is built only if CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS is enabled.
This config is turned off by default.
--- security/integrity/ima/Kconfig | 14 +++++++ security/integrity/ima/Makefile | 1 + security/integrity/ima/ima_asymmetric_keys.c | 44 ++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 security/integrity/ima/ima_asymmetric_keys.c
security/integrity/ima/Kconfig +14 -0
@@ -310,3 +310,17 @@ config IMA_APPRAISE_SIGNED_INIT default n help This option requires user-space init to be signed. + +config IMA_MEASURE_ASYMMETRIC_KEYS + bool "Enable measuring asymmetric keys on key create or update" + depends on IMA + depends on KEYS + depends on ASYMMETRIC_KEY_TYPE + depends on ASYMMETRIC_PUBLIC_KEY_SUBTYPE + default n + help + This option enables measuring asymmetric keys when + the key is created or updated. Additionally, IMA policy + needs to be configured to either measure keys linked to + any keyring or only measure keys linked to the keyrings + specified in the IMA policy through the keyrings= option.
security/integrity/ima/Makefile +1 -0
@@ -12,3 +12,4 @@ ima-$(CONFIG_IMA_APPRAISE) += ima_appraise.o ima-$(CONFIG_IMA_APPRAISE_MODSIG) += ima_modsig.o ima-$(CONFIG_HAVE_IMA_KEXEC) += ima_kexec.o obj-$(CONFIG_IMA_BLACKLIST_KEYRING) += ima_mok.o +obj-$(CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS) += ima_asymmetric_keys.o
security/integrity/ima/ima_asymmetric_keys.c new file +44 -0
44 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v5 7/10 KEYS: Call the IMA hook to measure key when a new key is created or an existing key is updated
In reply to Lakshmi Ramasubramaniankey_create_or_update function needs to call the IMA hook to measure the key when a new key is created or an existing key is updated.
This patch adds the call to the IMA hook from key_create_or_update function.
--- include/linux/ima.h | 13 +++++++++++++ security/keys/key.c | 9 +++++++++ 2 files changed, 22 insertions(+)
include/linux/ima.h +13 -0
@@ -25,6 +25,12 @@ extern int ima_post_read_file(struct file *file, void *buf, loff_t size,extern void ima_post_path_mknod (struct dentry *dentry);extern void ima_kexec_cmdline (const void *buf,int size); +#ifdef CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS +extern void ima_post_key_create_or_update (struct key *keyring, +struct key *key, +unsigned long flags,bool create); +#endif +#ifdef CONFIG_IMA_KEXEC extern void ima_add_kexec_buffer (struct kimage *image);#endif
@@ -101,6 +107,13 @@ static inline void ima_add_kexec_buffer(struct kimage *image) {}#endif +#ifndef CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS +static inline void ima_post_key_create_or_update (struct key *keyring, +struct key *key, +unsigned long flags, +bool create) {} +#endif +#ifdef CONFIG_IMA_APPRAISE extern bool is_ima_appraise_enabled (void );extern void ima_inode_post_setattr (struct dentry *dentry);
security/keys/key.c +9 -0
@@ -13,6 +13,7 @@#include <linux/security.h> #include <linux/workqueue.h> #include <linux/random.h> +#include <linux/ima.h> #include <linux/err.h> #include "internal.h"
@@ -936,6 +937,9 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref, goto error_link_end; } +/* let the ima module know about the created key. */ +ima_post_key_create_or_update (keyring, key, flags, true); + key_ref =make_key_ref (key,is_key_possessed (keyring_ref)); error_link_end:
@@ -965,6 +969,11 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref, } key_ref =__key_update (key_ref, &prep); + +/* let the ima module know about the updated key. */ +if (!IS_ERR (key_ref)) +ima_post_key_create_or_update (keyring, key, flags, false); + goto error_free_prep; }EXPORT_SYMBOL (key_create_or_update);
Signature · 1 line
2.17.1
PATCH v5 8/10 IMA: Added a flag to determine whether IMA hook can process the key now or has to queue for processing later
In reply to Lakshmi RamasubramanianKeys should be processed only if custom IMA policies have been applied. Prior to that the keys should be queued for processing later.
This patch defines a flag namely ima_process_keys_for_measurement to check if the key should be processed immediately or should be queued.
ima_policy_flag cannot be relied upon because ima_policy_flag will be set to 0 when either IMA is not initialized or the IMA policy itself is empty.
--- security/integrity/ima/ima_asymmetric_keys.c | 2 ++ 1 file changed, 2 insertions(+)
security/integrity/ima/ima_asymmetric_keys.c +2 -0
@@ -15,6 +15,8 @@#include <keys/asymmetric-type.h> #include "ima.h" +bool ima_process_keys_for_measurement; +/** * ima_post_key_create_or_update - measure asymmetric keys * @keyring: keyring to which the key is linked to
Signature · 1 line
2.17.1
PATCH v5 9/10 IMA: Defined functions to queue and dequeue keys for measurement
In reply to Lakshmi RamasubramanianA key can be measured right away only if custom IMA policies have been applied. Otherwise, the key should be queued up and processed when custom IMA policies have been applied.
This patch defines functions to queue and dequeue keys for measurement.
--- security/integrity/ima/ima.h | 23 ++++ security/integrity/ima/ima_asymmetric_keys.c | 128 +++++++++++++++++++ 2 files changed, 151 insertions(+)
security/integrity/ima/ima.h +23 -0
@@ -205,6 +205,29 @@ extern const char *const func_tokens[];struct modsig ; +#ifdef CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS +/* +* To track keys that need to be measured. +*/ +struct ima_measure_key_entry { +struct list_head list; +void *public_key; +u32 public_key_len; +char *keyring_name; +}; + +bool ima_queue_key_for_measurement (struct key *keyring, +struct key *key); +void ima_process_queued_keys_for_measurement (void ); +#else +static inline bool ima_queue_key_for_measurement (struct key *keyring, +struct key *key) +{ +return false; +} +static inline void ima_process_queued_keys_for_measurement (void ) {} +#endif /* CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS */ +/* LIM API function definitions */ int ima_get_action(struct inode *inode, const struct cred *cred, u32 secid, int mask, enum ima_hooks func, int *pcr,
security/integrity/ima/ima_asymmetric_keys.c +127 -0
139 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v5 10/10 IMA: Call queue and dequeue functions to measure keys.
In reply to Lakshmi RamasubramanianKeys should be queued for measurement if custom IMA policies have not been applied. Keys queued for measurement, if any, need to be processed when custom IMA policies have been applied.
This patch adds the call to ima_queue_key_for_measurement in the IMA hook function and the call to ima_process_queued_keys_for_measurement when custom IMA policies have been applied.
NOTE:
If the kernel is built with CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS then the IMA policy for measuring keys should be applied as part of custom IMA policies. Keys will be queued up until custom policies are applied and processed when applied.
--- security/integrity/ima/ima_asymmetric_keys.c | 31 ++++++++++++++++++-- security/integrity/ima/ima_policy.c | 12 ++++++++ 2 files changed, 41 insertions(+), 2 deletions(-)
security/integrity/ima/ima_asymmetric_keys.c +29 -2
@@ -158,15 +158,42 @@ void ima_post_key_create_or_update(struct key *keyring, struct key *key, unsigned long flags, bool create) {const struct public_key *pk; +bool key_queued = false; -/* Only asymmetric keys are handled */ +/* Only asymmetric keys are handled by this hook. */ if (key->type != &key_type_asymmetric)return ; +if (!ima_process_keys_for_measurement) + key_queued =ima_queue_key_for_measurement (keyring, key); +/* -* Get the public_key of the given asymmetric key to measure. +* Need to check again if the key was queued or not because +* ima_process_keys_for_measurement could have flipped from +* false to true after it was checked above, but before the key +* could be queued by ima_queue_key_for_measurement(). */ +if (key_queued) +return ; + +/* Public key of the given asymmetric key is measured. */ pk = key->payload.data[asym_crypto]; + +/* +* keyring->description points to the name of the keyring +* (such as ".builtin_trusted_keys", ".ima", etc.) to +* which the given key is linked to. +* +* The name of the keyring is passed in the "eventname" +* parameter to process_buffer_measurement() and is set +* in the "eventname" field in ima_event_data for +* the key measurement IMA event. +* +* The name of the keyring is also passed in the "keyring" +* parameter to process_buffer_measurement() to check +* if the IMA policy is configured to measure a key linked +* to the given keyring. +*/ process_buffer_measurement(pk->key, pk->keylen, keyring->description, KEYRING_CHECK, 0,
security/integrity/ima/ima_policy.c +12 -0
@@ -759,6 +759,18 @@ void ima_update_policy(void)kfree (arch_policy_entry); }ima_update_policy_flag (); + +/* +* Custom IMA policies have been setup. +* Process key(s) queued up for measurement now. +* +* NOTE: +* Custom IMA policies always overwrite builtin policies +* (policies compiled in code). If one wants measurement +* of asymmetric keys then it has to be configured in +* custom policies and updated here. +*/ +ima_process_queued_keys_for_measurement (); }/* Keep the enumeration in sync with the policy_tokens! */
Signature · 1 line
2.17.1
On 11/11/2019 11:32 AM, Lakshmi Ramasubramanian wrote:
Hi Mimi,
Quoted 10 lines
Problem Statement:
Keys created or updated in the system are currently not being measured.
This change aims to address measuring keys created or updated in the system:
=> Patches #1 through #5 update IMA policy functions to handle
measurement of keys based on configured IMA policy.
Quoted 8 lines
=> Patches #6 and #7 add IMA hook for measuring keys and the call
to the IMA hook fromkey_create_or_updatefunction. Keys are processed immediately - no support for deferred processing.=> Patches #8 through #10 add support for queuing keys if
custom IMA policies have not been applied yet and process the queued keys when custom IMA policies are applied.
I was wondering if it'd be better to split this patch set into two sets:
1st set including the patches for measuring keys without queuing support (Patches #1 through #7)
2nd set including the patches that add queuing support (Patches #8 through #10).
thanks,
-lakshmi
Mimi Zohar
maintainerQuoted 5 lines · Lakshmi Ramasubramanian
On 11/11/2019 11:32 AM, Lakshmi Ramasubramanian wrote:
Hi Mimi,
Quoted 1 line
Problem Statement:
The above line isn't needed.
Quoted 14 lines
Quoted 14 lines
Keys created or updated in the system are currently not being measured.
This change aims to address measuring keys created or updated in the system:
=> Patches #1 through #5 update IMA policy functions to handle
measurement of keys based on configured IMA policy.=> Patches #6 and #7 add IMA hook for measuring keys and the call
to the IMA hook fromkey_create_or_updatefunction. Keys are processed immediately - no support for deferred processing.
Quoted 8 lines
Quoted 3 lines
=> Patches #8 through #10 add support for queuing keys if
custom IMA policies have not been applied yet and process the queued keys when custom IMA policies are applied.I was wondering if it'd be better to split this patch set into two sets:
1st set including the patches for measuring keys without queuing support (Patches #1 through #7)
I've commented on patches 1 - 4. There's still so much wrong with this patch set. Limiting the scope of the patch set sounds like really a good idea.
Mimi
Quoted 3 lines
2nd set including the patches that add queuing support (Patches #8 through #10).
Quoted 8 lines · Mimi Zohar
Quoted 5 lines · Lakshmi Ramasubramanian
On 11/11/2019 11:32 AM, Lakshmi Ramasubramanian wrote:
Hi Mimi,
Quoted 1 line
Problem Statement:
The above line isn't needed.
Will update.
Quoted 5 lines
I've commented on patches 1 - 4. There's still so much wrong with this patch set. Limiting the scope of the patch set sounds like really a good idea.
Mimi
I'll address your comments and send an update - I'll split this into 2 patch sets.
thanks,
-lakshmi