Commit aba0c94f authored by Budimir Markovic's avatar Budimir Markovic Committed by Jakub Kicinski
Browse files

vsock: Do not allow binding to VMADDR_PORT_ANY



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 fcdd2242 (vsock: Keep
the binding until socket destruction).

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

Fixes: d021c344 ("VSOCK: Introduce VM Sockets")
Reported-by: default avatarBudimir Markovic <markovicbudimir@gmail.com>
Signed-off-by: default avatarBudimir Markovic <markovicbudimir@gmail.com>
Reviewed-by: default avatarStefano Garzarella <sgarzare@redhat.com>
Link: https://patch.msgid.link/20250807041811.678-1-markovicbudimir@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 5f1d1d14
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -689,7 +689,8 @@ static int __vsock_bind_connectible(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++;