Linux: net: ipv4: Fix UDP length overflow with PMTU discover and big MTU
What fixes it
- 83fedc4741210f75be8ca5b487985a242bf6f18dLinuxCVE List
- 81f540827d243b8dad76c1f44e70ea31719f393cLinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
In the Linux kernel, the following vulnerability has been resolved:
net: ipv4: Fix UDP length overflow with PMTU discover and big MTU
This commit bounds cork->base.fragsize to IP_MAX_MTU to avoid a possible overflow of UDP length that triggers a WARN in udp_set_len_short when setsockopt IP_MTU_DISCOVER is set to IP_PMTUDISC_PROBE, and a large packet is sent over a netdev with an unusually large MTU.
Steps to reproduce:
- Set device MTU bigger than IP_MAX_MTU + 20. cork->base.fragsize will
be set to that MTU in ip_setup_cork.
- Set IP_MTU_DISCOVER to IP_PMTUDISC_PROBE. It lets maxnonfragsize be
set to device MTU (cork->fragsize) in __ip_append_data, rather than to IP_MAX_MTU.
- Send 65528 bytes of payload (+8 bytes of UDP header, +20 bytes of
IPv4 header). Device MTU allows it (it's only one byte bigger than IP_MAX_MTU + IPv4 header, and the device MTU is bigger than that).
- The UDP length in the built packet is 65536, which overflows the
16-bit length field and triggers the WARN in udp_set_len_short.
Note: IP_PMTUDISC_DO with IPv4 is safe, because ip_dst_mtu_maybe_forward always clamps at IP_MAX_MTU, unlike ip6_dst_mtu_maybe_forward.
The Fixes tag points at the first commit where I could reproduce the overflow with IPv4 and IP_PMTUDISC_PROBE.
Text from CVE List
Affected versions 8
- Linuxaffected: daba287b299ec7a2c61ae3a714920e90e8396ad5 before 83fedc4741210f75be8ca5b487985a242bf6f18dCVE List
- Linuxaffected: daba287b299ec7a2c61ae3a714920e90e8396ad5 before 81f540827d243b8dad76c1f44e70ea31719f393cCVE List
- Linuxaffected: daba287b299ec7a2c61ae3a714920e90e8396ad5 before b83641e0ab8b20eefcc4cdc5a059f897375291a2CVE List
- Linuxaffected: 3.13CVE List
- Linuxunaffected: all versions before 3.13CVE List
- Linuxunaffected: 6.18.53 through 6.18.*CVE List
- Linuxunaffected: 7.2.7 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List