KEYS: sanitize key structs before freeing
authorEric Biggers <ebiggers@google.com>
Thu, 8 Jun 2017 13:49:26 +0000 (14:49 +0100)
committerJames Morris <james.l.morris@oracle.com>
Fri, 9 Jun 2017 03:29:48 +0000 (13:29 +1000)
While a 'struct key' itself normally does not contain sensitive
information, Documentation/security/keys.txt actually encourages this:

     "Having a payload is not required; and the payload can, in fact,
     just be a value stored in the struct key itself."

In case someone has taken this advice, or will take this advice in the
future, zero the key structure before freeing it.  We might as well, and
as a bonus this could make it a bit more difficult for an adversary to
determine which keys have recently been in use.

This is safe because the key_jar cache does not use a constructor.

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>
include/linux/key.h
security/keys/gc.c

index 0c9b93b0d1f7cd6133ea87515d3a83fb25f8258b..78e25aabedaf6696772347bb25b20c4cb61254db 100644 (file)
@@ -173,7 +173,6 @@ struct key {
 #ifdef KEY_DEBUGGING
        unsigned                magic;
 #define KEY_DEBUG_MAGIC                0x18273645u
-#define KEY_DEBUG_MAGIC_X      0xf8e9dacbu
 #endif
 
        unsigned long           flags;          /* status flags (change with bitops) */
index 595becc6d0d259a017be1305842f6208562324bb..87cb260e4890f3ac464e8d3f3244077653510b74 100644 (file)
@@ -158,9 +158,7 @@ static noinline void key_gc_unused_keys(struct list_head *keys)
 
                kfree(key->description);
 
-#ifdef KEY_DEBUGGING
-               key->magic = KEY_DEBUG_MAGIC_X;
-#endif
+               memzero_explicit(key, sizeof(*key));
                kmem_cache_free(key_jar, key);
        }
 }