diff options
author | Eric Biggers <ebiggers@google.com> | 2017-09-18 11:38:29 -0700 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2019-05-02 21:41:58 +0100 |
commit | 1a844ebde7e7de0970d028faca990507e4287104 (patch) | |
tree | c05fee88a8bf539f55f67f370e39edc89d1b2337 /security | |
parent | 823f25c068f93f7800780f1648eeb59287cd5177 (diff) |
KEYS: restrict /proc/keys by credentials at open time
commit 4aa68e07d845562561f5e73c04aa521376e95252 upstream.
When checking for permission to view keys whilst reading from
/proc/keys, we should use the credentials with which the /proc/keys file
was opened. This is because, in a classic type of exploit, it can be
possible to bypass checks for the *current* credentials by passing the
file descriptor to a suid program.
Following commit 34dbbcdbf633 ("Make file credentials available to the
seqfile interfaces") we can finally fix it. So let's do it.
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>
Diffstat (limited to 'security')
-rw-r--r-- | security/keys/proc.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/security/keys/proc.c b/security/keys/proc.c index 62a86e8cb907..0115fc283000 100644 --- a/security/keys/proc.c +++ b/security/keys/proc.c @@ -193,7 +193,7 @@ static int proc_keys_show(struct seq_file *m, void *v) struct keyring_search_context ctx = { .index_key.type = key->type, .index_key.description = key->description, - .cred = current_cred(), + .cred = m->file->f_cred, .match = lookup_user_key_possessed, .match_data = key, .flags = (KEYRING_SEARCH_NO_STATE_CHECK | @@ -213,11 +213,7 @@ static int proc_keys_show(struct seq_file *m, void *v) } } - /* check whether the current task is allowed to view the key (assuming - * non-possession) - * - the caller holds a spinlock, and thus the RCU read lock, making our - * access to __current_cred() safe - */ + /* check whether the current task is allowed to view the key */ rc = key_task_permission(key_ref, ctx.cred, KEY_NEED_VIEW); if (rc < 0) return 0; |