| 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-35884: udp: do not accept non-tunnel GSO skbs landing in a tunnel |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| udp: do not accept non-tunnel GSO skbs landing in a tunnel |
| |
| When rx-udp-gro-forwarding is enabled UDP packets might be GROed when |
| being forwarded. If such packets might land in a tunnel this can cause |
| various issues and udp_gro_receive makes sure this isn't the case by |
| looking for a matching socket. This is performed in |
| udp4/6_gro_lookup_skb but only in the current netns. This is an issue |
| with tunneled packets when the endpoint is in another netns. In such |
| cases the packets will be GROed at the UDP level, which leads to various |
| issues later on. The same thing can happen with rx-gro-list. |
| |
| We saw this with geneve packets being GROed at the UDP level. In such |
| case gso_size is set; later the packet goes through the geneve rx path, |
| the geneve header is pulled, the offset are adjusted and frag_list skbs |
| are not adjusted with regard to geneve. When those skbs hit |
| skb_fragment, it will misbehave. Different outcomes are possible |
| depending on what the GROed skbs look like; from corrupted packets to |
| kernel crashes. |
| |
| One example is a BUG_ON[1] triggered in skb_segment while processing the |
| frag_list. Because gso_size is wrong (geneve header was pulled) |
| skb_segment thinks there is "geneve header size" of data in frag_list, |
| although it's in fact the next packet. The BUG_ON itself has nothing to |
| do with the issue. This is only one of the potential issues. |
| |
| Looking up for a matching socket in udp_gro_receive is fragile: the |
| lookup could be extended to all netns (not speaking about performances) |
| but nothing prevents those packets from being modified in between and we |
| could still not find a matching socket. It's OK to keep the current |
| logic there as it should cover most cases but we also need to make sure |
| we handle tunnel packets being GROed too early. |
| |
| This is done by extending the checks in udp_unexpected_gso: GSO packets |
| lacking the SKB_GSO_UDP_TUNNEL/_CSUM bits and landing in a tunnel must |
| be segmented. |
| |
| [1] kernel BUG at net/core/skbuff.c:4408! |
| RIP: 0010:skb_segment+0xd2a/0xf70 |
| __udp_gso_segment+0xaa/0x560 |
| |
| The Linux kernel CVE team has assigned CVE-2024-35884 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 5.6 with commit 9fd1ff5d2ac7181844735806b0a703c942365291 and fixed in 5.10.215 with commit 3391b157780bbedf8ef9f202cbf10ee90bf6b0f8 |
| Issue introduced in 5.6 with commit 9fd1ff5d2ac7181844735806b0a703c942365291 and fixed in 5.15.154 with commit d49ae15a5767d4e9ef8bbb79e42df1bfebc94670 |
| Issue introduced in 5.6 with commit 9fd1ff5d2ac7181844735806b0a703c942365291 and fixed in 6.1.85 with commit d12245080cb259d82b34699f6cd4ec11bdb688bd |
| Issue introduced in 5.6 with commit 9fd1ff5d2ac7181844735806b0a703c942365291 and fixed in 6.6.26 with commit 3001e7aa43d6691db2a878b0745b854bf12ddd19 |
| Issue introduced in 5.6 with commit 9fd1ff5d2ac7181844735806b0a703c942365291 and fixed in 6.8.5 with commit 35fe0e0b5c00bef7dde74842a2564c43856fbce4 |
| Issue introduced in 5.6 with commit 9fd1ff5d2ac7181844735806b0a703c942365291 and fixed in 6.9 with commit 3d010c8031e39f5fa1e8b13ada77e0321091011f |
| |
| 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-35884 |
| 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: |
| include/linux/udp.h |
| net/ipv4/udp.c |
| net/ipv4/udp_offload.c |
| net/ipv6/udp.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/3391b157780bbedf8ef9f202cbf10ee90bf6b0f8 |
| https://git.kernel.org/stable/c/d49ae15a5767d4e9ef8bbb79e42df1bfebc94670 |
| https://git.kernel.org/stable/c/d12245080cb259d82b34699f6cd4ec11bdb688bd |
| https://git.kernel.org/stable/c/3001e7aa43d6691db2a878b0745b854bf12ddd19 |
| https://git.kernel.org/stable/c/35fe0e0b5c00bef7dde74842a2564c43856fbce4 |
| https://git.kernel.org/stable/c/3d010c8031e39f5fa1e8b13ada77e0321091011f |