]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: btusb: reorder cleanup in btusb_disconnect to avoid UAF
authorRaphael Pinsonneault-Thibeault <rpthibeault@gmail.com>
Wed, 5 Nov 2025 19:28:41 +0000 (14:28 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Nov 2025 09:35:50 +0000 (10:35 +0100)
[ Upstream commit 23d22f2f71768034d6ef86168213843fc49bf550 ]

There is a KASAN: slab-use-after-free read in btusb_disconnect().
Calling "usb_driver_release_interface(&btusb_driver, data->intf)" will
free the btusb data associated with the interface. The same data is
then used later in the function, hence the UAF.

Fix by moving the accesses to btusb data to before the data is free'd.

Reported-by: syzbot+2fc81b50a4f8263a159b@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=2fc81b50a4f8263a159b
Tested-by: syzbot+2fc81b50a4f8263a159b@syzkaller.appspotmail.com
Fixes: fd913ef7ce619 ("Bluetooth: btusb: Add out-of-band wakeup support")
Signed-off-by: Raphael Pinsonneault-Thibeault <rpthibeault@gmail.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/bluetooth/btusb.c

index a734c5135a8be35fab0c93593ce823dfef72eb9e..aedb47861400094735bf509bf402c16ec9f185b4 100644 (file)
@@ -4179,6 +4179,11 @@ static void btusb_disconnect(struct usb_interface *intf)
 
        hci_unregister_dev(hdev);
 
+       if (data->oob_wake_irq)
+               device_init_wakeup(&data->udev->dev, false);
+       if (data->reset_gpio)
+               gpiod_put(data->reset_gpio);
+
        if (intf == data->intf) {
                if (data->isoc)
                        usb_driver_release_interface(&btusb_driver, data->isoc);
@@ -4189,17 +4194,11 @@ static void btusb_disconnect(struct usb_interface *intf)
                        usb_driver_release_interface(&btusb_driver, data->diag);
                usb_driver_release_interface(&btusb_driver, data->intf);
        } else if (intf == data->diag) {
-               usb_driver_release_interface(&btusb_driver, data->intf);
                if (data->isoc)
                        usb_driver_release_interface(&btusb_driver, data->isoc);
+               usb_driver_release_interface(&btusb_driver, data->intf);
        }
 
-       if (data->oob_wake_irq)
-               device_init_wakeup(&data->udev->dev, false);
-
-       if (data->reset_gpio)
-               gpiod_put(data->reset_gpio);
-
        hci_free_dev(hdev);
 }