linux/security/keys
Eric Biggers d3dc1ffed4 KEYS: add missing permission check for request_key() destination
commit 4dca6ea1d9 upstream.

When the request_key() syscall is not passed a destination keyring, it
links the requested key (if constructed) into the "default" request-key
keyring.  This should require Write permission to the keyring.  However,
there is actually no permission check.

This can be abused to add keys to any keyring to which only Search
permission is granted.  This is because Search permission allows joining
the keyring.  keyctl_set_reqkey_keyring(KEY_REQKEY_DEFL_SESSION_KEYRING)
then will set the default request-key keyring to the session keyring.
Then, request_key() can be used to add keys to the keyring.

Both negatively and positively instantiated keys can be added using this
method.  Adding negative keys is trivial.  Adding a positive key is a
bit trickier.  It requires that either /sbin/request-key positively
instantiates the key, or that another thread adds the key to the process
keyring at just the right time, such that request_key() misses it
initially but then finds it in construct_alloc_key().

Fix this bug by checking for Write permission to the keyring in
construct_get_dest_keyring() when the default keyring is being used.

We don't do the permission check for non-default keyrings because that
was already done by the earlier call to lookup_user_key().  Also,
request_key_and_link() is currently passed a 'struct key *' rather than
a key_ref_t, so the "possessed" bit is unavailable.

We also don't do the permission check for the "requestor keyring", to
continue to support the use case described by commit 8bbf4976b5
("KEYS: Alter use of key instantiation link-to-keyring argument") where
/sbin/request-key recursively calls request_key() to add keys to the
original requestor's destination keyring.  (I don't know of any users
who actually do that, though...)

Fixes: 3e30148c3d ("[PATCH] Keys: Make request-key create an authorisation key")
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: David Howells <dhowells@redhat.com>
[bwh: Backported to 3.16: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
History 2018-01-01 20:52:12 +00:00
..
encrypted-keys KEYS: encrypted: fix dereference of NULL user_key_payload 2018-01-01 20:51:52 +00:00
big_key.c security/keys: properly zero out sensitive key material in big_key 2018-01-01 20:51:41 +00:00
compat.c security/compat: convert to COMPAT_SYSCALL_DEFINE 2014-03-06 16:30:42 +01:00
gc.c KEYS: Change the name of the dead type to ".dead" to prevent user access 2017-07-18 18:40:36 +01:00
internal.h KEYS: prevent creating a different user's keyrings 2018-01-01 20:51:40 +00:00
Kconfig KEYS: Make BIG_KEYS boolean 2013-10-30 11:15:23 +00:00
key.c KEYS: prevent creating a different user's keyrings 2018-01-01 20:51:40 +00:00
keyctl.c KEYS: fix key refcount leak in keyctl_read_key() 2018-01-01 20:51:39 +00:00
keyring.c KEYS: return full count in keyring_read() if buffer is too small 2018-01-01 20:52:03 +00:00
Makefile KEYS: Add per-user_namespace registers for persistent per-UID kerberos caches 2013-09-24 10:35:19 +01:00
permission.c KEYS: Move the flags representing required permission to linux/key.h 2014-03-14 17:44:49 +00:00
persistent.c KEYS: Move the flags representing required permission to linux/key.h 2014-03-14 17:44:49 +00:00
proc.c KEYS: Fix short sprintf buffer in /proc/keys show function 2016-11-20 01:17:37 +00:00
process_keys.c KEYS: prevent creating a different user's keyrings 2018-01-01 20:51:40 +00:00
request_key.c KEYS: add missing permission check for request_key() destination 2018-01-01 20:52:12 +00:00
request_key_auth.c KEYS: don't revoke uninstantiated key in request_key_auth_new() 2018-01-01 20:51:39 +00:00
sysctl.c security: Convert use of typedef ctl_table to struct ctl_table 2014-04-15 13:39:58 +10:00
trusted.c KEYS: trusted: fix writing past end of buffer in trusted_read() 2018-01-01 20:52:03 +00:00
trusted.h trusted-keys: rename trusted_defined files to trusted 2011-01-24 10:14:22 +11:00
user_defined.c KEYS: Introduce a search context structure 2013-09-24 10:35:15 +01:00