* [PATCH net] net/sched: cls_flow: pin file with get_file_rcu before reading f_cred
@ 2026-11-11 15:31 Tristan Madani
2026-11-11 15:37 ` netdev-bot+sinfo
0 siblings, 1 reply; 3+ messages in thread
From: Tristan Madani @ 2026-11-11 15:31 UTC (permalink / raw)
To: Jamal Hadi Salim, Jiri Pirko
Cc: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Simon Horman, Christian Brauner, netdev, linux-kernel, stable,
Tristan Madani
From: Tristan Madani <tristan@talencesecurity.com>
flow_get_skuid() and flow_get_skgid() read sk->sk_socket->file->f_cred
without holding a reference to the file. Since the file slab uses
SLAB_TYPESAFE_BY_RCU, a concurrent close() may free and recycle the file
object, causing stale credential data to be read through f_cred.
Pin the file with get_file_rcu() before accessing its credentials and
release with fput() afterwards.
Fixes: 0ede61d8589cc ("file: convert to SLAB_TYPESAFE_BY_RCU")
Cc: stable@vger.kernel.org
Signed-off-by: Tristan Madani <tristan@talencesecurity.com>
---
net/sched/cls_flow.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/net/sched/cls_flow.c b/net/sched/cls_flow.c
index a9ac3acf6eda0..233ca13299930 100644
--- a/net/sched/cls_flow.c
+++ b/net/sched/cls_flow.c
@@ -17,6 +17,7 @@
#include <linux/ipv6.h>
#include <linux/if_vlan.h>
#include <linux/slab.h>
+#include <linux/fs.h>
#include <linux/module.h>
#include <net/inet_sock.h>
@@ -208,10 +209,16 @@ static u32 flow_get_rtclassid(const struct sk_buff *skb)
static u32 flow_get_skuid(const struct sk_buff *skb)
{
struct sock *sk = skb_to_full_sk(skb);
+ struct file *filp;
- if (sk && sk->sk_socket && sk->sk_socket->file) {
- kuid_t skuid = sk->sk_socket->file->f_cred->fsuid;
+ if (!sk || !sk->sk_socket)
+ return 0;
+
+ filp = get_file_rcu(&sk->sk_socket->file);
+ if (filp) {
+ kuid_t skuid = filp->f_cred->fsuid;
+ fput(filp);
return from_kuid(&init_user_ns, skuid);
}
return 0;
@@ -220,10 +227,16 @@ static u32 flow_get_skuid(const struct sk_buff *skb)
static u32 flow_get_skgid(const struct sk_buff *skb)
{
struct sock *sk = skb_to_full_sk(skb);
+ struct file *filp;
+
+ if (!sk || !sk->sk_socket)
+ return 0;
- if (sk && sk->sk_socket && sk->sk_socket->file) {
- kgid_t skgid = sk->sk_socket->file->f_cred->fsgid;
+ filp = get_file_rcu(&sk->sk_socket->file);
+ if (filp) {
+ kgid_t skgid = filp->f_cred->fsgid;
+ fput(filp);
return from_kgid(&init_user_ns, skgid);
}
return 0;
--
2.47.3
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH net] net/sched: cls_flow: pin file with get_file_rcu before reading f_cred
2026-11-11 15:31 [PATCH net] net/sched: cls_flow: pin file with get_file_rcu before reading f_cred Tristan Madani
@ 2026-11-11 15:37 ` netdev-bot+sinfo
2026-11-13 22:09 ` Tristan Madani
0 siblings, 1 reply; 3+ messages in thread
From: netdev-bot+sinfo @ 2026-11-11 15:37 UTC (permalink / raw)
To: Tristan Madani
Cc: Jamal Hadi Salim, Jiri Pirko, David S . Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Simon Horman, Christian Brauner,
netdev, linux-kernel, stable, Tristan Madani
Hi!
This is an automated message. This series looks like a fix, but its
commit messages seem to be missing some information:
- How the issue was discovered, e.g. hit in production, hit during
development, syzbot report, manual code inspection, LLM or static
analysis tool scan.
- Whether the issue was actually triggered, or is only theoretical
(e.g. found by LLM and not proven at runtime). If it was triggered
please include the symptoms, like the stack trace or kernel messages.
Please do not repost the series just to address the above. Instead,
reply to this email with the missing information, so that reviewers
can take it into account. If the series needs another revision for
other reasons, please include the information in the commit messages
then.
The evaluation is done by an LLM so it may be wrong, if you think
that is the case please reply and explain.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH net] net/sched: cls_flow: pin file with get_file_rcu before reading f_cred
2026-11-11 15:37 ` netdev-bot+sinfo
@ 2026-11-13 22:09 ` Tristan Madani
0 siblings, 0 replies; 3+ messages in thread
From: Tristan Madani @ 2026-11-13 22:09 UTC (permalink / raw)
To: netdev-bot+sinfo
Cc: jhs, jiri, davem, edumazet, kuba, pabeni, horms, brauner, netdev,
linux-kernel, stable
These were found by manual code inspection. After commit 0ede61d8589cc
("file: convert to SLAB_TYPESAFE_BY_RCU"), I audited callers that read
file->f_cred under RCU without pinning the file with get_file_rcu().
The issue has not been triggered in practice. It is a theoretical race
where a struct file slab slot is freed and reused while netfilter code
still reads f_cred through the old pointer, but the race window is
narrow (a few loads in softirq context).
The same bug class was independently confirmed and fixed in eventpoll
(commits a10fbbe74e1c7, 0d8cd9537c641 in v7.3), which validates that
SLAB_TYPESAFE_BY_RCU file reuse is a real concern for unpinned readers.
Thanks,
Tristan
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-11-13 22:09 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-11 15:31 [PATCH net] net/sched: cls_flow: pin file with get_file_rcu before reading f_cred Tristan Madani
2026-11-11 15:37 ` netdev-bot+sinfo
2026-11-13 22:09 ` Tristan Madani
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®