| From bippy-5f407fcff5a0 Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| To: <linux-cve-announce@vger.kernel.org> |
| Reply-to: <cve@kernel.org>, <linux-kernel@vger.kernel.org> |
| Subject: CVE-2024-26596: net: dsa: fix netdev_priv() dereference before check on non-DSA netdevice events |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| net: dsa: fix netdev_priv() dereference before check on non-DSA netdevice events |
| |
| After the blamed commit, we started doing this dereference for every |
| NETDEV_CHANGEUPPER and NETDEV_PRECHANGEUPPER event in the system. |
| |
| static inline struct dsa_port *dsa_user_to_port(const struct net_device *dev) |
| { |
| struct dsa_user_priv *p = netdev_priv(dev); |
| |
| return p->dp; |
| } |
| |
| Which is obviously bogus, because not all net_devices have a netdev_priv() |
| of type struct dsa_user_priv. But struct dsa_user_priv is fairly small, |
| and p->dp means dereferencing 8 bytes starting with offset 16. Most |
| drivers allocate that much private memory anyway, making our access not |
| fault, and we discard the bogus data quickly afterwards, so this wasn't |
| caught. |
| |
| But the dummy interface is somewhat special in that it calls |
| alloc_netdev() with a priv size of 0. So every netdev_priv() dereference |
| is invalid, and we get this when we emit a NETDEV_PRECHANGEUPPER event |
| with a VLAN as its new upper: |
| |
| $ ip link add dummy1 type dummy |
| $ ip link add link dummy1 name dummy1.100 type vlan id 100 |
| [ 43.309174] ================================================================== |
| [ 43.316456] BUG: KASAN: slab-out-of-bounds in dsa_user_prechangeupper+0x30/0xe8 |
| [ 43.323835] Read of size 8 at addr ffff3f86481d2990 by task ip/374 |
| [ 43.330058] |
| [ 43.342436] Call trace: |
| [ 43.366542] dsa_user_prechangeupper+0x30/0xe8 |
| [ 43.371024] dsa_user_netdevice_event+0xb38/0xee8 |
| [ 43.375768] notifier_call_chain+0xa4/0x210 |
| [ 43.379985] raw_notifier_call_chain+0x24/0x38 |
| [ 43.384464] __netdev_upper_dev_link+0x3ec/0x5d8 |
| [ 43.389120] netdev_upper_dev_link+0x70/0xa8 |
| [ 43.393424] register_vlan_dev+0x1bc/0x310 |
| [ 43.397554] vlan_newlink+0x210/0x248 |
| [ 43.401247] rtnl_newlink+0x9fc/0xe30 |
| [ 43.404942] rtnetlink_rcv_msg+0x378/0x580 |
| |
| Avoid the kernel oops by dereferencing after the type check, as customary. |
| |
| The Linux kernel CVE team has assigned CVE-2024-26596 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 6.1 with commit 4c3f80d22b2eca911143ce656fa45c4699ff5bf4 and fixed in 6.1.129 with commit 9e9953f5e4d6d11a9dad56fdee307bb923302809 |
| Issue introduced in 6.1 with commit 4c3f80d22b2eca911143ce656fa45c4699ff5bf4 and fixed in 6.6.55 with commit 69a1e2d938dbbfcff0e064269adf60ad26dbb102 |
| Issue introduced in 6.1 with commit 4c3f80d22b2eca911143ce656fa45c4699ff5bf4 and fixed in 6.7.2 with commit dbd909c20c11f0d29c0054d41e0d1f668a60e8c8 |
| Issue introduced in 6.1 with commit 4c3f80d22b2eca911143ce656fa45c4699ff5bf4 and fixed in 6.8 with commit 844f104790bd69c2e4dbb9ee3eba46fde1fcea7b |
| |
| Please see https://www.kernel.org for a full list of currently supported |
| kernel versions by the kernel community. |
| |
| Unaffected versions might change over time as fixes are backported to |
| older supported kernel versions. The official CVE entry at |
| https://cve.org/CVERecord/?id=CVE-2024-26596 |
| will be updated if fixes are backported, please check that for the most |
| up to date information about this issue. |
| |
| |
| Affected files |
| ============== |
| |
| The file(s) affected by this issue are: |
| net/dsa/user.c |
| |
| |
| Mitigation |
| ========== |
| |
| The Linux kernel CVE team recommends that you update to the latest |
| stable kernel version for this, and many other bugfixes. Individual |
| changes are never tested alone, but rather are part of a larger kernel |
| release. Cherry-picking individual commits is not recommended or |
| supported by the Linux kernel community at all. If however, updating to |
| the latest release is impossible, the individual changes to resolve this |
| issue can be found at these commits: |
| https://git.kernel.org/stable/c/9e9953f5e4d6d11a9dad56fdee307bb923302809 |
| https://git.kernel.org/stable/c/69a1e2d938dbbfcff0e064269adf60ad26dbb102 |
| https://git.kernel.org/stable/c/dbd909c20c11f0d29c0054d41e0d1f668a60e8c8 |
| https://git.kernel.org/stable/c/844f104790bd69c2e4dbb9ee3eba46fde1fcea7b |