🇰🇷 한글 설명
Linux 커널의 TCP 스택에서 tcp_rmem 설정값이 4096 미만으로 설정될 경우, tcp_rcvbuf_grow() 및 tcp_rcv_space_adjust() 함수에서 0으로 나누기(Division by Zero) 오류가 발생하여 시스템이 충돌할 수 있는 취약점입니다. 이는 tcp_rmem[1] 값이 매우 작게 설정될 때 수신 버퍼 공간이 0이 되어 발생하며, 이를 방지하기 위해 최소값을 4096으로 제한하도록 수정되었습니다.
💡 쉬운 설명
컴퓨터가 인터넷 데이터를 받는 통로(버퍼)의 크기를 너무 작게 설정하면, 계산 과정에서 0으로 나누는 수학적 오류가 발생해 시스템이 멈출 수 있습니다. 이 문제는 통로의 최소 크기를 안전한 수준으로 고정함으로써 해결되었습니다.
🇺🇸 원문 (English)
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.
📍 영향받는 시스템
Linux Kernel (tcp_rmem 설정이 매우 작게 구성된 시스템)
⚔️ 공격 벡터
시스템 관리자 또는 공격자가 네트워크 설정(sysctl)을 통해 tcp_rmem 값을 극도로 낮게 설정할 수 있는 경우 발생
🛡️ 대응 방법
Linux 커널을 최신 패치가 적용된 버전으로 업데이트하거나, tcp_rmem의 최소값을 4096 이상으로 유지하십시오.
🔧 검증 코드
출력된 세 개의 값 중 두 번째 값(tcp_rmem[1])이 4096보다 작은지 확인하십시오.
💻 영향받는 소프트웨어
NVIDIA Cloud Gaming Guest Driver for Linux