aboutsummaryrefslogtreecommitdiffstats
path: root/security/keys
diff options
context:
space:
mode:
authorEric Biggers <ebiggers@google.com>2017-06-08 09:49:11 -0400
committerJames Morris <james.l.morris@oracle.com>2017-06-08 23:29:48 -0400
commita9dd74b252e04b7e41ffe78d418b896b33b70a13 (patch)
treef24d382b8b346df646071b491f2db395a1735b65 /security/keys
parent6966c74932b328b3d6df92b11b083bfbcd067986 (diff)
KEYS: encrypted: sanitize all key material
For keys of type "encrypted", consistently zero sensitive key material before freeing it. This was already being done for the decrypted payloads of encrypted keys, but not for the master key and the keys derived from the master key. Out of an abundance of caution and because it is trivial to do so, also zero buffers containing the key payload in encrypted form, although depending on how the encrypted-keys feature is used such information does not necessarily need to be kept secret. Cc: Mimi Zohar <zohar@linux.vnet.ibm.com> Cc: David Safford <safford@us.ibm.com> Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: James Morris <james.l.morris@oracle.com>
Diffstat (limited to 'security/keys')
-rw-r--r--security/keys/encrypted-keys/encrypted.c31
1 files changed, 13 insertions, 18 deletions
diff --git a/security/keys/encrypted-keys/encrypted.c b/security/keys/encrypted-keys/encrypted.c
index 5c98c2fe03f0..bb6324d1ccec 100644
--- a/security/keys/encrypted-keys/encrypted.c
+++ b/security/keys/encrypted-keys/encrypted.c
@@ -375,7 +375,7 @@ static int get_derived_key(u8 *derived_key, enum derived_key_type key_type,
375 memcpy(derived_buf + strlen(derived_buf) + 1, master_key, 375 memcpy(derived_buf + strlen(derived_buf) + 1, master_key,
376 master_keylen); 376 master_keylen);
377 ret = calc_hash(hash_tfm, derived_key, derived_buf, derived_buf_len); 377 ret = calc_hash(hash_tfm, derived_key, derived_buf, derived_buf_len);
378 kfree(derived_buf); 378 kzfree(derived_buf);
379 return ret; 379 return ret;
380} 380}
381 381
@@ -507,6 +507,7 @@ static int datablob_hmac_append(struct encrypted_key_payload *epayload,
507 if (!ret) 507 if (!ret)
508 dump_hmac(NULL, digest, HASH_SIZE); 508 dump_hmac(NULL, digest, HASH_SIZE);
509out: 509out:
510 memzero_explicit(derived_key, sizeof(derived_key));
510 return ret; 511 return ret;
511} 512}
512 513
@@ -545,6 +546,7 @@ static int datablob_hmac_verify(struct encrypted_key_payload *epayload,
545 dump_hmac("calc", digest, HASH_SIZE); 546 dump_hmac("calc", digest, HASH_SIZE);
546 } 547 }
547out: 548out:
549 memzero_explicit(derived_key, sizeof(derived_key));
548 return ret; 550 return ret;
549} 551}
550 552
@@ -701,6 +703,7 @@ static int encrypted_key_decrypt(struct encrypted_key_payload *epayload,
701out: 703out:
702 up_read(&mkey->sem); 704 up_read(&mkey->sem);
703 key_put(mkey); 705 key_put(mkey);
706 memzero_explicit(derived_key, sizeof(derived_key));
704 return ret; 707 return ret;
705} 708}
706 709
@@ -807,13 +810,13 @@ static int encrypted_instantiate(struct key *key,
807 ret = encrypted_init(epayload, key->description, format, master_desc, 810 ret = encrypted_init(epayload, key->description, format, master_desc,
808 decrypted_datalen, hex_encoded_iv); 811 decrypted_datalen, hex_encoded_iv);
809 if (ret < 0) { 812 if (ret < 0) {
810 kfree(epayload); 813 kzfree(epayload);
811 goto out; 814 goto out;
812 } 815 }
813 816
814 rcu_assign_keypointer(key, epayload); 817 rcu_assign_keypointer(key, epayload);
815out: 818out:
816 kfree(datablob); 819 kzfree(datablob);
817 return ret; 820 return ret;
818} 821}
819 822
@@ -822,8 +825,7 @@ static void encrypted_rcu_free(struct rcu_head *rcu)
822 struct encrypted_key_payload *epayload; 825 struct encrypted_key_payload *epayload;
823 826
824 epayload = container_of(rcu, struct encrypted_key_payload, rcu); 827 epayload = container_of(rcu, struct encrypted_key_payload, rcu);
825 memset(epayload->decrypted_data, 0, epayload->decrypted_datalen); 828 kzfree(epayload);
826 kfree(epayload);
827} 829}
828 830
829/* 831/*
@@ -881,7 +883,7 @@ static int encrypted_update(struct key *key, struct key_preparsed_payload *prep)
881 rcu_assign_keypointer(key, new_epayload); 883 rcu_assign_keypointer(key, new_epayload);
882 call_rcu(&epayload->rcu, encrypted_rcu_free); 884 call_rcu(&epayload->rcu, encrypted_rcu_free);
883out: 885out:
884 kfree(buf); 886 kzfree(buf);
885 return ret; 887 return ret;
886} 888}
887 889
@@ -939,33 +941,26 @@ static long encrypted_read(const struct key *key, char __user *buffer,
939 941
940 up_read(&mkey->sem); 942 up_read(&mkey->sem);
941 key_put(mkey); 943 key_put(mkey);
944 memzero_explicit(derived_key, sizeof(derived_key));
942 945
943 if (copy_to_user(buffer, ascii_buf, asciiblob_len) != 0) 946 if (copy_to_user(buffer, ascii_buf, asciiblob_len) != 0)
944 ret = -EFAULT; 947 ret = -EFAULT;
945 kfree(ascii_buf); 948 kzfree(ascii_buf);
946 949
947 return asciiblob_len; 950 return asciiblob_len;
948out: 951out:
949 up_read(&mkey->sem); 952 up_read(&mkey->sem);
950 key_put(mkey); 953 key_put(mkey);
954 memzero_explicit(derived_key, sizeof(derived_key));
951 return ret; 955 return ret;
952} 956}
953 957
954/* 958/*
955 * encrypted_destroy - before freeing the key, clear the decrypted data 959 * encrypted_destroy - clear and free the key's payload
956 *
957 * Before freeing the key, clear the memory containing the decrypted
958 * key data.
959 */ 960 */
960static void encrypted_destroy(struct key *key) 961static void encrypted_destroy(struct key *key)
961{ 962{
962 struct encrypted_key_payload *epayload = key->payload.data[0]; 963 kzfree(key->payload.data[0]);
963
964 if (!epayload)
965 return;
966
967 memzero_explicit(epayload->decrypted_data, epayload->decrypted_datalen);
968 kfree(key->payload.data[0]);
969} 964}
970 965
971struct key_type key_type_encrypted = { 966struct key_type key_type_encrypted = {