Skip to content

Commit 20c59ce

Browse files
mdroccomimizohar
authored andcommitted
ima: extend boot_aggregate with kernel measurements
Registers 8-9 are used to store measurements of the kernel and its command line (e.g., grub2 bootloader with tpm module enabled). IMA should include them in the boot aggregate. Registers 8-9 should be only included in non-SHA1 digests to avoid ambiguity. Signed-off-by: Maurizio Drocco <[email protected]> Reviewed-by: Bruno Meneguele <[email protected]> Tested-by: Bruno Meneguele <[email protected]> (TPM 1.2, TPM 2.0) Signed-off-by: Mimi Zohar <[email protected]>
1 parent 4877846 commit 20c59ce

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

security/integrity/ima/ima.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
enum ima_show_type { IMA_SHOW_BINARY, IMA_SHOW_BINARY_NO_FIELD_LEN,
3232
IMA_SHOW_BINARY_OLD_STRING_FMT, IMA_SHOW_ASCII };
33-
enum tpm_pcrs { TPM_PCR0 = 0, TPM_PCR8 = 8 };
33+
enum tpm_pcrs { TPM_PCR0 = 0, TPM_PCR8 = 8, TPM_PCR10 = 10 };
3434

3535
/* digest size for IMA, fits SHA1 or MD5 */
3636
#define IMA_DIGEST_SIZE SHA1_DIGEST_SIZE

security/integrity/ima/ima_crypto.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -823,13 +823,26 @@ static int ima_calc_boot_aggregate_tfm(char *digest, u16 alg_id,
823823
if (rc != 0)
824824
return rc;
825825

826-
/* cumulative sha1 over tpm registers 0-7 */
826+
/* cumulative digest over TPM registers 0-7 */
827827
for (i = TPM_PCR0; i < TPM_PCR8; i++) {
828828
ima_pcrread(i, &d);
829829
/* now accumulate with current aggregate */
830830
rc = crypto_shash_update(shash, d.digest,
831831
crypto_shash_digestsize(tfm));
832832
}
833+
/*
834+
* Extend cumulative digest over TPM registers 8-9, which contain
835+
* measurement for the kernel command line (reg. 8) and image (reg. 9)
836+
* in a typical PCR allocation. Registers 8-9 are only included in
837+
* non-SHA1 boot_aggregate digests to avoid ambiguity.
838+
*/
839+
if (alg_id != TPM_ALG_SHA1) {
840+
for (i = TPM_PCR8; i < TPM_PCR10; i++) {
841+
ima_pcrread(i, &d);
842+
rc = crypto_shash_update(shash, d.digest,
843+
crypto_shash_digestsize(tfm));
844+
}
845+
}
833846
if (!rc)
834847
crypto_shash_final(shash, digest);
835848
return rc;

0 commit comments

Comments
 (0)