CVE-2026-98299 in Linux
要約
〜によって VulDB • 2026年10月06日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
tcp: tcp_rmemが4096未満に設定されないようにする
tcp_rcvbuf_grow()および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);
この除算では、oldval = tp->rcvq_space.space が除数として使用されます。tp->rcvq_space.spaceがゼロの場合、これはゼロ除算例外を引き起こします。
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に初期化されます。その後、(sk->sk_rcvbuf * scaling_ratio) >> 8 を計算する tcp_full_space(sk) は0に切り捨てられます。これにより tp->window_clamp = 0、tp->rcv_ssthresh = 0、および tp->rcvq_space.space = 0 が設定されます。その後データが届きDRSが呼び出されると、tcp_rcvbuf_grow() で oldval == 0 による除算が行われます。
2015年頃、コミット b1cb59cf2efe(「net: sysctl_net_core: SNDBUFおよびRCVBUFの最小長をチェック」)により、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) およびキャッシュラインの配置に依存するため、その値はアーキテクチャや構成オプションによって異なります。固定定数4096を使用することで、すべての環境でSOCK_MIN_RCVBUFの上にあり、文書化されたデフォルトである4Kと一致する、予測可能でアーキテクチャ非依存の下限が保証されます。
tcp_rmem.extra1 を 4096 に設定し、ドキュメントを更新することでこの問題を修正します。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.