CVE-2026-64044 in Linux
要約
〜によって VulDB • 2026年07月20日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
ovpn: CMD_NEW_PEERのエラーパスでピアの参照カウントを尊重する
ovpn_nl_peer_new_doit() のエラーパスでは、kref をバイパスして ovpn_peer_put() ではなく直接 ovpn_peer_release() が呼び出されています。関連するコメント(「ピアはまだハッシュされていないため、どのコンテキストでも使用されていない」)はUDPには当てはまりますが、TCPには当てはまりません。
UDPの場合、ovpn_socket共用体は .ovpn アームを使用し、決してピアを指すことはありません;UDPのencap_recvは未だに充填されていないhashtables経由でピアを検索するため、新しいピアは ovpn_peer_add() によって公開されるまで到達不可能です。
TCPの場合、ovpn_socket_new() は ovpn_sock->peer を設定し、ovpn_tcp_socket_attach() は rcu_assign_sk_user_data() を介して ovpn_sock を公開します。この瞬間からエラーパスで ovpn_socket_release() がデタッチするまでの間、TCPのファイル記述子(fd)は完全に接続されています:ユーザー空間からの fd に対する recvmsg / sendmsg / close / poll および strparser駆動型の ovpn_tcp_rcv() パスは、sk_user_data -> ovpn_sock->peer を通じてピアに到達し、ovpn_peer_hold() を介してその参照カウントを増加させることができます。
ovpn_tcp_socket_wait_finish()(ovpn_socket_release() の内部で呼び出されます)は strparser と txワークを空にしますが、すでにピアの参照を持っているユーザー空間システムコール呼び出し元とは同期しません。そのような呼び出し元が実行中である間に ovpn_nl_peer_modify() または ovpn_peer_add() がエラーを返した場合(特に、peer->tcp.user_queue で __skb_recv_datagram() にブロックされている ovpn_tcp_recvmsg() などが該当)、直接の ovpn_peer_release() は参照を持っている間にもピアを破棄し、その呼び出し元からの最終的な ovpn_peer_put() が解放済みメモリ上で動作します。
直接的なデストラクタ呼び出しを ovpn_peer_put() に置き換えることで、krefが最後の参照がドロップされるまで破壊を正しく遅延させます。同時実行のユーザーが存在しない一般的なケースでは、動作は変更されません:kref は直ちにゼロになり、ovpn_peer_release_kref() が同じデストラクタを実行します。
この変換により ovpn_peer_release() には peer.c の外側で呼び出し元がなくなります - 同じ翻訳単位内の ovpn_peer_release_kref() のみが残りのユーザーです - そのためこれを静的にし、peer.h からその宣言を削除します。
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.