Linux: tcp: do not let tcp_rmem be set below 4096
What fixes it
- 879907631b9e70eedb62d76461b29afa106ebe7aLinuxCVE List
- 8e32532d0fa3191ecf9524b0e6bafa0832e712baLinuxCVE List
- 67b83c15bed9eeeb8d1a6dbf88a5f79525970173LinuxCVE List
- 9a4f49bf8d2da4e52e904f60c29cca317bab9b3aLinuxCVE List
- 60df201dbb19a1bf6478b56d100f7ae1fe90e46aLinuxCVE List
- 7898bda1ebc198f5559b301a96dd5398edd4d4d3LinuxCVE List
Show all 8 fixed versions
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:
tcp: do not let tcp_rmem be set below 4096
We can hit a division by zero crash in tcp_rcvbuf_grow() and tcp_rcv_space_adjust():
divide error: 0000 [#1] PREEMPT SMP RIP: 0010:tcp_rcvbuf_grow+0x187/0x450 net/ipv4/tcp_input.c:939 ... grow = div_u64(((u64)rcvwin << 1) * (newval - oldval), oldval);
The division uses oldval = tp->rcvq_space.space as divisor. When tp->rcvq_space.space is zero, this leads to a divide-by-zero exception.
tp->rcvq_space.space is initialized in tcp_init_buffer_space(): tp->rcvq_space.space = min3(tp->rcv_ssthresh, tp->rcv_wnd, (u32)TCP_INIT_CWND * tp->advmss);
If tcp_rmem[1] is configured to very small values (such as 1), sk->sk_rcvbuf is initialized to 1. Then tcp_full_space(sk), which computes (sk->sk_rcvbuf * scaling_ratio) >> 8, truncates to 0. This sets tp->window_clamp = 0, tp->rcv_ssthresh = 0, and tp->rcvq_space.space = 0. Later, when data arrives and DRS is invoked, tcp_rcvbuf_grow() divides by oldval == 0.
Back in 2015, commit b1cb59cf2efe ("net: sysctl_net_core: check SNDBUF and RCVBUF for min length") ensured that net.core.rmem_default and net.core.rmem_max cannot be set below SOCK_MIN_RCVBUF. Similarly, SO_RCVBUF setsockopt enforces max_t(int, val * 2, SOCK_MIN_RCVBUF).
However, net.ipv4.tcp_rmem still had .extra1 = SYSCTL_ONE, allowing arbitrarily small values.
Because SOCK_MIN_RCVBUF depends on sizeof(struct sk_buff) and cacheline alignment, its value varies across architectures and configuration options. Using a fixed constant of 4096 ensures a predictable, architecture- independent lower bound that is safely above SOCK_MIN_RCVBUF everywhere and matches the documented 4K default.
Fix this by setting tcp_rmem.extra1 to 4096 and updating the documentation.
Text from CVE List
Affected versions 18
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 879907631b9e70eedb62d76461b29afa106ebe7aCVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 8e32532d0fa3191ecf9524b0e6bafa0832e712baCVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 67b83c15bed9eeeb8d1a6dbf88a5f79525970173CVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 9a4f49bf8d2da4e52e904f60c29cca317bab9b3aCVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 60df201dbb19a1bf6478b56d100f7ae1fe90e46aCVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 7898bda1ebc198f5559b301a96dd5398edd4d4d3CVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 1c4bb940c3bb4325bb88ac1b7eaf5faaa39e7d63CVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 83a945a529d6e002dd7339c532288a931f463dbaCVE List
- Linuxaffected: 2.6.12CVE List
- Linuxunaffected: all versions before 2.6.12CVE List
- Linuxunaffected: 5.10.271 through 5.10.*CVE List
- Linuxunaffected: 5.15.222 through 5.15.*CVE List
- Linuxunaffected: 6.1.189 through 6.1.*CVE List
- Linuxunaffected: 6.6.158 through 6.6.*CVE List
- Linuxunaffected: 6.12.112 through 6.12.*CVE List
- Linuxunaffected: 6.18.54 through 6.18.*CVE List
- Linuxunaffected: 7.2.8 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 8
- git.kernel.org/stable/c/879907631b9e70eedb62d76461b29afa106ebe7aReferencevia CVE List
- git.kernel.org/stable/c/8e32532d0fa3191ecf9524b0e6bafa0832e712baReferencevia CVE List
- git.kernel.org/stable/c/67b83c15bed9eeeb8d1a6dbf88a5f79525970173Referencevia CVE List
- git.kernel.org/stable/c/9a4f49bf8d2da4e52e904f60c29cca317bab9b3aReferencevia CVE List
- git.kernel.org/stable/c/60df201dbb19a1bf6478b56d100f7ae1fe90e46aReferencevia CVE List
- git.kernel.org/stable/c/7898bda1ebc198f5559b301a96dd5398edd4d4d3Referencevia CVE List
- git.kernel.org/stable/c/1c4bb940c3bb4325bb88ac1b7eaf5faaa39e7d63Referencevia CVE List
- git.kernel.org/stable/c/83a945a529d6e002dd7339c532288a931f463dbaReferencevia CVE List