Skip to content

Commit

Permalink
KEYS: user_defined: sanitize key payloads
Browse files Browse the repository at this point in the history
Zero the payloads of user and logon keys before freeing them.  This
prevents sensitive key material from being kept around in the slab
caches after a key is released.

Signed-off-by: Eric Biggers <[email protected]>
Signed-off-by: David Howells <[email protected]>
Signed-off-by: James Morris <[email protected]>
  • Loading branch information
ebiggers authored and James Morris committed Jun 9, 2017
1 parent 57070c8 commit 6966c74
Showing 1 changed file with 12 additions and 4 deletions.
16 changes: 12 additions & 4 deletions security/keys/user_defined.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,18 @@ EXPORT_SYMBOL_GPL(user_preparse);
*/
void user_free_preparse(struct key_preparsed_payload *prep)
{
kfree(prep->payload.data[0]);
kzfree(prep->payload.data[0]);
}
EXPORT_SYMBOL_GPL(user_free_preparse);

static void user_free_payload_rcu(struct rcu_head *head)
{
struct user_key_payload *payload;

payload = container_of(head, struct user_key_payload, rcu);
kzfree(payload);
}

/*
* update a user defined key
* - the key's semaphore is write-locked
Expand All @@ -112,7 +120,7 @@ int user_update(struct key *key, struct key_preparsed_payload *prep)
prep->payload.data[0] = NULL;

if (zap)
kfree_rcu(zap, rcu);
call_rcu(&zap->rcu, user_free_payload_rcu);
return ret;
}
EXPORT_SYMBOL_GPL(user_update);
Expand All @@ -130,7 +138,7 @@ void user_revoke(struct key *key)

if (upayload) {
rcu_assign_keypointer(key, NULL);
kfree_rcu(upayload, rcu);
call_rcu(&upayload->rcu, user_free_payload_rcu);
}
}

Expand All @@ -143,7 +151,7 @@ void user_destroy(struct key *key)
{
struct user_key_payload *upayload = key->payload.data[0];

kfree(upayload);
kzfree(upayload);
}

EXPORT_SYMBOL_GPL(user_destroy);
Expand Down

0 comments on commit 6966c74

Please sign in to comment.