Skip to content

Commit db2045f

Browse files
tyhicksmimizohar
authored andcommitted
ima: Fail rule parsing when the KEXEC_CMDLINE hook is combined with an invalid cond
The KEXEC_CMDLINE hook function only supports the pcr conditional. Make this clear at policy load so that IMA policy authors don't assume that other conditionals are supported. Since KEXEC_CMDLINE's inception, ima_match_rules() has always returned true on any loaded KEXEC_CMDLINE rule without any consideration for other conditionals present in the rule. Make it clear that pcr is the only supported KEXEC_CMDLINE conditional by returning an error during policy load. An example of why this is a problem can be explained with the following rule: dont_measure func=KEXEC_CMDLINE obj_type=foo_t An IMA policy author would have assumed that rule is valid because the parser accepted it but the result was that measurements for all KEXEC_CMDLINE operations would be disabled. Fixes: b093512 ("IMA: Define a new hook to measure the kexec boot command line arguments") Signed-off-by: Tyler Hicks <[email protected]> Reviewed-by: Mimi Zohar <[email protected]> Reviewed-by: Lakshmi Ramasubramanian <[email protected]> Signed-off-by: Mimi Zohar <[email protected]>
1 parent 7121834 commit db2045f

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

security/integrity/ima/ima_policy.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,17 @@ static int ima_lsm_update_rule(struct ima_rule_entry *entry)
343343
return 0;
344344
}
345345

346+
static bool ima_rule_contains_lsm_cond(struct ima_rule_entry *entry)
347+
{
348+
int i;
349+
350+
for (i = 0; i < MAX_LSM_RULES; i++)
351+
if (entry->lsm[i].args_p)
352+
return true;
353+
354+
return false;
355+
}
356+
346357
/*
347358
* The LSM policy can be reloaded, leaving the IMA LSM based rules referring
348359
* to the old, stale LSM policy. Update the IMA LSM based rules to reflect
@@ -998,6 +1009,16 @@ static bool ima_validate_rule(struct ima_rule_entry *entry)
9981009
/* Validation of these hook functions is in ima_parse_rule() */
9991010
break;
10001011
case KEXEC_CMDLINE:
1012+
if (entry->action & ~(MEASURE | DONT_MEASURE))
1013+
return false;
1014+
1015+
if (entry->flags & ~(IMA_FUNC | IMA_PCR))
1016+
return false;
1017+
1018+
if (ima_rule_contains_lsm_cond(entry))
1019+
return false;
1020+
1021+
break;
10011022
case KEY_CHECK:
10021023
if (entry->action & ~(MEASURE | DONT_MEASURE))
10031024
return false;

0 commit comments

Comments
 (0)