CVE-2026-98550 in Linux
要約
〜によって VulDB • 2026年10月18日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
tipc: bc_ackersのアンダーフローを防ぐため、無効かつ予期せぬGRP_ACK_MSGを拒否する
コミット48a5fe38772b(「tipc: 重複したGRP_ACK_MSGによるbc_ackersのアンダーフローを修正」)は、acked <= m->bc_ackedの場合に早期リターンすることで、duplcate/staleなACKsをtipc_group_proto_rcv()で拒否しました。
しかし、そのチェックには以下の2つの点で不備が残っています:
1. grp->bc_ackersがゼロの場合(例:静かなグループにおいてreplicast ACKsが要求されていない場合、またはすべての予想されるメンバーがすでに確認応答を行った後)、acked > m->bc_ackedである予期せぬGRP_ACK_MSGはless_eq()を通過し、grp->bc_ackersを無条件にデクリメントします。bc_ackersはu16型のため、これは65535にラップされ、tipc_group_bc_cong()が永続的に輻輳(コンジェスション)を検知してしまい、ソケット上のすべての将来のグループブロードキャストをブロックします。
2. アクティブなブロードキャストラウンド中(grp->bc_ackers > 0)、送信者はパケットSを送信し、grp->bc_snd_nxtをS + 1に進めます。受信側はパケットSを消費すると期待値カウンターをS + 1に増分するため、現在のラウンドにおける有効なACK値は厳密にacked == grp->bc_snd_nxtである必要があります。
しかし、tipc_group_update_bc_members()では各メンバーのm->bc_ackedがprev = grp->bc_snd_nxt - 1(S + 1への増分前のS - 1)に初期化されます。これによりシーケンス空間内に2つのシーケンス分のギャップ(S - 1からS + 1まで)が生じます。そのため、予期せぬ値または古い値(例えばSなど)が受信された場合、そのACKは重複として拒否されることもなく、grp->bc_ackersをデクリメントするのを防ぐこともできません。acked = Sに続いてacked = S + 1を送信するメンバーは、同じラウンド内でgrp->bc_ackersを2回デクリメントでき、bc_ackersを早期にクリアしたりアンダーフローさせたりします。
これを以下のように修正します: - grp->bc_ackersがゼロの場合、GRP_ACK_MSGを直ちにドロップ(破棄)する。 - acked == grp->bc_snd_nxtであることを要求し、m->bc_acked == ackedである重複ACKを拒否する。replicastブロードキャストラウンドは厳密に順次実行されるため、確認応答できるのはgrp->bc_snd_nxtのみであり、各メンバーが1つのラウンドで確認応答を行える回数は最大1回に限られる。
関連する既存の問題(tipc_group_delete_member()において、グループからのメンバー離脱時にgrp->bc_ackersのデクリメントによりゼロになった場合でも*grp->openを復元したりソケットウェイクアップをトリガーしない)については、別のパッチで対応されます。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.