]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
vsock: Do not allow binding to VMADDR_PORT_ANY
authorBudimir Markovic <markovicbudimir@gmail.com>
Thu, 7 Aug 2025 04:18:11 +0000 (04:18 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:22:38 +0000 (16:22 +0200)
commit aba0c94f61ec05315fa7815d21aefa4c87f6a9f4 upstream.

It is possible for a vsock to autobind to VMADDR_PORT_ANY. This can
cause a use-after-free when a connection is made to the bound socket.
The socket returned by accept() also has port VMADDR_PORT_ANY but is not
on the list of unbound sockets. Binding it will result in an extra
refcount decrement similar to the one fixed in fcdd2242c023 (vsock: Keep
the binding until socket destruction).

Modify the check in __vsock_bind_connectible() to also prevent binding
to VMADDR_PORT_ANY.

Fixes: d021c344051a ("VSOCK: Introduce VM Sockets")
Reported-by: Budimir Markovic <markovicbudimir@gmail.com>
Signed-off-by: Budimir Markovic <markovicbudimir@gmail.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Link: https://patch.msgid.link/20250807041811.678-1-markovicbudimir@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/vmw_vsock/af_vsock.c

index 56bbc2970ffef0b6e76a078b2a1d551b23fa9d3a..f04b39c601f89ed8bce6fe79acc85ba12dc0316c 100644 (file)
@@ -674,7 +674,8 @@ static int __vsock_bind_stream(struct vsock_sock *vsk,
                unsigned int i;
 
                for (i = 0; i < MAX_PORT_RETRIES; i++) {
-                       if (port <= LAST_RESERVED_PORT)
+                       if (port == VMADDR_PORT_ANY ||
+                           port <= LAST_RESERVED_PORT)
                                port = LAST_RESERVED_PORT + 1;
 
                        new_addr.svm_port = port++;