CVE-2021-47304·Kernel vulnerability
In the Linux kernel, the following vulnerability has been resolved: tcp: fix tcp_init_transfer() to not reset icsk_ca_initialized This commit fixes a bug (found by syzkaller) that could cause spurious double-initializations for congestion control modules, which could cause memory leaks or other problems for congestion control modules (like CDG) that allocate memory in their init functions. The buggy scenario constructed by syzkaller was something like: (1) create a TCP socket (2) initiate a TFO connect via sendto() (3) while socket is in TCP_SYN_SENT, call setsockopt(TCP_CONGESTION), which calls: tcp_set_congestion_control() -> tcp_reinit_congestion_control() -> tcp_init_congestion_control() (4) receive ACK, connection is established, call tcp_init_transfer(), set icsk_ca_initialized=0 (without first calling cc->release()), call tcp_init_congestion_control() again. Note that in this sequence tcp_init_congestion_control() is called twice without a cc->release() call in between. Thus, for CC modules that allocate memory in their init() function, e.g, CDG, a memory leak may occur. The syzkaller tool managed to find a reproducer that triggered such a leak in CDG. The bug was introduced when that commit 8919a9b31eb4 ("tcp: Only init congestion control if not initialized already") introduced icsk_ca_initialized and set icsk_ca_initialized to 0 in tcp_init_transfer(), missing the possibility for a sequence like the one above, where a process could call setsockopt(TCP_CONGESTION) in state TCP_SYN_SENT (i.e. after the connect() or TFO open sendmsg()), which would call tcp_init_congestion_control(). It did not intend to reset any initialization that the user had already explicitly made; it just missed the possibility of that particular sequence (which syzkaller managed to find).
- Severity
- medium
- Software
- Kernel
- Fixed in
- 5.13.5
- Published
- 2024-05-21
Affected versions
From: 5.11
Until: 5.13.5
Fixed in: 5.13.5
How to fix this CVE
Update your Linux kernel to version 5.13.5 or later to resolve this TCP congestion control initialization bug. The vulnerability allows memory leaks when congestion control modules (like CDG) are re-initialized improperly during specific socket state transitions. Apply the kernel update through your distribution's package manager and reboot to complete the remediation.
sudo dnf update kernel kernel-devel && sudo rebootDefensia detects this vulnerability
How to check if you are affected
- Check current kernel version: uname -r (compare against 5.13.5; versions 5.11.x through 5.13.4 are vulnerable)
- Verify if TCP_CONGESTION socket option is in use: grep -r 'TCP_CONGESTION' /proc/*/net/tcp 2>/dev/null or inspect application source for setsockopt() calls with TCP_CONGESTION
- Monitor kernel logs for memory allocation failures: sudo journalctl -u kernel | grep -i 'memory\|leak\|alloc' to identify if CDG or other CC modules are experiencing allocation issues
- After patching, confirm new kernel is active: uname -r should show version 5.13.5 or later, and reboot should have completed successfully with no pending kernel updates
FAQ
What is CVE-2021-47304?
This is a kernel bug where TCP's congestion control initialization flag is improperly reset during connection establishment, causing congestion control modules to be initialized twice without proper cleanup, potentially leading to memory leaks or module corruption.
Is CVE-2021-47304 being actively exploited?
No, this vulnerability is not listed on the CISA KEV catalog and has no public exploits available. However, it can be triggered reliably through specific socket manipulation sequences.
What versions of Kernel are affected by CVE-2021-47304?
Linux kernel versions 5.11.0 through 5.13.4 are affected. Version 5.13.5 and later contain the fix.
How do I check if my server is vulnerable to CVE-2021-47304?
Run 'uname -r' to retrieve your kernel version. If the output shows a version between 5.11 and 5.13.4 (inclusive), your system is vulnerable.
Does Defensia detect CVE-2021-47304?
Yes — Defensia's CVE advisory scanner compares installed package versions against the NVD database. If Kernel is installed on a monitored server, CVE-2021-47304 will appear in your dashboard with remediation steps.
Related Kernel CVEs
References
- https://git.kernel.org/stable/c/ad4ba3404931745a5977ad12db4f0c34080e52f7
- https://git.kernel.org/stable/c/be5d1b61a2ad28c7e57fe8bfa277373e8ecffcdc
- https://git.kernel.org/stable/c/fe77b85828ca9ddc42977b79de9e40d18545b4fe
- https://git.kernel.org/stable/c/ad4ba3404931745a5977ad12db4f0c34080e52f7
- https://git.kernel.org/stable/c/be5d1b61a2ad28c7e57fe8bfa277373e8ecffcdc
Track CVEs across your fleet automatically
Defensia scans your Linux servers and tells you exactly which ones are running vulnerable versions — including CVE-2021-47304. Free for 1 server.
Get started free