From: Jarkko Sakkinen <jarkko@kernel.org>
To: Cen Zhang <zzzccc427@gmail.com>
Cc: dhowells@redhat.com, paul@paul-moore.com, jmorris@namei.org,
serge@hallyn.com, keyrings@vger.kernel.org,
linux-security-module@vger.kernel.org,
linux-kernel@vger.kernel.org, ebiggers@kernel.org,
baijiaju1990@gmail.com, jjzuming@gmail.com
Subject: Re: [PATCH] keys: Avoid owner account dereferences in /proc/keys
Date: Sun, 18 Oct 2026 05:21:56 +0300 [thread overview]
Message-ID: <atQtRK3wy6g8YdIV@kernel.org> (raw)
In-Reply-To: <pm-keys-proc-owner-uid-followup-20261017-v2-8f8f34a41eb1bbb94ef0@gmail.com>
On Sat, Oct 17, 2026 at 04:16:22PM +0800, Cen Zhang wrote:
> The namespace filters in find_ge_key() and key_serial_next() read
> key->user->uid while traversing the serial tree under key_serial_lock.
> That lock keeps the key allocated, but it does not protect the separate
> key_user from ownership changes.
>
> A /proc/keys read reaches find_ge_key() through proc_keys_start(), and
> key_serial_next() through proc_keys_next(). The lock stays held until
> proc_keys_stop().
>
> A successful privileged KEYCTL_CHOWN on the same key replaces key->user
> under key->sem and drops the old owner's reference after releasing the
> semaphore. If that was the old dynamic key_user's last reference, a
> /proc/keys reader can access freed memory:
>
> /proc/keys reader KEYCTL_CHOWN
> proc_keys_start() keyctl_chown_key()
> spin_lock(key_serial_lock) down_write(key->sem)
> find_ge_key()
> old = minkey->user
> zapowner = key->user
> key->user = newowner
> key->uid = uid
> up_write(key->sem)
> key_put(key)
> key_user_put(zapowner)
> kfree(zapowner)
> read old->uid -> use-after-free
> proc_keys_stop()
> spin_unlock(key_serial_lock)
>
> Use the inline key->uid in both filters, following the approach already
> used by find_keyring_by_name(). The serial-tree lock keeps the containing
> key alive, so filtering no longer depends on the quota owner's lifetime.
> This also uses the same owner UID as proc_keys_show() and the permission
> check.
>
> For thread keyrings, key_fsuid_changed() can update key->uid without
> changing the quota owner. The filters now follow that current owner UID,
> including when its namespace mapping differs from the quota owner's.
>
> Fixes: 454804ab0302 ("keys: make procfiles per-user-namespace")
> Suggested-by: Eric Biggers <ebiggers@kernel.org>
> Assisted-by: LLM
> Signed-off-by: Cen Zhang <zzzccc427@gmail.com>
These tags could be ordered correctly.
>
> ---
> security/keys/proc.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/security/keys/proc.c b/security/keys/proc.c
> index 4f4e2c1824f1..aea06a74d0fe 100644
> --- a/security/keys/proc.c
> +++ b/security/keys/proc.c
> @@ -68,7 +68,7 @@ static struct rb_node *key_serial_next(struct seq_file *p, struct rb_node *n)
> n = rb_next(n);
> while (n) {
> struct key *key = rb_entry(n, struct key, serial_node);
> - if (kuid_has_mapping(user_ns, key->user->uid))
> + if (kuid_has_mapping(user_ns, key->uid))
> break;
> n = rb_next(n);
> }
> @@ -100,7 +100,7 @@ static struct key *find_ge_key(struct seq_file *p, key_serial_t id)
> return NULL;
>
> for (;;) {
> - if (kuid_has_mapping(user_ns, minkey->user->uid))
> + if (kuid_has_mapping(user_ns, minkey->uid))
> return minkey;
> n = rb_next(&minkey->serial_node);
> if (!n)
>
> base-commit: a626e44fd64c456d373ae8c28b939197b9446a02
I don't want to circulate this further.
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Br, Jarkko
prev parent reply other threads:[~2026-10-18 2:22 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-17 8:16 [PATCH] keys: Avoid owner account dereferences in /proc/keys Cen Zhang
2026-10-17 8:18 ` sashiko-bot
2026-10-18 2:21 ` Jarkko Sakkinen [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=atQtRK3wy6g8YdIV@kernel.org \
--to=jarkko@kernel.org \
--cc=baijiaju1990@gmail.com \
--cc=dhowells@redhat.com \
--cc=ebiggers@kernel.org \
--cc=jjzuming@gmail.com \
--cc=jmorris@namei.org \
--cc=keyrings@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=paul@paul-moore.com \
--cc=serge@hallyn.com \
--cc=zzzccc427@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox