CVE-2026-98550 in Linux
Résumé
par VulDB • 19/10/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
tipc : rejeter les messages GRP_ACK_MSG invalides et inattendus pour prévenir un débordement par défaut (underflow) de bc_ackers
Le commit 48a5fe38772b (« tipc: fix bc_ackers underflow on duplicate GRP_ACK_MSG ») rejetait les accusés de réception (ACKs) dupliqués ou périmés dans `tipc_group_proto_rcv()` en retournant prématurément lorsque la condition `less_eq(acked, m->bc_acked)` était vraie.
Cependant, cette vérification reste incomplète à deux égards :
1. Lorsque `grp->bc_ackers` est égal à zéro (par exemple sur un groupe inactif, lorsque les accusés de réception replicast n'ont pas été demandés, ou après que tous les membres attendus ont déjà acquitté), un message GRP_ACK_MSG inattendu avec une valeur `acked > m->bc_acked` passe la condition `less_eq()` et décrémente sans condition `grp->bc_ackers`. Comme `bc_ackers` est un entier non signé sur 16 bits (u16), cela provoque un débordement par défaut jusqu'à 65535, entraînant une congestion permanente signalée par `tipc_group_bc_cong()` et bloquant toutes les futures diffusions de groupe sur la socket.
2. Pendant un tour de diffusion actif (`grp->bc_ackers > 0`), l'émetteur transmet le paquet S et incrémente `grp->bc_snd_nxt` à `S + 1`. Les récepteurs incrémentent leur compteur attendu à `S + 1` après avoir consommé le paquet S, de sorte que la seule valeur ACK valide pour le tour en cours est strictement `acked == grp->bc_snd_nxt`.
Cependant, `tipc_group_update_bc_members()` initialise le champ `m->bc_acked` de chaque membre à `prev = grp->bc_snd_nxt - 1` (soit S - 1 avant l'incrémentation). Cela laisse un écart de séquence de 2 valeurs (de S - 1 à S + 1) dans l'espace des séquences. Un accusé de réception entrant n'est donc ni rejeté comme dupliqué, ni empêché de décrémenter `grp->bc_ackers` si une valeur inattendue ou périmée (telle que S) est reçue. Un membre envoyant un ACK avec la valeur `acked = S`, suivi d'un ACK avec `acked = S + 1`, pourrait ainsi décrémenter `grp->bc_ackers` deux fois au cours du même tour, vidant prématurément `bc_ackers` ou provoquant son débordement par défaut.
Correction apportée en : - Détruisant immédiatement le message GRP_ACK_MSG si `grp->bc_ackers` est égal à zéro. - Exigeant que la condition `acked == grp->bc_snd_nxt` soit respectée et rejetant les doublés où `m->bc_acked == acked`. Les tours de diffusion replicast étant strictement séquentiels, seul `grp->bc_snd_nxt` peut être acquitté, et chaque membre ne peut effectuer qu'une seule opération d'acquittement par tour.
Notez qu'un problème préexistant connexe dans `tipc_group_delete_member()` (où la décrémentation de `grp->bc_ackers` à zéro lors du départ d'un membre ne restaure pas *grp->open ni ne déclenche un réveil de socket) sera traité dans un correctif séparé.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.