* [PATCH net] af_netlink: Fix shift out of bounds in group mask calculation
@ 2022-03-17 14:53 Petr Machata
2022-03-17 15:10 ` Ido Schimmel
2022-03-19 5:00 ` patchwork-bot+netdevbpf
0 siblings, 2 replies; 3+ messages in thread
From: Petr Machata @ 2022-03-17 14:53 UTC (permalink / raw)
To: netdev; +Cc: David S. Miller, Jakub Kicinski, Ido Schimmel, Petr Machata
When a netlink message is received, netlink_recvmsg() fills in the address
of the sender. One of the fields is the 32-bit bitfield nl_groups, which
carries the multicast group on which the message was received. The least
significant bit corresponds to group 1, and therefore the highest group
that the field can represent is 32. Above that, the UB sanitizer flags the
out-of-bounds shift attempts.
Which bits end up being set in such case is implementation defined, but
it's either going to be a wrong non-zero value, or zero, which is at least
not misleading. Make the latter choice deterministic by always setting to 0
for higher-numbered multicast groups.
To get information about membership in groups >= 32, userspace is expected
to use nl_pktinfo control messages[0], which are enabled by NETLINK_PKTINFO
socket option.
[0] https://lwn.net/Articles/147608/
The way to trigger this issue is e.g. through monitoring the BRVLAN group:
# bridge monitor vlan &
# ip link add name br type bridge
Which produces the following citation:
UBSAN: shift-out-of-bounds in net/netlink/af_netlink.c:162:19
shift exponent 32 is too large for 32-bit type 'int'
Fixes: f7fa9b10edbb ("[NETLINK]: Support dynamic number of multicast groups per netlink family")
Signed-off-by: Petr Machata <petrm@nvidia.com>
---
net/netlink/af_netlink.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 7b344035bfe3..47a876ccd288 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -159,6 +159,8 @@ EXPORT_SYMBOL(do_trace_netlink_extack);
static inline u32 netlink_group_mask(u32 group)
{
+ if (group > 32)
+ return 0;
return group ? 1 << (group - 1) : 0;
}
--
2.31.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH net] af_netlink: Fix shift out of bounds in group mask calculation
2022-03-17 14:53 [PATCH net] af_netlink: Fix shift out of bounds in group mask calculation Petr Machata
@ 2022-03-17 15:10 ` Ido Schimmel
2022-03-19 5:00 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 3+ messages in thread
From: Ido Schimmel @ 2022-03-17 15:10 UTC (permalink / raw)
To: Petr Machata; +Cc: netdev, David S. Miller, Jakub Kicinski, Ido Schimmel
On Thu, Mar 17, 2022 at 03:53:06PM +0100, Petr Machata wrote:
> When a netlink message is received, netlink_recvmsg() fills in the address
> of the sender. One of the fields is the 32-bit bitfield nl_groups, which
> carries the multicast group on which the message was received. The least
> significant bit corresponds to group 1, and therefore the highest group
> that the field can represent is 32. Above that, the UB sanitizer flags the
> out-of-bounds shift attempts.
>
> Which bits end up being set in such case is implementation defined, but
> it's either going to be a wrong non-zero value, or zero, which is at least
> not misleading. Make the latter choice deterministic by always setting to 0
> for higher-numbered multicast groups.
>
> To get information about membership in groups >= 32, userspace is expected
> to use nl_pktinfo control messages[0], which are enabled by NETLINK_PKTINFO
> socket option.
> [0] https://lwn.net/Articles/147608/
>
> The way to trigger this issue is e.g. through monitoring the BRVLAN group:
>
> # bridge monitor vlan &
> # ip link add name br type bridge
>
> Which produces the following citation:
>
> UBSAN: shift-out-of-bounds in net/netlink/af_netlink.c:162:19
> shift exponent 32 is too large for 32-bit type 'int'
>
> Fixes: f7fa9b10edbb ("[NETLINK]: Support dynamic number of multicast groups per netlink family")
> Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH net] af_netlink: Fix shift out of bounds in group mask calculation
2022-03-17 14:53 [PATCH net] af_netlink: Fix shift out of bounds in group mask calculation Petr Machata
2022-03-17 15:10 ` Ido Schimmel
@ 2022-03-19 5:00 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2022-03-19 5:00 UTC (permalink / raw)
To: Petr Machata; +Cc: netdev, davem, kuba, idosch
Hello:
This patch was applied to netdev/net.git (master)
by Jakub Kicinski <kuba@kernel.org>:
On Thu, 17 Mar 2022 15:53:06 +0100 you wrote:
> When a netlink message is received, netlink_recvmsg() fills in the address
> of the sender. One of the fields is the 32-bit bitfield nl_groups, which
> carries the multicast group on which the message was received. The least
> significant bit corresponds to group 1, and therefore the highest group
> that the field can represent is 32. Above that, the UB sanitizer flags the
> out-of-bounds shift attempts.
>
> [...]
Here is the summary with links:
- [net] af_netlink: Fix shift out of bounds in group mask calculation
https://git.kernel.org/netdev/net/c/0caf6d992219
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-03-19 5:00 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-03-17 14:53 [PATCH net] af_netlink: Fix shift out of bounds in group mask calculation Petr Machata
2022-03-17 15:10 ` Ido Schimmel
2022-03-19 5:00 ` patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).