Hello,
We observed a kernel panic due to a null pointer dereference in the USB stack while sending malformed USB hub packets.
Testing was done on a Galileo board, using kernel version 4.1.8 (image built with Yocto project).
Output of /proc/version: Linux version 4.1.8-yocto-standard (REDACTED) (gcc version 5.2.0 (GCC) ) #1 PREEMPT Fri Oct 30 15:05:46 EET 2015
Please see full call trace at the end of the mail and reproduction steps.
Running in debug mode, part of the call trace is displayed, along with:
<6,ý<6,ý (null): activate --> -19
which links to drivers/usb/core/hub.c:1239 , function hub_activate (init3). This shows that hub->intfdev is null.
1240 init3:
1241 hub->quiescing = 0;
1242
1243 status = usb_submit_urb(hub->urb, GFP_NOIO);
1244 if (status < 0)
1245 dev_err(hub->intfdev, "activate --> %d\n", status);
If you need additional info, please let us know.
----------------------------- Reproduction steps ----------------------
Testing was done with Facedancer [1] and umap [2] script.
If you have a Facedancer board, you can reproduce the issue by issuing the below command, where ttyUSBX is the connected Facedancer board. Issue does not reproduce 100%, so you can call this several times until you hit the issue (usually max 3 times).
# python3 umap.py -P /dev/ttyUSBX -s 09:00:00:E:01
[...]
Fuzzing:
09:00:00 - Hub : Default : Default
**SUPPORTED**
2015/11/10 17:15:35 Enumeration phase: 0001 - Device_bLength_lower
Hub descriptor in umap.py:
hub_descriptor = bytes([
bLength, # length of descriptor in bytes
bDescriptorType, # descriptor type 0x29 == hub
bNbrPorts, # number of physical ports
HubCharacteristics & 0xff , # hub characteristics
(wHubCharacteristics >> 8) & 0xff,
bPwrOn2PwrGood, # time from power on til power good
bHubContrCurrent, # max current required by hub controller
DeviceRemovable,
PortPwrCtrlMask
])
[1] http://goodfet.sourceforge.net/hardware/facedancer21/
[2] https://github.com/umap-project/umap
--------------------------------- Call trace ----------------------------
usb 2-1: new full-speed USB device number 5 using ohci-pci
usb 2-1: not running at top speed; connect to a high speed hub
hub 2-1:1.0: USB hub found
hub 2-1:1.0: 4 ports detected
usb 2-1: USB disconnect, device number 5
------------[ cut here ]------------
WARNING: CPU: 0 PID: 0 at REDACTED/build/tmp-glibc/work-shared/intel-quark/kernel-source/kernel/workqueue.c:606 insert_work+0x8b/0xa0()
Modules linked in: 8021q iio_trig_sysfs industrialio ohci_pci ohci_hcd efivarfs
CPU: 0 PID: 0 Comm: swapper Not tainted 4.1.6-yocto-standard #1
Hardware name: Intel Corp. QUARK/GalileoGen2, BIOS 0x01000200 01/01/2014
00000000 00000000 cd033ea0 c9d08075 cd033ed0 c9645313 c9e295e8 00000000
00000000 c9e2a18c 0000025e c965814b c965814b cdde0a00 ce2ba8e8 c9f0d660
cd033ee0 c96453e2 00000009 00000000 cd033efc c965814b c9f0d670 00000005
Call Trace:
[<c9d08075>] dump_stack+0x16/0x18
[<c9645313>] warn_slowpath_common+0x83/0xb0
[<c965814b>] ? insert_work+0x8b/0xa0
[<c965814b>] ? insert_work+0x8b/0xa0
[<c96453e2>] warn_slowpath_null+0x22/0x30
[<c965814b>] insert_work+0x8b/0xa0
[<c965829f>] __queue_work+0x13f/0x3b0
[<c9658590>] ? execute_in_process_context+0x50/0x50
[<c96585a5>] delayed_work_timer_fn+0x15/0x20
[<c9688220>] call_timer_fn+0x30/0x130
[<c965f0ee>] ? put_cred_rcu+0x6e/0xb0
[<c99a00af>] ? __this_cpu_preempt_check+0xf/0x20
[<c968853d>] run_timer_softirq+0x14d/0x2e0
[<c9658590>] ? execute_in_process_context+0x50/0x50
[<c96482f4>] __do_softirq+0x84/0x260
[<c9648270>] ? __local_bh_enable_ip+0x90/0x90
[<c9603e21>] do_softirq_own_stack+0x31/0x40
<IRQ> [<c96485ee>] irq_exit+0x6e/0x90
[<c9d0dc06>] smp_apic_timer_interrupt+0x36/0x40
[<c9d0d40d>] apic_timer_interrupt+0x2d/0x40
[<c960a91d>] ? default_idle+0x1d/0xd0
[<c960b35e>] arch_cpu_idle+0xe/0x10
[<c966e772>] cpu_startup_entry+0x2e2/0x350
[<c9d05032>] rest_init+0x72/0x80
[<c9f9ea7c>] start_kernel+0x359/0x35e
[<c9f9e2c3>] i386_start_kernel+0x8d/0x91
---[ end trace 163d665e0e9a46d2 ]---
------------[ cut here ]------------
WARNING: CPU: 0 PID: 20 at REDACTED/build/tmp-glibc/work-shared/in
tel-quark/kernel-source/include/linux/kref.h:47 usb_get_urb.part.0+0x27/0x30()
Modules linked in: 8021q iio_trig_sysfs industrialio ohci_pci ohci_hcd efivarfs
CPU: 0 PID: 20 Comm: kworker/0:1 Tainted: G W 4.1.6-yocto-standard #1
Hardware name: Intel Corp. QUARK/GalileoGen2, BIOS 0x01000200 01/01/2014
Workqueue: events_power_efficient hub_init_func3
00000000 00000000 cd1c7d88 c9d08075 cd1c7db8 c9645313 c9e295e8 00000000
00000014 c9e29494 0000002f c9b04427 c9b04427 ce23c780 00000200 00000010
cd1c7dc8 c96453e2 00000009 00000000 cd1c7dd0 c9b04427 cd1c7ddc c9b04455
Call Trace:
[<c9d08075>] dump_stack+0x16/0x18
[<c9645313>] warn_slowpath_common+0x83/0xb0
[<c9b04427>] ? usb_get_urb.part.0+0x27/0x30
[<c9b04427>] ? usb_get_urb.part.0+0x27/0x30
[<c96453e2>] warn_slowpath_null+0x22/0x30
[<c9b04427>] usb_get_urb.part.0+0x27/0x30
[<c9b04455>] usb_get_urb+0x25/0x30
[<c9b030f5>] usb_hcd_submit_urb+0x25/0x870
[<c9669d93>] ? update_curr+0x93/0x190
[<c99a0092>] ? debug_smp_processor_id+0x12/0x20
[<c9669fbd>] ? __enqueue_entity+0x6d/0x80
[<c9b0496a>] usb_submit_urb+0x27a/0x510
[<c9669d93>] ? update_curr+0x93/0x190
[<c9afd92f>] hub_activate+0x18f/0x520
[<c9669f02>] ? set_next_entity+0x52/0x70
[<c99a0092>] ? debug_smp_processor_id+0x12/0x20
[<c9afdd27>] hub_init_func3+0x17/0x20
[<c9658d9d>] process_one_work+0x11d/0x430
[<c96590e7>] worker_thread+0x37/0x4d0
[<c96590b0>] ? process_one_work+0x430/0x430
[<c965dbda>] kthread+0x9a/0xb0
[<c9d0c9a0>] ret_from_kernel_thread+0x20/0x30
[<c965db40>] ? kthread_worker_fn+0x150/0x150
---[ end trace 163d665e0e9a46d3 ]---
BUG: unable to handle kernel NULL pointer dereference at 0000000b
IP: [<0000000b>] 0xb
*pde = 00000000
Oops: 0010 [#1] PREEMPT
Modules linked in: 8021q iio_trig_sysfs industrialio ohci_pci ohci_hcd efivarfs
CPU: 0 PID: 3 Comm: ksoftirqd/0 Tainted: G W 4.1.6-yocto-standard #1
Hardware name: Intel Corp. QUARK/GalileoGen2, BIOS 0x01000200 01/01/2014
task: cd098920 ti: cd0ee000 task.ti: cd0ee000
EIP: 0060:[<0000000b>] EFLAGS: 00010002 CPU: 0
EIP is at 0xb
EAX: cd3b1610 EBX: cd3b1610 ECX: 00000000 EDX: 00000003
ESI: ce66a05c EDI: ffffffff EBP: cd0efe9c ESP: cd0efe7c
DS: 007b ES: 007b FS: 0000 GS: 0000 SS: 0068
CR0: 8005003b CR2: 0000000b CR3: 0e30d000 CR4: 00100010
Stack:
c966d9d5 00000000 00000001 ce27ddec 00000003 ce27dde8 00000046 00000246
cd0efeac c966da1f 00000000 00000000 cd0efebc c966e2d0 ce23c780 00000000
cd0efec4 c9b04fa8 cd0efedc c9b019b7 ce66a038 cd0efee8 cd0efee8 ce20190c
Call Trace:
[<c966d9d5>] ? __wake_up_common+0x45/0x70
[<c966da1f>] __wake_up_locked+0x1f/0x30
[<c966e2d0>] complete+0x30/0x60
[<c9b04fa8>] usb_api_blocking_completion+0x18/0x20
[<c9b019b7>] __usb_hcd_giveback_urb+0x47/0xb0
[<c9b01a9d>] usb_giveback_urb_bh+0x7d/0xe0
[<c9648956>] tasklet_action+0xa6/0xb0
[<c96482f4>] __do_softirq+0x84/0x260
[<c9d09b52>] ? __schedule+0x222/0x640
[<c96484ed>] run_ksoftirqd+0x1d/0x30
[<c9660a5a>] smpboot_thread_fn+0x13a/0x1f0
[<c9660920>] ? sort_range+0x30/0x30
[<c965dbda>] kthread+0x9a/0xb0
[<c9d0c9a0>] ret_from_kernel_thread+0x20/0x30
[<c965db40>] ? kthread_worker_fn+0x150/0x150
Code: Bad EIP value.
EIP: [<0000000b>] 0xb SS:ESP 0068:cd0efe7c
CR2: 000000000000000b
---[ end trace 163d665e0e9a46d4 ]---
Kernel panic - not syncing: Fatal exception in interrupt
Kernel Offset: 0x8600000 from 0xc1000000 (relocation range: 0xc0000000-0xd05effff)
---[ end Kernel panic - not syncing: Fatal exception in interrupt
---
Regards,
Alexandru Cornea
Security QA Engineer
Intel SSG OTC Romania
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html