Message ID | 20240905152512.3781098-5-roberto.sassu@huaweicloud.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | ima: Integrate with Integrity Digest Cache | expand |
On Thu Sep 5, 2024 at 6:25 PM EEST, Roberto Sassu wrote: > From: Roberto Sassu <roberto.sassu@huawei.com> > > Specify the 'digest_cache_measure' boot-time policy with 'ima_policy=' in > the kernel command line to add the following rule at the beginning of the > IMA policy, before other rules: > > measure func=DIGEST_LIST_CHECK pcr=12 > > which will measure digest lists into PCR 12 (or the value in > CONFIG_IMA_DIGEST_CACHE_MEASURE_PCR_IDX). > > Specify 'digest_cache_appraise' to add the following rule at the beginning, > before other rules: > > appraise func=DIGEST_LIST_CHECK appraise_type=imasig|modsig > > which will appraise digest lists with IMA signatures or module-style > appended signatures. > > Adding those rule at the beginning rather than at the end is necessary to > ensure that digest lists are measured and appraised in the initial ram > disk, which would be otherwise prevented by the dont_ rules. > > Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com> > --- > .../admin-guide/kernel-parameters.txt | 10 +++++- > security/integrity/ima/Kconfig | 10 ++++++ > security/integrity/ima/ima_policy.c | 35 +++++++++++++++++++ > 3 files changed, 54 insertions(+), 1 deletion(-) > > diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt > index 09126bb8cc9f..afaaf125a237 100644 > --- a/Documentation/admin-guide/kernel-parameters.txt > +++ b/Documentation/admin-guide/kernel-parameters.txt > @@ -2077,7 +2077,8 @@ > ima_policy= [IMA] > The builtin policies to load during IMA setup. > Format: "tcb | appraise_tcb | secure_boot | > - fail_securely | critical_data" > + fail_securely | critical_data | > + digest_cache_measure | digest_cache_appraise" > > The "tcb" policy measures all programs exec'd, files > mmap'd for exec, and all files opened with the read > @@ -2099,6 +2100,13 @@ > The "critical_data" policy measures kernel integrity > critical data. > > + The "digest_cache_measure" policy measures digest lists > + into PCR 12 (can be changed with kernel config). > + > + The "digest_cache_appraise" policy appraises digest > + lists with IMA signatures or module-style appended > + signatures. > + > ima_tcb [IMA] Deprecated. Use ima_policy= instead. > Load a policy which meets the needs of the Trusted > Computing Base. This means IMA will measure all Must be updated as a separate commit as kernel-parameters.txt not part of IMA. Consider it as a different subsystem in this context. BR, Jarkko
On Fri, 2024-09-06 at 12:45 +0300, Jarkko Sakkinen wrote: > On Thu Sep 5, 2024 at 6:25 PM EEST, Roberto Sassu wrote: > > From: Roberto Sassu <roberto.sassu@huawei.com> > > > > Specify the 'digest_cache_measure' boot-time policy with 'ima_policy=' in > > the kernel command line to add the following rule at the beginning of the > > IMA policy, before other rules: > > > > measure func=DIGEST_LIST_CHECK pcr=12 > > > > which will measure digest lists into PCR 12 (or the value in > > CONFIG_IMA_DIGEST_CACHE_MEASURE_PCR_IDX). > > > > Specify 'digest_cache_appraise' to add the following rule at the beginning, > > before other rules: > > > > appraise func=DIGEST_LIST_CHECK appraise_type=imasig|modsig > > > > which will appraise digest lists with IMA signatures or module-style > > appended signatures. > > > > Adding those rule at the beginning rather than at the end is necessary to > > ensure that digest lists are measured and appraised in the initial ram > > disk, which would be otherwise prevented by the dont_ rules. > > > > Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com> > > --- > > .../admin-guide/kernel-parameters.txt | 10 +++++- > > security/integrity/ima/Kconfig | 10 ++++++ > > security/integrity/ima/ima_policy.c | 35 +++++++++++++++++++ > > 3 files changed, 54 insertions(+), 1 deletion(-) > > > > diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt > > index 09126bb8cc9f..afaaf125a237 100644 > > --- a/Documentation/admin-guide/kernel-parameters.txt > > +++ b/Documentation/admin-guide/kernel-parameters.txt > > @@ -2077,7 +2077,8 @@ > > ima_policy= [IMA] > > The builtin policies to load during IMA setup. > > Format: "tcb | appraise_tcb | secure_boot | > > - fail_securely | critical_data" > > + fail_securely | critical_data | > > + digest_cache_measure | digest_cache_appraise" > > > > The "tcb" policy measures all programs exec'd, files > > mmap'd for exec, and all files opened with the read > > @@ -2099,6 +2100,13 @@ > > The "critical_data" policy measures kernel integrity > > critical data. > > > > + The "digest_cache_measure" policy measures digest lists > > + into PCR 12 (can be changed with kernel config). > > + > > + The "digest_cache_appraise" policy appraises digest > > + lists with IMA signatures or module-style appended > > + signatures. > > + > > ima_tcb [IMA] Deprecated. Use ima_policy= instead. > > Load a policy which meets the needs of the Trusted > > Computing Base. This means IMA will measure all > > Must be updated as a separate commit as kernel-parameters.txt not > part of IMA. Consider it as a different subsystem in this context. Can be done, but this would be more like an atomic change in case the patch is reverted. Thanks Roberto
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 09126bb8cc9f..afaaf125a237 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -2077,7 +2077,8 @@ ima_policy= [IMA] The builtin policies to load during IMA setup. Format: "tcb | appraise_tcb | secure_boot | - fail_securely | critical_data" + fail_securely | critical_data | + digest_cache_measure | digest_cache_appraise" The "tcb" policy measures all programs exec'd, files mmap'd for exec, and all files opened with the read @@ -2099,6 +2100,13 @@ The "critical_data" policy measures kernel integrity critical data. + The "digest_cache_measure" policy measures digest lists + into PCR 12 (can be changed with kernel config). + + The "digest_cache_appraise" policy appraises digest + lists with IMA signatures or module-style appended + signatures. + ima_tcb [IMA] Deprecated. Use ima_policy= instead. Load a policy which meets the needs of the Trusted Computing Base. This means IMA will measure all diff --git a/security/integrity/ima/Kconfig b/security/integrity/ima/Kconfig index 475c32615006..d2d79185f714 100644 --- a/security/integrity/ima/Kconfig +++ b/security/integrity/ima/Kconfig @@ -321,4 +321,14 @@ config IMA_DISABLE_HTABLE help This option disables htable to allow measurement of duplicate records. +config IMA_DIGEST_CACHE_MEASURE_PCR_IDX + int + range 8 14 + default 12 + help + This option determines the TPM PCR register index that IMA uses to + maintain the integrity aggregate of the measurement list, when the + Integrity Digest Cache is used (different measurement style). + If unsure, use the default 12. + endif diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c index eb3bfe01782d..c2bf58010b89 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c @@ -254,6 +254,21 @@ static struct ima_rule_entry critical_data_rules[] __ro_after_init = { {.action = MEASURE, .func = CRITICAL_DATA, .flags = IMA_FUNC}, }; +static struct ima_rule_entry measure_digest_cache_rule __ro_after_init = { +#ifdef CONFIG_INTEGRITY_DIGEST_CACHE + .action = MEASURE, .func = DIGEST_LIST_CHECK, + .pcr = CONFIG_IMA_DIGEST_CACHE_MEASURE_PCR_IDX, + .flags = IMA_FUNC | IMA_PCR +#endif +}; + +static struct ima_rule_entry appraise_digest_cache_rule __ro_after_init = { +#ifdef CONFIG_INTEGRITY_DIGEST_CACHE + .action = APPRAISE, .func = DIGEST_LIST_CHECK, + .flags = IMA_FUNC | IMA_DIGSIG_REQUIRED | IMA_MODSIG_ALLOWED, +#endif +}; + /* An array of architecture specific rules */ static struct ima_rule_entry *arch_policy_entry __ro_after_init; @@ -278,6 +293,8 @@ static bool ima_use_appraise_tcb __initdata; static bool ima_use_secure_boot __initdata; static bool ima_use_critical_data __initdata; static bool ima_fail_unverifiable_sigs __ro_after_init; +static bool ima_digest_cache_measure __ro_after_init; +static bool ima_digest_cache_appraise __ro_after_init; static int __init policy_setup(char *str) { char *p; @@ -295,6 +312,10 @@ static int __init policy_setup(char *str) ima_use_critical_data = true; else if (strcmp(p, "fail_securely") == 0) ima_fail_unverifiable_sigs = true; + else if (strcmp(p, "digest_cache_measure") == 0) + ima_digest_cache_measure = true; + else if (strcmp(p, "digest_cache_appraise") == 0) + ima_digest_cache_appraise = true; else pr_err("policy \"%s\" not found", p); } @@ -983,6 +1004,20 @@ void __init ima_init_policy(void) { int build_appraise_entries, arch_entries; + /* + * We need to load digest cache rules at the beginning, to avoid dont_ + * rules causing ours to not be reached. + */ + if (IS_ENABLED(CONFIG_INTEGRITY_DIGEST_CACHE)) { + if (ima_digest_cache_measure) + add_rules(&measure_digest_cache_rule, 1, + IMA_DEFAULT_POLICY); + + if (ima_digest_cache_appraise) + add_rules(&appraise_digest_cache_rule, 1, + IMA_DEFAULT_POLICY); + } + /* if !ima_policy, we load NO default rules */ if (ima_policy) add_rules(dont_measure_rules, ARRAY_SIZE(dont_measure_rules),