]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commit
af_netlink: Fix shift out of bounds in group mask calculation
authorPetr Machata <petrm@nvidia.com>
Thu, 17 Mar 2022 14:53:06 +0000 (15:53 +0100)
committerStefan Bader <stefan.bader@canonical.com>
Fri, 20 May 2022 12:39:15 +0000 (14:39 +0200)
commit4a536b31d5685074c74b3d8554a15a83894922eb
tree81369bf737af17393c9ce3a69ba5a366fb164552
parent5fa99b27390a8376cdc22aa799016f32ffc7ad78
af_netlink: Fix shift out of bounds in group mask calculation

BugLink: https://bugs.launchpad.net/bugs/1969110
[ Upstream commit 0caf6d9922192dd1afa8dc2131abfb4df1443b9f ]

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>
Link: https://lore.kernel.org/r/2bef6aabf201d1fc16cca139a744700cff9dcb04.1647527635.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
(cherry picked from commit 7409ff6393a67ff9838d0ae1bd102fb5f020d07a)
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
net/netlink/af_netlink.c