| From 8379bb84be757d5df2d818509faec5d66adb861d Mon Sep 17 00:00:00 2001 |
| From: David Howells <dhowells@redhat.com> |
| Date: Tue, 14 Jan 2020 16:06:14 +0000 |
| Subject: keys: Fix request_key() cache |
| |
| From: David Howells <dhowells@redhat.com> |
| |
| commit 8379bb84be757d5df2d818509faec5d66adb861d upstream. |
| |
| When the key cached by request_key() and co. is cleaned up on exit(), |
| the code looks in the wrong task_struct, and so clears the wrong cache. |
| This leads to anomalies in key refcounting when doing, say, a kernel |
| build on an afs volume, that then trigger kasan to report a |
| use-after-free when the key is viewed in /proc/keys. |
| |
| Fix this by making exit_creds() look in the passed-in task_struct rather |
| than in current (the task_struct cleanup code is deferred by RCU and |
| potentially run in another task). |
| |
| Fixes: 7743c48e54ee ("keys: Cache result of request_key*() temporarily in task_struct") |
| Signed-off-by: David Howells <dhowells@redhat.com> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/cred.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/kernel/cred.c |
| +++ b/kernel/cred.c |
| @@ -175,8 +175,8 @@ void exit_creds(struct task_struct *tsk) |
| put_cred(cred); |
| |
| #ifdef CONFIG_KEYS_REQUEST_CACHE |
| - key_put(current->cached_requested_key); |
| - current->cached_requested_key = NULL; |
| + key_put(tsk->cached_requested_key); |
| + tsk->cached_requested_key = NULL; |
| #endif |
| } |
| |