]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ima: Call ima_calc_boot_aggregate() in ima_eventdigest_init()
authorRoberto Sassu <roberto.sassu@huawei.com>
Wed, 3 Jun 2020 15:08:21 +0000 (17:08 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 22 Jun 2020 07:31:15 +0000 (09:31 +0200)
commit 6cc7c266e5b47d3cd2b5bb7fd3aac4e6bb2dd1d2 upstream.

If the template field 'd' is chosen and the digest to be added to the
measurement entry was not calculated with SHA1 or MD5, it is
recalculated with SHA1, by using the passed file descriptor. However, this
cannot be done for boot_aggregate, because there is no file descriptor.

This patch adds a call to ima_calc_boot_aggregate() in
ima_eventdigest_init(), so that the digest can be recalculated also for the
boot_aggregate entry.

Cc: stable@vger.kernel.org # 3.13.x
Fixes: 3ce1217d6cd5d ("ima: define template fields library and new helpers")
Reported-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
security/integrity/ima/ima.h
security/integrity/ima/ima_crypto.c
security/integrity/ima/ima_init.c
security/integrity/ima/ima_template_lib.c

index 494c6334b7145daedbd916e9a4d10e3f1f842685..be469fce19e121b8accc89e12076466ffc1979cf 100644 (file)
@@ -52,6 +52,7 @@ extern int ima_policy_flag;
 extern int ima_hash_algo;
 extern int ima_appraise;
 extern struct tpm_chip *ima_tpm_chip;
+extern const char boot_aggregate_name[];
 
 /* IMA event related data */
 struct ima_event_data {
@@ -140,7 +141,7 @@ int ima_calc_buffer_hash(const void *buf, loff_t len,
 int ima_calc_field_array_hash(struct ima_field_data *field_data,
                              struct ima_template_desc *desc, int num_fields,
                              struct ima_digest_data *hash);
-int __init ima_calc_boot_aggregate(struct ima_digest_data *hash);
+int ima_calc_boot_aggregate(struct ima_digest_data *hash);
 void ima_add_violation(struct file *file, const unsigned char *filename,
                       struct integrity_iint_cache *iint,
                       const char *op, const char *cause);
index 75c436aaa6c5af609ddac74b620d01317e8296fa..8499e7ba2891c7f77baab6a00c677b1af97e6250 100644 (file)
@@ -665,8 +665,8 @@ static void __init ima_pcrread(u32 idx, struct tpm_digest *d)
  * hash algorithm for reading the TPM PCRs as for calculating the boot
  * aggregate digest as stored in the measurement list.
  */
-static int __init ima_calc_boot_aggregate_tfm(char *digest, u16 alg_id,
-                                             struct crypto_shash *tfm)
+static int ima_calc_boot_aggregate_tfm(char *digest, u16 alg_id,
+                                      struct crypto_shash *tfm)
 {
        struct tpm_digest d = { .alg_id = alg_id, .digest = {0} };
        int rc;
@@ -694,7 +694,7 @@ static int __init ima_calc_boot_aggregate_tfm(char *digest, u16 alg_id,
        return rc;
 }
 
-int __init ima_calc_boot_aggregate(struct ima_digest_data *hash)
+int ima_calc_boot_aggregate(struct ima_digest_data *hash)
 {
        struct crypto_shash *tfm;
        u16 crypto_id, alg_id;
index c299cb077c0a7d7dcd14a940f3db0fbc715e87ac..a94177042eaa0fc615d2e2a1761bf192f54aa070 100644 (file)
@@ -21,7 +21,7 @@
 #include "ima.h"
 
 /* name for boot aggregate entry */
-static const char boot_aggregate_name[] = "boot_aggregate";
+const char boot_aggregate_name[] = "boot_aggregate";
 struct tpm_chip *ima_tpm_chip;
 
 /* Add the boot aggregate to the IMA measurement list and extend
index 32ae05d8825735000e8d00a5669ba0ff9559415a..1be146e17d9faa0e61f508140dcbafe57a35131f 100644 (file)
@@ -288,6 +288,24 @@ int ima_eventdigest_init(struct ima_event_data *event_data,
                goto out;
        }
 
+       if ((const char *)event_data->filename == boot_aggregate_name) {
+               if (ima_tpm_chip) {
+                       hash.hdr.algo = HASH_ALGO_SHA1;
+                       result = ima_calc_boot_aggregate(&hash.hdr);
+
+                       /* algo can change depending on available PCR banks */
+                       if (!result && hash.hdr.algo != HASH_ALGO_SHA1)
+                               result = -EINVAL;
+
+                       if (result < 0)
+                               memset(&hash, 0, sizeof(hash));
+               }
+
+               cur_digest = hash.hdr.digest;
+               cur_digestsize = hash_digest_size[HASH_ALGO_SHA1];
+               goto out;
+       }
+
        if (!event_data->file)  /* missing info to re-calculate the digest */
                return -EINVAL;