CVE-2026-98299 in Linux
Résumé
par VulDB • 06/10/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
tcp: ne pas permettre que tcp_rmem soit défini en dessous de 4096
Nous pouvons provoquer un plantage par division par zéro dans `tcp_rcvbuf_grow()` et `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); ```
La division utilise `oldval = tp->rcvq_space.space` comme diviseur. Lorsque `tp->rcvq_space.space` est égal à zéro, cela entraîne une exception de division par zéro.
`tp->rcvq_space.space` est initialisé dans `tcp_init_buffer_space()` : ```c tp->rcvq_space.space = min3(tp->rcv_ssthresh, tp->rcv_wnd, (u32)TCP_INIT_CWND * tp->advmss); ```
Si `tcp_rmem[1]` est configuré avec des valeurs très faibles (telles que 1), `sk->sk_rcvbuf` est initialisé à 1. Ensuite, `tcp_full_space(sk)`, qui calcule `(sk->sk_rcvbuf * scaling_ratio) >> 8`, se tronque à 0. Cela définit `tp->window_clamp = 0`, `tp->rcv_ssthresh = 0` et `tp->rcvq_space.space = 0`. Plus tard, lorsque des données arrivent et que DRS est invoqué, `tcp_rcvbuf_grow()` effectue une division par `oldval == 0`.
En 2015, le commit b1cb59cf2efe ("net: sysctl_net_core: check SNDBUF and RCVBUF for min length") a garanti que `net.core.rmem_default` et `net.core.rmem_max` ne pouvaient pas être définis en dessous de `SOCK_MIN_RCVBUF`. De même, l'appel système `setsockopt` avec l'option `SO_RCVBUF` applique `max_t(int, val * 2, SOCK_MIN_RCVBUF)`.
Cependant, `net.ipv4.tcp_rmem` avait toujours `.extra1 = SYSCTL_ONE`, permettant des valeurs arbitrairement petites.
Étant donné que `SOCK_MIN_RCVBUF` dépend de la taille de `struct sk_buff` et de l'alignement sur les lignes de cache (cacheline), sa valeur varie selon les architectures et les options de configuration. L'utilisation d'une constante fixe de 4096 garantit une borne inférieure prévisible, indépendante de l'architecture, qui est sûrement supérieure à `SOCK_MIN_RCVBUF` partout et correspond au défaut documenté de 4 Ko.
Corrigez ce problème en définissant `tcp_rmem.extra1` sur 4096 et mettez à jour la documentation.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.