Skip to content

Commit 503ceae

Browse files
author
Mimi Zohar
committed
ima: define a set of appraisal rules requiring file signatures
The builtin "ima_appraise_tcb" policy should require file signatures for at least a few of the hooks (eg. kernel modules, firmware, and the kexec kernel image), but changing it would break the existing userspace/kernel ABI. This patch defines a new builtin policy named "secure_boot", which can be specified on the "ima_policy=" boot command line, independently or in conjunction with the "ima_appraise_tcb" policy, by specifing ima_policy="appraise_tcb | secure_boot". The new appraisal rules requiring file signatures will be added prior to the "ima_appraise_tcb" rules. Signed-off-by: Mimi Zohar <[email protected]> Changelog: - Reference secure boot in the new builtin policy name. (Thiago Bauermann)
1 parent 33ce954 commit 503ceae

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

Documentation/admin-guide/kernel-parameters.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1478,7 +1478,7 @@
14781478

14791479
ima_policy= [IMA]
14801480
The builtin policies to load during IMA setup.
1481-
Format: "tcb | appraise_tcb"
1481+
Format: "tcb | appraise_tcb | secure_boot"
14821482

14831483
The "tcb" policy measures all programs exec'd, files
14841484
mmap'd for exec, and all files opened with the read
@@ -1489,6 +1489,10 @@
14891489
all files owned by root. (This is the equivalent
14901490
of ima_appraise_tcb.)
14911491

1492+
The "secure_boot" policy appraises the integrity
1493+
of files (eg. kexec kernel image, kernel modules,
1494+
firmware, policy, etc) based on file signatures.
1495+
14921496
ima_tcb [IMA] Deprecated. Use ima_policy= instead.
14931497
Load a policy which meets the needs of the Trusted
14941498
Computing Base. This means IMA will measure all

security/integrity/ima/ima_policy.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,17 @@ static struct ima_rule_entry default_appraise_rules[] __ro_after_init = {
153153
#endif
154154
};
155155

156+
static struct ima_rule_entry secure_boot_rules[] __ro_after_init = {
157+
{.action = APPRAISE, .func = MODULE_CHECK,
158+
.flags = IMA_FUNC | IMA_DIGSIG_REQUIRED},
159+
{.action = APPRAISE, .func = FIRMWARE_CHECK,
160+
.flags = IMA_FUNC | IMA_DIGSIG_REQUIRED},
161+
{.action = APPRAISE, .func = KEXEC_KERNEL_CHECK,
162+
.flags = IMA_FUNC | IMA_DIGSIG_REQUIRED},
163+
{.action = APPRAISE, .func = POLICY_CHECK,
164+
.flags = IMA_FUNC | IMA_DIGSIG_REQUIRED},
165+
};
166+
156167
static LIST_HEAD(ima_default_rules);
157168
static LIST_HEAD(ima_policy_rules);
158169
static LIST_HEAD(ima_temp_rules);
@@ -171,6 +182,7 @@ static int __init default_measure_policy_setup(char *str)
171182
__setup("ima_tcb", default_measure_policy_setup);
172183

173184
static bool ima_use_appraise_tcb __initdata;
185+
static bool ima_use_secure_boot __initdata;
174186
static int __init policy_setup(char *str)
175187
{
176188
char *p;
@@ -182,6 +194,8 @@ static int __init policy_setup(char *str)
182194
ima_policy = DEFAULT_TCB;
183195
else if (strcmp(p, "appraise_tcb") == 0)
184196
ima_use_appraise_tcb = 1;
197+
else if (strcmp(p, "secure_boot") == 0)
198+
ima_use_secure_boot = 1;
185199
}
186200

187201
return 1;
@@ -410,12 +424,14 @@ void ima_update_policy_flag(void)
410424
*/
411425
void __init ima_init_policy(void)
412426
{
413-
int i, measure_entries, appraise_entries;
427+
int i, measure_entries, appraise_entries, secure_boot_entries;
414428

415429
/* if !ima_policy set entries = 0 so we load NO default rules */
416430
measure_entries = ima_policy ? ARRAY_SIZE(dont_measure_rules) : 0;
417431
appraise_entries = ima_use_appraise_tcb ?
418432
ARRAY_SIZE(default_appraise_rules) : 0;
433+
secure_boot_entries = ima_use_secure_boot ?
434+
ARRAY_SIZE(secure_boot_rules) : 0;
419435

420436
for (i = 0; i < measure_entries; i++)
421437
list_add_tail(&dont_measure_rules[i].list, &ima_default_rules);
@@ -434,6 +450,14 @@ void __init ima_init_policy(void)
434450
break;
435451
}
436452

453+
/*
454+
* Insert the appraise rules requiring file signatures, prior to
455+
* any other appraise rules.
456+
*/
457+
for (i = 0; i < secure_boot_entries; i++)
458+
list_add_tail(&secure_boot_rules[i].list,
459+
&ima_default_rules);
460+
437461
for (i = 0; i < appraise_entries; i++) {
438462
list_add_tail(&default_appraise_rules[i].list,
439463
&ima_default_rules);

0 commit comments

Comments
 (0)