[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Bug 1525123] Re: USB assert failure on hcd-uhci.c
From: |
Bugs SysSec |
Subject: |
[Bug 1525123] Re: USB assert failure on hcd-uhci.c |
Date: |
Tue, 16 Jun 2020 15:41:27 -0000 |
We can reproduce this bug in QEMU 5.0.0
```
qemu-system-x86_64: hw/usb/core.c:723: usb_ep_get: Assertion `pid ==
USB_TOKEN_IN || pid == USB_TOKEN_OUT' failed.
```
To reproduce run the QEMU with the following command line:
```
qemu-system-x86_64 -cdrom hypertrash.iso -nographic -m 100 -enable-kvm -net
none -device ich9-usb-ehci1 -device usb-tablet
```
QEMU Version:
```
# qemu-5.0.0
$ ./configure --target-list=x86_64-softmmu --enable-sanitizers; make
$ x86_64-softmmu/qemu-system-x86_64 --version
QEMU emulator version 5.0.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers
```
** Attachment added: "ehci_assert1.zip"
https://bugs.launchpad.net/qemu/+bug/1525123/+attachment/5384435/+files/ehci_assert1.zip
--
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1525123
Title:
USB assert failure on hcd-uhci.c
Status in QEMU:
New
Bug description:
When inserting the attached kernel moudle in the guest OS, QEMU quits
with therse assert failure:
[insert kernel module in guest root shell]
root@qemu:~# insmod mymod.ko
root@qemu:~#
Connection closed by foreign host.
[host message]
qemu-system-x86_64: hw/usb/core.c:718: usb_ep_get: Assertion `pid == 0x69 ||
pid == 0xe1' failed.
Aborted
The direct cause of this bug is due to misimplementation of UHCI.
According to Intel's UHCI design guide, packet identification in transfer
descriptor must be one of these three values : IN (69h), OUT (E1h), and SETUP
(2Dh). Any other value in this field must cause the HALT of only HOST
CONTROLLER.
However, due to misimplementation in uhci_handle_td, instead of host
controller being halted, QEMU itself dies with assertion failure. The
assertion code is in usb_ep_get():718, which is called during
uhci_handle_td().
Another issue resides in uhci_handle_td(). This function must check
that transfer descriptor's pid is one of IN, OUT, SETUP before calling
usb_ep_get() or other functions. If it does so, usb_ep_get() only
needs to check if pid is not SETUP.
This kind of assert failure can be misused by malwares to avoid being
analyzed by terminating only in the virtual environments and still
execute the malicious code in real machines.
[How to run exploit code]
Prepare linux kernel's source header, then type these lines in root shell.
# make
# insmod mymod.ko
It needs uhci-hcd.h from linux kernel source.
I attached linux 3.18.24's uhci-hcd.h for tempory measure; You should get
proper version of uhci-hcd.h.
In the following envrionment, this exploit worked, exiting whole QEMU, not
only USB.
QEMU was running on these environment :
[CPU model] Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
[qemu version] QEMU 2.5.0-rc3 (compiled from source, gcc 4.8.4)
[host info] Ubuntu 14.04.3, x86_64, 3.19.0-32-generic
[guest info] Ubuntu 14.04.3, x86_64, 3.19.0-28-generic
[QEMU argument]
x86_64-softmmu/qemu-system-x86_64 -hda /media/hdd/img/ubuntu1404.qcow2 \
-m 512 \
--usbdevice disk:format=qcow2:../usb.img \
--enable-kvm
To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1525123/+subscriptions
- [Bug 1525123] Re: USB assert failure on hcd-uhci.c,
Bugs SysSec <=