Skip to content

Commit 2ec0613

Browse files
author
CKI KWF Bot
committed
Merge: CVE-2025-38461: vsock: Fix transport_* TOCTOU
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/7189 JIRA: https://issues.redhat.com/browse/RHEL-106002 CVE: CVE-2025-38461 ``` commit 687aa0c Author: Michal Luczaj <mhal@rbox.co> Date: Thu Jul 3 17:18:19 2025 +0200 vsock: Fix transport_* TOCTOU Transport assignment may race with module unload. Protect new_transport from becoming a stale pointer. This also takes care of an insecure call in vsock_use_local_transport(); add a lockdep assert. BUG: unable to handle page fault for address: fffffbfff8056000 Oops: Oops: 0000 [#1] SMP KASAN RIP: 0010:vsock_assign_transport+0x366/0x600 Call Trace: vsock_connect+0x59c/0xc40 __sys_connect+0xe8/0x100 __x64_sys_connect+0x6e/0xc0 do_syscall_64+0x92/0x1c0 entry_SYSCALL_64_after_hwframe+0x4b/0x53 Fixes: c0cfa2d ("vsock: add multi-transports support") Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> Signed-off-by: Michal Luczaj <mhal@rbox.co> Link: https://patch.msgid.link/20250703-vsock-transports-toctou-v4-2-98f0eb530747@rbox.co Signed-off-by: Jakub Kicinski <kuba@kernel.org> ``` Signed-off-by: CKI Backport Bot <cki-ci-bot+cki-gitlab-backport-bot@redhat.com> Signed-off-by: Jon Maloy <jmaloy@redhat.com> --- <small>Created 2025-07-30 14:06 UTC by backporter - [KWF FAQ](https://red.ht/kernel_workflow_doc) - [Slack #team-kernel-workflow](https://redhat-internal.slack.com/archives/C04LRUPMJQ5) - [Source](https://gitlab.com/cki-project/kernel-workflow/-/blob/main/webhook/utils/backporter.py) - [Documentation](https://gitlab.com/cki-project/kernel-workflow/-/blob/main/docs/README.backporter.md) - [Report an issue](https://issues.redhat.com/secure/CreateIssueDetails!init.jspa?pid=12334433&issuetype=1&priority=4&summary=backporter+webhook+issue&components=kernel-workflow+/+backporter)</small> Approved-by: Jon Maloy <jmaloy@redhat.com> Approved-by: Stefano Garzarella <sgarzare@redhat.com> Approved-by: Stefan Hajnoczi <stefanha@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents a6cb11a + b18a829 commit 2ec0613

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

net/vmw_vsock/af_vsock.c

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,8 @@ EXPORT_SYMBOL_GPL(vsock_enqueue_accept);
406406

407407
static bool vsock_use_local_transport(unsigned int remote_cid)
408408
{
409+
lockdep_assert_held(&vsock_register_mutex);
410+
409411
if (!transport_local)
410412
return false;
411413

@@ -463,6 +465,8 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
463465

464466
remote_flags = vsk->remote_addr.svm_flags;
465467

468+
mutex_lock(&vsock_register_mutex);
469+
466470
switch (sk->sk_type) {
467471
case SOCK_DGRAM:
468472
new_transport = transport_dgram;
@@ -478,12 +482,15 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
478482
new_transport = transport_h2g;
479483
break;
480484
default:
481-
return -ESOCKTNOSUPPORT;
485+
ret = -ESOCKTNOSUPPORT;
486+
goto err;
482487
}
483488

484489
if (vsk->transport) {
485-
if (vsk->transport == new_transport)
486-
return 0;
490+
if (vsk->transport == new_transport) {
491+
ret = 0;
492+
goto err;
493+
}
487494

488495
/* transport->release() must be called with sock lock acquired.
489496
* This path can only be taken during vsock_connect(), where we
@@ -498,8 +505,16 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
498505
/* We increase the module refcnt to prevent the transport unloading
499506
* while there are open sockets assigned to it.
500507
*/
501-
if (!new_transport || !try_module_get(new_transport->module))
502-
return -ENODEV;
508+
if (!new_transport || !try_module_get(new_transport->module)) {
509+
ret = -ENODEV;
510+
goto err;
511+
}
512+
513+
/* It's safe to release the mutex after a successful try_module_get().
514+
* Whichever transport `new_transport` points at, it won't go away until
515+
* the last module_put() below or in vsock_deassign_transport().
516+
*/
517+
mutex_unlock(&vsock_register_mutex);
503518

504519
if (sk->sk_type == SOCK_SEQPACKET) {
505520
if (!new_transport->seqpacket_allow ||
@@ -518,6 +533,9 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
518533
vsk->transport = new_transport;
519534

520535
return 0;
536+
err:
537+
mutex_unlock(&vsock_register_mutex);
538+
return ret;
521539
}
522540
EXPORT_SYMBOL_GPL(vsock_assign_transport);
523541

0 commit comments

Comments
 (0)