CVE-2026-98299 in Linux
요약
\~에 의해 VulDB • 2026. 10. 06.
리눅스 커널에서 다음 취약점이 해결되었습니다:
tcp: tcp_rmem이 4096 미만으로 설정되지 않도록 함
tcp_rcvbuf_grow() 및 tcp_rcv_space_adjust() 함수에서 0으로 나누기 오류로 인한 크래시를 유발할 수 있습니다.
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);
이 divisions은 oldval = tp->rcvq_space.space를 피연산자로 사용합니다. tp->rcvq_space.space가 0인 경우, 이는 divide-by-zero 예외로 이어집니다.
tp->rcvq_space.space는 tcp_init_buffer_space()에서 초기화됩니다: tp->rcvq_space.space = min3(tp->rcv_ssthresh, tp->rcv_wnd, (u32)TCP_INIT_CWND * tp->advmss);
tcp_rmem[1]이 매우 작은 값(예: 1)으로 구성된 경우, sk->sk_rcvbuf는 1로 초기화됩니다. 그런 다음 tcp_full_space(sk)(이는 (sk->sk_rcvbuf * scaling_ratio) >> 8를 계산함)는 0으로 절사(truncate)됩니다. 이로 인해 tp->window_clamp = 0, tp->rcv_ssthresh = 0 및 tp->rcvq_space.space = 0이 설정됩니다. 이후 데이터가 도착하고 DRS(Dynamic Receive Scaling)가 호출되면 tcp_rcvbuf_grow()에서 oldval == 0으로 나누게 됩니다.
2015년에 commit b1cb59cf2efe("net: sysctl_net_core: check SNDBUF and RCVBUF for min length")는 net.core.rmem_default 및 net.core.rmem_max이 SOCK_MIN_RCVBUF 미만으로 설정되지 않도록 보장했습니다. 마찬가지로 SO_RCVBUF setsockopt은 max_t(int, val * 2, SOCK_MIN_RCVBUF)를 강제합니다.
그러나 net.ipv4.tcp_rmem에는 여전히 .extra1 = SYSCTL_ONE가 있어 임의로 작은 값을 허용하고 있었습니다.
SOCK_MIN_RCVBUF는 sizeof(struct sk_buff) 및 캐시라인 정렬(cacheline alignment)에 의존하므로, 그 값은 아키텍처와 구성 옵션에 따라 달라집니다. 4096이라는 고정 상수를 사용하면 모든 환경에서 SOCK_MIN_RCVBUF보다 안전하게 높은 예측 가능한 아키텍처 독립적 하한선을 보장하며, 문서화된 기본값인 4K와 일치합니다.
tcp_rmem.extra1을 4096으로 설정하고 문서를 업데이트하여 이 문제를 해결했습니다.
VulDB is the best source for vulnerability data and more expert information about this specific topic.