* Kernel crash during USB device enumeration or MSC mounting @ 2020-07-04 15:15 Dan Halbert 2020-07-04 15:34 ` Greg KH 0 siblings, 1 reply; 7+ messages in thread From: Dan Halbert @ 2020-07-04 15:15 UTC (permalink / raw) To: Linux USB List Hi -- I was referred to this list by Kai-Heng Feng after filing an issue on the Ubuntu bug tracker here: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1871143. Many further details are in that report, including "lsusb -v", "lspci -v", dmesg, and call trace output. We are seeing kernel crashes from certain composite USB devices that present as MSC, CDC, HID, and MIDI. The devices are microcontroller boards running CircuitPython (https://github.com/adafruit/circuitpython), which uses the TinyUSB USB stack: https://github.com/hathach/tinyusb. The board is commanded to forcibly reformat its MSC FAT12 filesystem and then reset. This causes a USB reset and re-enumeration, which can often (though not all the time) cause a kernel crash. The crashes may be some kind of use-after-free bug in the kernel USB driver. We have seen this or similar crashes caused by several different boards that use different microcontrollers. The hosts are x64, including Dell Intel-chipset desktops and an older Mac Mini running Linux (also Intel chipset). The ports in use can be either USB2 or USB3. Sometimes interposing a USB2 hub helps. The boards and underlying software are from Adafruit. I work for Adafruit on CircuitPython, and the maintainer of TinyUSB also works for Adafrui, so we can provide further help to track this down. We can provide Beagle 12 USB traces if that would be helpful. I have reproduced these crashes using kernels as far back as 4.10 and up to 5.7, so it is a long-standing issue. We're very happy to provide further information. See the Launchpad bug report for more details. Dan ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Kernel crash during USB device enumeration or MSC mounting 2020-07-04 15:15 Kernel crash during USB device enumeration or MSC mounting Dan Halbert @ 2020-07-04 15:34 ` Greg KH 2020-07-04 15:36 ` Greg KH 0 siblings, 1 reply; 7+ messages in thread From: Greg KH @ 2020-07-04 15:34 UTC (permalink / raw) To: Dan Halbert; +Cc: Linux USB List On Sat, Jul 04, 2020 at 11:15:29AM -0400, Dan Halbert wrote: > Hi -- I was referred to this list by Kai-Heng Feng after filing an issue on > the Ubuntu bug tracker here: > > https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1871143. > > Many further details are in that report, including "lsusb -v", "lspci -v", > dmesg, and call trace output. Where is the kernel crash in those logs? I don't seem to be able to find the correct one, can you just send it here so we can read and comment on it in the email thread? I see something odd with the fat driver, are you sure you are creating a correct filesystem image for it to handle? > We are seeing kernel crashes from certain composite USB devices that present > as MSC, CDC, HID, and MIDI. The devices are microcontroller boards running > CircuitPython (https://github.com/adafruit/circuitpython), which uses the > TinyUSB USB stack: https://github.com/hathach/tinyusb. > > The board is commanded to forcibly reformat its MSC FAT12 filesystem and > then reset. This causes a USB reset and re-enumeration, which can often > (though not all the time) cause a kernel crash. What do you mean by "reset"? Are you disconnecting the device from the USB bus causing it to electronically be removed and then added back? Or doing something else? > The crashes may be some kind of use-after-free bug in the kernel USB driver. Maybe, but the traces seem _very_ short on the stuff on the web page, can you send us the full traceback from the crash? > We have seen this or similar crashes caused by several different boards that > use different microcontrollers. The hosts are x64, including Dell > Intel-chipset desktops and an older Mac Mini running Linux (also Intel > chipset). That's not good, but might mean it is a filesystem issue, not a USB issue. thanks, greg k-h ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Kernel crash during USB device enumeration or MSC mounting 2020-07-04 15:34 ` Greg KH @ 2020-07-04 15:36 ` Greg KH 2020-07-04 15:56 ` Dan Halbert 2020-07-04 16:09 ` Alan Stern 0 siblings, 2 replies; 7+ messages in thread From: Greg KH @ 2020-07-04 15:36 UTC (permalink / raw) To: Dan Halbert; +Cc: Linux USB List On Sat, Jul 04, 2020 at 05:34:29PM +0200, Greg KH wrote: > On Sat, Jul 04, 2020 at 11:15:29AM -0400, Dan Halbert wrote: > > Hi -- I was referred to this list by Kai-Heng Feng after filing an issue on > > the Ubuntu bug tracker here: > > > > https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1871143. > > > > Many further details are in that report, including "lsusb -v", "lspci -v", > > dmesg, and call trace output. > > Where is the kernel crash in those logs? I don't seem to be able to > find the correct one, can you just send it here so we can read and > comment on it in the email thread? I see something odd with the fat > driver, are you sure you are creating a correct filesystem image for it > to handle? > > > We are seeing kernel crashes from certain composite USB devices that present > > as MSC, CDC, HID, and MIDI. The devices are microcontroller boards running > > CircuitPython (https://github.com/adafruit/circuitpython), which uses the > > TinyUSB USB stack: https://github.com/hathach/tinyusb. > > > > The board is commanded to forcibly reformat its MSC FAT12 filesystem and > > then reset. This causes a USB reset and re-enumeration, which can often > > (though not all the time) cause a kernel crash. > > What do you mean by "reset"? Are you disconnecting the device from the > USB bus causing it to electronically be removed and then added back? Or > doing something else? > > > The crashes may be some kind of use-after-free bug in the kernel USB driver. > > Maybe, but the traces seem _very_ short on the stuff on the web page, > can you send us the full traceback from the crash? > > > We have seen this or similar crashes caused by several different boards that > > use different microcontrollers. The hosts are x64, including Dell > > Intel-chipset desktops and an older Mac Mini running Linux (also Intel > > chipset). > > That's not good, but might mean it is a filesystem issue, not a USB > issue. Ok, this trace: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1871143/comments/4 seems to point at the filesystem code. Are you sure you are creating the image correctly? If you unplug and plug the device back in with that same filesystem image, does it work, or still crash? thanks, greg k-h ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Kernel crash during USB device enumeration or MSC mounting 2020-07-04 15:36 ` Greg KH @ 2020-07-04 15:56 ` Dan Halbert 2020-07-04 16:09 ` Alan Stern 1 sibling, 0 replies; 7+ messages in thread From: Dan Halbert @ 2020-07-04 15:56 UTC (permalink / raw) To: Greg KH; +Cc: Linux USB List On 7/4/20 11:36 AM, Greg KH wrote Thanks for your quick reply, Greg. > Where is the kernel crash in those logs? I don't seem to be able to > find the correct one, can you just send it here so we can read and > comment on it in the email thread? I see something odd with the fat > driver, are you sure you are creating a correct filesystem image for it > to handle? There are two crashes described in that report. In the first post, I mentioned that the full kdump crash dump is here: https://drive.google.com/open?id=1ka3ySSccEMRSmnYgI9X16IndPDmIKTD6 Is that what you are looking for? The first trace seems USB-related, and is in comment #2 (you have to click Read More...), and starts out: [76707.692760] Call Trace: [76707.692767] ? usb_alloc_urb+0x29/0x60 [76707.692772] usb_alloc_urb+0x29/0x60 [76707.692779] acm_probe+0x6da/0xdb0 [cdc_acm] ... The second trace is in comment #4, and seems filesystem-related: [40866.349358] Call Trace: [40866.349363] ? kernfs_fop_open+0xc2/0x3b0 [40866.349366] kernfs_fop_open+0xc2/0x3b0 [40866.349368] ? kernfs_fop_read+0x1b0/0x1b0 [40866.349372] do_dentry_open+0x143/0x3a0 [40866.349373] vfs_open+0x2d/0x30 [40866.349376] do_last+0x194/0x900 [40866.349392] path_openat+0x8d/0x290 ... > What do you mean by "reset"? Are you disconnecting the device from the > USB bus causing it to electronically be removed and then added back? Or > doing something else? The microcontroller is doing a hard reset, which causes an electrical USB reset, if I understand correctly. We have also occasionally seen crashes on plug-in (and maybe unplug, though I have not seen that personally). > ... the traces seem _very_ short on the stuff on the web page, > can you send us the full traceback from the crash? I have the kdump stuff, but I'm not sure how to give you a full traceback. Do you want the whole contents of the /var/crash dirs? >That's not good, but might mean it is a filesystem issue, not a USB >issue. Yes, possibly, though it might be an interaction between the filesystem code and USB, since I'm seeing different traces. We have not seen these crashes on some other motherboards, including some Intel laptop chipsets and some AMD chipsets. > Ok, this trace: > https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1871143/comments/4 > > seems to point at the filesystem code. Are you sure you are creating > the image correctly? > > If you unplug and plug the device back in with that same filesystem > image, does it work, or still crash? Yes, it works fine. It might be something about the abruptness of the disconnect and the speed with which it tries to reconnect. It is intermittent, and doesn't always cause a crash. We've been using these devices and their filesystems for years successfully for several years. That doesn't mean the filesystem code on-board is perfect, but we shouldn't be able to crash the kernel. Thanks, Dan ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Kernel crash during USB device enumeration or MSC mounting 2020-07-04 15:36 ` Greg KH 2020-07-04 15:56 ` Dan Halbert @ 2020-07-04 16:09 ` Alan Stern 2020-07-04 16:33 ` Dan Halbert 1 sibling, 1 reply; 7+ messages in thread From: Alan Stern @ 2020-07-04 16:09 UTC (permalink / raw) To: Greg KH; +Cc: Dan Halbert, Linux USB List On Sat, Jul 04, 2020 at 05:36:07PM +0200, Greg KH wrote: > On Sat, Jul 04, 2020 at 05:34:29PM +0200, Greg KH wrote: > > On Sat, Jul 04, 2020 at 11:15:29AM -0400, Dan Halbert wrote: > > > Hi -- I was referred to this list by Kai-Heng Feng after filing an issue on > > > the Ubuntu bug tracker here: > > > > > > https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1871143. > > > > > > Many further details are in that report, including "lsusb -v", "lspci -v", > > > dmesg, and call trace output. > > > > Where is the kernel crash in those logs? I don't seem to be able to > > find the correct one, can you just send it here so we can read and > > comment on it in the email thread? I see something odd with the fat > > driver, are you sure you are creating a correct filesystem image for it > > to handle? > > > > > We are seeing kernel crashes from certain composite USB devices that present > > > as MSC, CDC, HID, and MIDI. The devices are microcontroller boards running > > > CircuitPython (https://github.com/adafruit/circuitpython), which uses the > > > TinyUSB USB stack: https://github.com/hathach/tinyusb. > > > > > > The board is commanded to forcibly reformat its MSC FAT12 filesystem and > > > then reset. This causes a USB reset and re-enumeration, which can often > > > (though not all the time) cause a kernel crash. > > > > What do you mean by "reset"? Are you disconnecting the device from the > > USB bus causing it to electronically be removed and then added back? Or > > doing something else? > > > > > The crashes may be some kind of use-after-free bug in the kernel USB driver. > > > > Maybe, but the traces seem _very_ short on the stuff on the web page, > > can you send us the full traceback from the crash? > > > > > We have seen this or similar crashes caused by several different boards that > > > use different microcontrollers. The hosts are x64, including Dell > > > Intel-chipset desktops and an older Mac Mini running Linux (also Intel > > > chipset). > > > > That's not good, but might mean it is a filesystem issue, not a USB > > issue. > > Ok, this trace: > https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1871143/comments/4 > > seems to point at the filesystem code. Are you sure you are creating > the image correctly? > > If you unplug and plug the device back in with that same filesystem > image, does it work, or still crash? It looks to me as though the user is reformatting the USB drive on the microcontroller while it is mounted on the host. At least, the log message: [40864.285807] FAT-fs (sdc1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck. seems to indicate that a FAT filesystem was mounted, and the circuitpython command storage.erase_filesystem() completely reinitializes the device's filesystem. This is definitely a user error: It is forbidden for a device to manipulate data that it is exporting to a host as a USB drive. And it's not surprising that doing so would cause the host to crash. If you really want to call storage.erase_filesystem() while the device is connected to the host, you should at least unmount the drive on the host beforehand. Alan Stern ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Kernel crash during USB device enumeration or MSC mounting 2020-07-04 16:09 ` Alan Stern @ 2020-07-04 16:33 ` Dan Halbert 2020-07-04 18:02 ` Alan Stern 0 siblings, 1 reply; 7+ messages in thread From: Dan Halbert @ 2020-07-04 16:33 UTC (permalink / raw) To: Alan Stern, Greg KH; +Cc: Linux USB List On 7/4/20 12:09 PM, Alan Stern wrote: > It looks to me as though the user is reformatting the USB drive on the > microcontroller while it is mounted on the host. At least, the log > message: > > [40864.285807] FAT-fs (sdc1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck. > > seems to indicate that a FAT filesystem was mounted, and the circuitpython > command storage.erase_filesystem() completely reinitializes the device's > filesystem. > > This is definitely a user error: It is forbidden for a device to > manipulate data that it is exporting to a host as a USB drive. And it's > not surprising that doing so would cause the host to crash. > > If you really want to call storage.erase_filesystem() while the device is > connected to the host, you should at least unmount the drive on the host > beforehand. Thanks for your observations, which are very helpful in my thinking about this. That's correct, that code does reformat the filesystem, but it also does a USB reset, so the host should ideally not make an assumption that its idea of what is on the drive is correct when it re-enumerates. We cannot tell the host from the MSC side that we want to unmount cleanly from the drive. We could disconnect from USB first. I just confirmed with one of our users that he has also seen crashes on simple unplug of the mounted device. I would hope that the host would not crash when the MSC device does something untoward, and that it would be more robust. It is a potential kernel attack mechanism otherwise. The first crash trace I mentioned in my reply to Greg does seem to be inside the USB stack, not in the filesystem code. It's possible there are two problems here, or it's possible the filesystem code gets confused and is making the USB stack confused as well. Dan ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Kernel crash during USB device enumeration or MSC mounting 2020-07-04 16:33 ` Dan Halbert @ 2020-07-04 18:02 ` Alan Stern 0 siblings, 0 replies; 7+ messages in thread From: Alan Stern @ 2020-07-04 18:02 UTC (permalink / raw) To: Dan Halbert; +Cc: Greg KH, Linux USB List On Sat, Jul 04, 2020 at 12:33:38PM -0400, Dan Halbert wrote: > On 7/4/20 12:09 PM, Alan Stern wrote: > > It looks to me as though the user is reformatting the USB drive on the > > microcontroller while it is mounted on the host. At least, the log > > message: > > > > [40864.285807] FAT-fs (sdc1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck. > > > > seems to indicate that a FAT filesystem was mounted, and the circuitpython > > command storage.erase_filesystem() completely reinitializes the device's > > filesystem. > > > > This is definitely a user error: It is forbidden for a device to > > manipulate data that it is exporting to a host as a USB drive. And it's > > not surprising that doing so would cause the host to crash. > > > > If you really want to call storage.erase_filesystem() while the device is > > connected to the host, you should at least unmount the drive on the host > > beforehand. > > Thanks for your observations, which are very helpful in my thinking about > this. That's correct, that code does reformat the filesystem, but it also > does a USB reset, so the host should ideally not make an assumption that its > idea of what is on the drive is correct when it re-enumerates. The host sees the reformat as it takes place, and that can mess up the host. The fact that there is a disconnect afterward limits the window but does not eliminate it. > We cannot tell the host from the MSC side that we want to unmount cleanly > from the drive. We could disconnect from USB first. That would be a good idea. Still, what reason is there for reformatting the storage while it is connected to a host? That's equivalent to a real disk drive deciding to erase itself while it is in use. Why not do the reformat before the device is attached to the host? Or why not have the host do the reformat instead of doing it on the device? > I just confirmed with one of our users that he has also seen crashes on > simple unplug of the mounted device. That could be a separate issue. I haven't seen reports of things like that for quite a long time. Is it reproducible? If it is, you (or your user) ought to be able to get the same result by unplugging an ordinary USB flash drive while it is mounted. > I would hope that the host would not crash when the MSC device does > something untoward, and that it would be more robust. It is a potential > kernel attack mechanism otherwise. Have you heard of Bad USB? Yes, there are a lot of attack mechanisms here. The fact is, operating systems tend to trust the contents of attached disk drives. If you don't want the host to trust the contents of the device's Mass Storage interface, don't allow the host to mount it. One of the most fundamental assumptions computers make about attached disk drives is that they don't spontaneously change their contents. When you violate that assumption, almost anything can happen. > The first crash trace I mentioned in my reply to Greg does seem to be inside > the USB stack, not in the filesystem code. It's possible there are two > problems here, or it's possible the filesystem code gets confused and is > making the USB stack confused as well. Whenever one subsystem in the kernel gets out of whack, it can fairly easily corrupt the entire kernel. You can't conclude anything just from the immediate appearance of a bug. Anyway, the first crash in in your reply to Greg _wasn't_ in the USB stack: [76707.692717] general protection fault: 0000 [#1] SMP PTI [76707.692723] CPU: 3 PID: 75883 Comm: kworker/3:1 Kdump: loaded Not tainted 5.4.0-21-generic #25-Ubuntu [76707.692725] Hardware name: Dell Inc. OptiPlex 7010/0WR7PY, BIOS A29 06/28/2018 [76707.692732] Workqueue: usb_hub_wq hub_event [76707.692738] RIP: 0010:__kmalloc+0xa5/0x270 As you can see, the problem occurred in __kmalloc(), which is part of the memory management subsystem -- not the USB stack. Alan Stern ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-07-04 18:02 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-07-04 15:15 Kernel crash during USB device enumeration or MSC mounting Dan Halbert 2020-07-04 15:34 ` Greg KH 2020-07-04 15:36 ` Greg KH 2020-07-04 15:56 ` Dan Halbert 2020-07-04 16:09 ` Alan Stern 2020-07-04 16:33 ` Dan Halbert 2020-07-04 18:02 ` Alan Stern
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox