From: syzbot <syzbot+8753715f05759f1a10de@syzkaller.appspotmail.com>
To: linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com
Subject: Forwarded: [PATCH] usbip: vhci_hcd: fix UAF in attach_store() during unbind
Date: Sat, 15 Aug 2026 05:47:53 -0700 [thread overview]
Message-ID: <6a805ff9.dbb3a75c.20434b.0017.GAE@google.com> (raw)
In-Reply-To: <6a7ee0b6.91706f20.9568a.0005.GAE@google.com>
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: [PATCH] usbip: vhci_hcd: fix UAF in attach_store() during unbind
Author: kartikey406@gmail.com
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
vhci_hcd_remove() frees the SS hcd via usb_put_hcd() before the HS hcd's
vhci_stop() removes the sysfs attribute group, since the group removal is
guarded by usb_hcd_is_primary_hcd(). A concurrent write to the attach
attribute can therefore reach vhci->vhci_hcd_ss after it has been freed.
Remove the attribute group at the start of vhci_hcd_remove(), before
either hcd reference is dropped. sysfs_remove_group() drains in-flight
store callbacks, so no writer can be inside attach_store() once it
returns.
Reported-by: syzbot+8753715f05759f1a10de@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=8753715f05759f1a10de
Signed-off-by: Deepanshu Kartikey <kartikey406@gmail.com>
---
drivers/usb/usbip/vhci_hcd.c | 39 +++++++++++++++++++++---------------
1 file changed, 23 insertions(+), 16 deletions(-)
diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c
index 39e8faf4c18c..3ce8893729b1 100644
--- a/drivers/usb/usbip/vhci_hcd.c
+++ b/drivers/usb/usbip/vhci_hcd.c
@@ -1252,18 +1252,11 @@ static int vhci_start(struct usb_hcd *hcd)
static void vhci_stop(struct usb_hcd *hcd)
{
struct vhci_hcd *vhci_hcd = hcd_to_vhci_hcd(hcd);
- int id, rhport;
+ int rhport;
usbip_dbg_vhci_hc("stop VHCI controller\n");
- /* 1. remove the userland interface of vhci_hcd */
- id = hcd_name_to_id(hcd_name(hcd));
- if (id == 0 && usb_hcd_is_primary_hcd(hcd)) {
- sysfs_remove_group(&hcd_dev(hcd)->kobj, &vhci_attr_group);
- vhci_finish_attr_group();
- }
-
- /* 2. shutdown all the ports of vhci_hcd */
+ /* shutdown all the ports of vhci_hcd */
for (rhport = 0; rhport < VHCI_HC_PORTS; rhport++) {
struct vhci_device *vdev = &vhci_hcd->vdev[rhport];
@@ -1421,20 +1414,34 @@ static int vhci_hcd_probe(struct platform_device *pdev)
static void vhci_hcd_remove(struct platform_device *pdev)
{
struct vhci *vhci = *((void **)dev_get_platdata(&pdev->dev));
+ struct usb_hcd *hcd_hs = vhci_hcd_to_hcd(vhci->vhci_hcd_hs);
+ struct usb_hcd *hcd_ss = vhci_hcd_to_hcd(vhci->vhci_hcd_ss);
+
+ /*
+ * Remove the userland interface before dropping the hcd references.
+ * sysfs_remove_group() waits for in-flight attach_store()/detach_store()
+ * callers to return and rejects new ones, so neither hcd can be reached
+ * from sysfs by the time it is freed below.
+ */
+ if (pdev->id == 0) {
+ sysfs_remove_group(&pdev->dev.kobj, &vhci_attr_group);
+ vhci_finish_attr_group();
+ }
+
+ vhci->vhci_hcd_hs = NULL;
+ vhci->vhci_hcd_ss = NULL;
+
/*
* Disconnects the root hub,
* then reverses the effects of usb_add_hcd(),
* invoking the HCD's stop() methods.
*/
- usb_remove_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_ss));
- usb_put_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_ss));
-
- usb_remove_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_hs));
- usb_put_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_hs));
+ usb_remove_hcd(hcd_ss);
+ usb_put_hcd(hcd_ss);
- vhci->vhci_hcd_hs = NULL;
- vhci->vhci_hcd_ss = NULL;
+ usb_remove_hcd(hcd_hs);
+ usb_put_hcd(hcd_hs);
}
#ifdef CONFIG_PM
--
2.43.0
next prev parent reply other threads:[~2026-08-15 12:47 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-14 9:32 [syzbot] [usb?] KASAN: slab-use-after-free Read in attach_store syzbot
2026-08-15 12:47 ` syzbot [this message]
2026-08-15 14:04 ` Forwarded: [PATCH] usbip: vhci_hcd: move sysfs attribute setup into probe/remove syzbot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6a805ff9.dbb3a75c.20434b.0017.GAE@google.com \
--to=syzbot+8753715f05759f1a10de@syzkaller.appspotmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=syzkaller-bugs@googlegroups.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox