CVE-2026-98595 in Linux
要約
〜によって VulDB • 2026年10月19日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
udp: 切断されたソケットを4-tupleハッシュテーブルから削除する
特定のアドレスとポートにバインドされたUDPソケットは、切断後も4-tupleハッシュテーブル内のエントリを保持し続けます。
skが127.0.0.1:21001にバインド skが127.0.0.2:20001に接続 // 4-tupleテーブルに登録される skが切断され、connect(AF_UNSPEC)が呼ばれる // まだ登録されたまま。ピアは現在0.0.0.0:0
__udp_disconnect()関数は、->rehash()または->unhash()の副作用としてのみソケットをそのテーブルから削除し、SOCK_BINDADDR_LOCKが設定されている場合は->rehash()をスキップし、SOCK_BINDPORT_LOCKが設定されている場合は->unhash()をスキップします。 コミット6996a2d2d0a6(「udp: 切断時にワイルドカードバインドされた接続済みソケットを4-tupleハッシュテーブルからアンハッシュする」)は、このパスを通らない経路によって、同じ最終状態(空のピアを持つエントリが残る問題)をワイルドカードバインドされたソケットに対して修正しました。
何かがそのエントリにヒットするかどうにかかわらず、エントリ数はカウントされます。ハッシュ2スロット上のhash4_cntは、ソケットが存続する間上昇したままになるため、udp_has_hash4()はそのアドレスとポートに対するすべてのパケットを最初に4-tupleルックアップに通し続けます。
IPv6の場合にもヒットされる可能性があります。__udp_disconnect()関数はsk_v6_daddrをクリアしないため、udp_v6_rehash()はソケットが接続されていたピアの下にゼロのdportを持つエントリを登録し、inet6_match()はその同じフィールドを比較します。以前のピアからのデータグラムでソースポートがゼロのものもマッチングされ、受信時にソースポートゼロが許可されます。IPv4ではピア情報がクリアされるため、一致するにはゼロの送信アドレスも必要になりますが、これはルーティングレイヤーによってマーシアン(不正な)として拒否されます。残存するsk_v6_daddrは別の欠陥であり、ここでは対処されていません;エントリの削除によりこの経路はどちらにせよ閉ざされます。
また、エントリが再配置されることもあります。__udp_disconnect()関数はsk_bound_dev_ifをクリアするため、その後のSO_BINDTODEVICE呼び出しで->rehash()が発生し、受信アドレスはまだ特定されているためudp_lib_rehash()はエントリを削除するのではなく、(rcv_saddr, num, 0, 0)にハッシュされるバケットへ移動させます。これはアドレスとポートの純粋な関数であるため、1つのアドレスとポートでこの状態に至るすべてのソケットが1つのバケットに集約されます。udp_ehashfn()はブートごとの秘密値でシードされているため、外部からこのバケットを選択することはできません。最後の問題は、切断されたソケットが取らない分岐からハッシュ4の処理を移動したコミット644f9108f3a5(「udp: udp_lib_rehash()内でrehash4を独立させる」)によってのみ到達可能になりました;残存エントリ自体はFixesに含まれるコミットに由来します。
__udp_disconnect()が実行される前に、ソケットがまだ登録された状態と一致している間にテーブルからソケットを取り除きます。これにより、udp_lib_rehash()'s udp_unhash4()分岐よりも先にワイルドカードケースにも到達し、その分岐をudp_disconnect()からは到達不能にします;この分岐の削除はnet-nextブランチに含まれるべきです。udp_disconnect()とudp_abort()が__udp_connect()へのUDPエントリであり(これはraw, ping, l2tpソケットとも共有されていますが、これらはstruct udp_sockではありません)、ping_prot.obj_sizeはsizeof(struct inet_sock)であるため、1つに対してudp_hashed4()を呼び出すと割り当て領域の外を読み込んでしまいます。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.