From: Anil Kaushik <anilkaushikwireless@gmail.com>
To: netdev@vger.kernel.org
Cc: "David S . Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@kernel.org>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Simon Horman <horms@kernel.org>, Ido Schimmel <idosch@nvidia.com>,
Nicolas Dichtel <nicolas.dichtel@6wind.com>,
Jacob Keller <jacob.e.keller@intel.com>,
Jiri Pirko <jiri@resnulli.us>, Florian Westphal <fw@strlen.de>,
Mat Martineau <martineau@kernel.org>,
XingWang Xiang <v3rdant.xiang@gmail.com>,
Alice Ryhl <aliceryhl@google.com>,
linux-kernel@vger.kernel.org,
Anil Kaushik <anilkaushikwireless@gmail.com>
Subject: [PATCH net v3 0/2] genetlink: fix joining multicast groups no family owns
Date: Sun, 1 Nov 2026 10:13:45 +0000 [thread overview]
Message-ID: <20261101101347.3910654-1-anilkaushikwireless@gmail.com> (raw)
genl_bind() checks the GENL_MCAST_CAP_* flags of a group, but the
membership bit is set later, after the lock is dropped. A socket can end
up a member of a group whose flags were never checked for it: when it
joins a group ID that no family owns, or when the family of the group is
unregistered between the check and the point where the bit is set.
Patch 1 rejects joins to group IDs that no family owns. Patch 2 counts,
per group, how many times its members were cleared, which genetlink does
when a family is unregistered. If the count changed after the check, the
group is checked again against its current owner.
Tested as an unprivileged user, with an msleep() added after the bind
callback in netlink_setsockopt() and netlink_bind(), and a test family
that registers again with GENL_MCAST_CAP_NET_ADMIN:
patch 1 only v3
setsockopt:
unregister in the window,
register later member not member
unregister and register in the window member not member
another family unregistered
(must still join) member member
bind():
unregister and register in the window member not member
The test family counts its bind and unbind callbacks: they stay
balanced with v3. Normal joins, rtnetlink bind() and lockdep show no
change.
The test from v1 (join all free IDs, then load gtp and drop_monitor)
gives the same result as before.
I used an LLM to help write and review the code, the tests and the
commit messages of this series. I checked and tested every change
myself.
Changes in v3:
- Patch 2: check the group again in af_netlink.c instead of clearing
the members when a family registers. This also covers the case where
the family is unregistered and another one registers, both in the
window, does not walk the sockets on every registration, and does not
touch the members of a group another family still owns (Sashiko).
- Fixes: tag of both patches: the race exists since genl_bind() first
checked a capability, in 4d54cc32112d (Sashiko).
Changes in v2:
- New patch 2 (Sashiko).
- Patch 1: no change, added Reviewed-by tags.
v2: https://lore.kernel.org/netdev/20261031054632.3697295-1-anilkaushikwireless@gmail.com/
v1: https://lore.kernel.org/netdev/20261029062214.3407223-1-anilkaushikwireless@gmail.com/
Anil Kaushik (2):
genetlink: Reject joining multicast groups no family owns
netlink: Check a group again if it was released while joining it
net/netlink/af_netlink.c | 61 +++++++++++++++++++++++++++++++++++++++-
net/netlink/af_netlink.h | 1 +
net/netlink/genetlink.c | 3 +-
3 files changed, 63 insertions(+), 2 deletions(-)
--
2.25.1
next reply other threads:[~2026-11-01 10:13 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-01 10:13 Anil Kaushik [this message]
2026-11-01 10:13 ` [PATCH net v3 1/2] genetlink: Reject joining multicast groups no family owns Anil Kaushik
2026-11-01 10:13 ` [PATCH net v3 2/2] netlink: Check a group again if it was released while joining it Anil Kaushik
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=20261101101347.3910654-1-anilkaushikwireless@gmail.com \
--to=anilkaushikwireless@gmail.com \
--cc=aliceryhl@google.com \
--cc=davem@davemloft.net \
--cc=edumazet@kernel.org \
--cc=fw@strlen.de \
--cc=horms@kernel.org \
--cc=idosch@nvidia.com \
--cc=jacob.e.keller@intel.com \
--cc=jiri@resnulli.us \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=martineau@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nicolas.dichtel@6wind.com \
--cc=pabeni@redhat.com \
--cc=v3rdant.xiang@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