linux/drivers
Alan Stern 3dd550a2d3 USB: usbcore: Fix slab-out-of-bounds bug during device reset
The syzbot fuzzer provoked a slab-out-of-bounds error in the USB core:

BUG: KASAN: slab-out-of-bounds in memcmp+0xa6/0xb0 lib/string.c:904
Read of size 1 at addr ffff8881d175bed6 by task kworker/0:3/2746

CPU: 0 PID: 2746 Comm: kworker/0:3 Not tainted 5.3.0-rc5+ #28
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS
Google 01/01/2011
Workqueue: usb_hub_wq hub_event
Call Trace:
  __dump_stack lib/dump_stack.c:77 [inline]
  dump_stack+0xca/0x13e lib/dump_stack.c:113
  print_address_description+0x6a/0x32c mm/kasan/report.c:351
  __kasan_report.cold+0x1a/0x33 mm/kasan/report.c:482
  kasan_report+0xe/0x12 mm/kasan/common.c:612
  memcmp+0xa6/0xb0 lib/string.c:904
  memcmp include/linux/string.h:400 [inline]
  descriptors_changed drivers/usb/core/hub.c:5579 [inline]
  usb_reset_and_verify_device+0x564/0x1300 drivers/usb/core/hub.c:5729
  usb_reset_device+0x4c1/0x920 drivers/usb/core/hub.c:5898
  rt2x00usb_probe+0x53/0x7af
drivers/net/wireless/ralink/rt2x00/rt2x00usb.c:806

The error occurs when the descriptors_changed() routine (called during
a device reset) attempts to compare the old and new BOS and capability
descriptors.  The length it uses for the comparison is the
wTotalLength value stored in BOS descriptor, but this value is not
necessarily the same as the length actually allocated for the
descriptors.  If it is larger the routine will call memcmp() with a
length that is too big, thus reading beyond the end of the allocated
region and leading to this fault.

The kernel reads the BOS descriptor twice: first to get the total
length of all the capability descriptors, and second to read it along
with all those other descriptors.  A malicious (or very faulty) device
may send different values for the BOS descriptor fields each time.
The memory area will be allocated using the wTotalLength value read
the first time, but stored within it will be the value read the second
time.

To prevent this possibility from causing any errors, this patch
modifies the BOS descriptor after it has been read the second time:
It sets the wTotalLength field to the actual length of the descriptors
that were read in and validated.  Then the memcpy() call, or any other
code using these descriptors, will be able to rely on wTotalLength
being valid.

Reported-and-tested-by: syzbot+35f4d916c623118d576e@syzkaller.appspotmail.com
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/Pine.LNX.4.44L0.1909041154260.1722-100000@iolanthe.rowland.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-09-04 18:24:00 +02:00
..
accessibility
acpi drivers/acpi/scan.c: document why we don't need the device_hotplug_lock 2019-08-03 07:02:01 -07:00
amba drivers: Introduce device lookup variants by of_node 2019-07-30 13:07:41 +02:00
android binder: prevent transactions to context manager from its own process. 2019-07-24 11:02:28 +02:00
ata libata: add SG safety checks in SFF pio transfers 2019-08-07 12:23:57 -06:00
atm Kconfig: Fix the reference to the IDT77105 Phy driver in the description of ATM_NICSTAR_USE_IDT77105 2019-08-19 18:15:18 -07:00
auxdisplay auxdisplay: ht16k33: Make ht16k33_fb_fix and ht16k33_fb_var constant 2019-08-20 11:48:54 +02:00
base Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
bcma
block rbd: restore zeroing past the overlap when reading from parent 2019-08-28 12:34:11 +02:00
bluetooth Bluetooth: hci_qca: Skip 1 error print in device_want_to_sleep() 2019-08-14 15:50:46 +02:00
bus Hisilicon fixes for v5.3-rc 2019-08-29 17:23:52 +02:00
cdrom
char tpm: tpm_ibm_vtpm: Fix unallocated banks 2019-08-05 00:55:00 +03:00
clk clk: Fix potential NULL dereference in clk_fetch_parent_index() 2019-08-16 10:30:21 -07:00
clocksource RISC-V: Remove per cpu clocksource 2019-08-06 14:37:58 -07:00
connector connector: remove redundant input callback from cn_dev 2019-07-21 13:31:14 -07:00
counter Staging / IIO driver update for 5.3-rc1 2019-07-11 15:36:02 -07:00
cpufreq cpufreq: dev_pm_qos_update_request() can return 1 on success 2019-08-10 13:39:47 +02:00
cpuidle Merge branch 'pm-cpufreq' 2019-07-18 09:49:30 +02:00
crypto Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6 2019-08-30 18:56:08 -07:00
dax Merge branch 'work.mount0' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2019-07-19 10:42:02 -07:00
dca
devfreq
dio
dma Wimplicit-fallthrough patches for 5.3-rc6 2019-08-22 11:26:10 -07:00
dma-buf Merge branch 'work.mount0' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2019-07-19 10:42:02 -07:00
edac
eisa
extcon
firewire firewire: mark expected switch fall-throughs 2019-07-25 20:09:37 -05:00
firmware Merge branch 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2019-08-18 09:36:51 -07:00
fpga Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
fsi fsi: scom: Don't abort operations for minor errors 2019-08-28 22:59:18 +02:00
gnss
gpio gpio: Fix irqchip initialization order 2019-08-23 11:00:43 +02:00
gpu Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
hid HID: wacom: correct misreported EKR ring values 2019-08-20 10:40:40 +02:00
hsi
hv Drivers: hv: vmbus: Fix virt_to_hvpfn() for X86_PAE 2019-08-20 12:49:57 -04:00
hwmon hwmon: (lm75) Fixup tmp75b clr_mask 2019-08-07 14:50:49 -07:00
hwspinlock
hwtracing Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
i2c Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
i3c * Drop support for 10-bit I2C addresses 2019-07-09 09:04:31 -07:00
ide It's been a relatively busy cycle for docs: 2019-07-09 12:34:26 -07:00
idle
iio iio: adc: max9611: Fix temperature reading in probe 2019-08-05 17:42:24 +01:00
infiniband Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
input Input: hyperv-keyboard: Use in-place iterator API in the channel callback 2019-08-20 11:28:04 -04:00
interconnect
iommu Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
ipack TTY / Serial driver updates for 5.3-rc1 2019-07-11 15:38:21 -07:00
irqchip irqchip fixes for 5.3 2019-08-01 20:21:00 +02:00
isdn isdn: hfcsusb: Fix mISDN driver crash caused by transfer buffer on the stack 2019-07-31 08:54:06 -07:00
leds drivers: Introduce device lookup variants by name 2019-07-30 13:07:41 +02:00
lightnvm
macintosh drivers/macintosh/smu.c: Mark expected switch fall-through 2019-07-31 21:44:45 +10:00
mailbox - stm32: race fix by adding a spinlock 2019-07-14 16:36:51 -07:00
mcb
md dm table: fix invalid memory accesses with too high sector number 2019-08-23 10:11:42 -04:00
media dmaengine fixes for v5.3-rc5 2019-08-16 08:59:33 -07:00
memory Kbuild updates for v5.3 (2nd) 2019-07-20 09:34:55 -07:00
memstick MMC core: 2019-07-11 18:11:21 -07:00
message SCSI misc on 20190709 2019-07-11 15:14:01 -07:00
mfd Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
misc Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
mmc mmc: sdhci-cadence: enable v4_mode to fix ADMA 64-bit addressing 2019-08-30 09:17:53 +02:00
mtd mtd: hyperbus: fix dependency and build error 2019-08-29 14:31:23 +02:00
mux drivers: Introduce device lookup variants by of_node 2019-07-30 13:07:41 +02:00
net Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
nfc NFC: nfcmrvl: fix gpio-handling regression 2019-08-05 10:25:48 -07:00
ntb NTB/msi: remove incorrect MODULE defines 2019-08-05 15:42:27 -04:00
nubus
nvdimm libnvdimm fixes v5.3-rc2 2019-07-27 08:25:51 -07:00
nvme nvme: Add quirk for LiteON CL1 devices running FW 22301111 2019-08-20 11:02:10 -06:00
nvmem Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
of Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
opp pci-v5.3-changes 2019-07-15 20:44:49 -07:00
oprofile vfs: Convert oprofilefs to use the new mount API 2019-07-04 22:01:59 -04:00
parisc
parport It's been a relatively busy cycle for docs: 2019-07-09 12:34:26 -07:00
pci Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
pcmcia pcmcia: db1xxx_ss: Mark expected switch fall-throughs 2019-08-09 19:53:04 -05:00
perf drivers/perf: arm_pmu: Fix failure path in PM notifier 2019-07-29 11:43:48 +01:00
phy
pinctrl pinctrl: aspeed: Make aspeed_pinmux_ips static 2019-07-29 23:35:31 +02:00
platform chrome-platform fixes for v5.3-rc6 2019-08-22 11:17:20 -07:00
pnp docs: driver-api: add a series of orphaned documents 2019-07-15 11:03:02 -03:00
power power: supply: ab8500_charger: Mark expected switch fall-through 2019-08-20 19:43:33 -05:00
powercap powercap: Invoke powercap_init() and rapl_init() earlier 2019-07-22 11:23:00 +02:00
pps drivers/pps/pps.c: clear offset flags in PPS_SETPARAMS ioctl 2019-07-16 19:23:24 -07:00
ps3
ptp
pwm pwm: Fallback to the static lookup-list when acpi_pwm_get fails 2019-08-08 13:17:38 +02:00
rapidio Merge branch 'akpm' (patches from Andrew) 2019-07-17 08:58:04 -07:00
ras
regulator Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
remoteproc remoteproc updates for v5.3 2019-07-17 11:44:41 -07:00
reset ARM: SoC-related driver updates 2019-07-19 17:13:56 -07:00
rpmsg
rtc drivers: Introduce device lookup variants by name 2019-07-30 13:07:41 +02:00
s390 Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
sbus
scsi Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
sfi
sh
siox
slimbus
sn
soc soc: ixp4xx: Protect IXP4xx SoC drivers by ARCH_IXP4XX || COMPILE_TEST 2019-08-29 17:34:38 +02:00
soundwire soundwire: fix regmap dependencies and align with other serial links 2019-08-09 10:20:40 +05:30
spi Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
spmi
ssb
staging usb: add a HCD_DMA flag instead of guestimating DMA capabilities 2019-08-21 10:03:35 -07:00
target scsi: target: tcmu: avoid use-after-free after command timeout 2019-08-14 21:58:55 -04:00
tc
tee
thermal int340X/processor_thermal_device: Fix proc_thermal_rapl_remove() 2019-07-23 09:36:07 +02:00
thunderbolt Driver Core and debugfs changes for 5.3-rc1 2019-07-12 12:24:03 -07:00
tty Merge generic_lookup_helpers into usb-next 2019-09-03 17:11:07 +02:00
uio
usb USB: usbcore: Fix slab-out-of-bounds bug during device reset 2019-09-04 18:24:00 +02:00
vfio VFIO updates for v5.3-rc1 2019-07-17 11:23:13 -07:00
vhost vhost: disable metadata prefetch optimization 2019-07-26 07:49:29 -04:00
video Wimplicit-fallthrough patches for 5.3-rc6 2019-08-22 11:26:10 -07:00
virt
virtio Merge branch 'work.mount0' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2019-07-19 10:42:02 -07:00
visorbus
vlynq
vme
w1 docs: driver-api: add a series of orphaned documents 2019-07-15 11:03:02 -03:00
watchdog Wimplicit-fallthrough patches for 5.3-rc6 2019-08-22 11:26:10 -07:00
xen xen: fixes for 5.3-rc3 2019-08-02 15:26:48 -07:00
zorro
Kconfig USB: Move wusbcore and UWB to staging as it is obsolete 2019-08-08 07:52:01 +02:00
Makefile USB: Move wusbcore and UWB to staging as it is obsolete 2019-08-08 07:52:01 +02:00