Folien - DFN-CERT

CAOS-Stick
Crash Any Operating System
[ 110.768243] usb 1-1: new full-speed USB device number 48 using xhci_hcd
[ 111.028327] usb 1-1: config 1 has 1 interface, different from the descriptor's value: 10
[ 111.030544] usb 1-1: config 1 interface 0 altsetting 0 has 3 endpoint descriptors, different from the interface descriptor's value: 27
[ 111.133086] usb 1-1: New USB device found, idVendor=04c5, idProduct=10c7
[ 111.134764] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 111.136602] usb 1-1: Product: ?<89>
[ 111.137442] usb 1-1: Manufacturer: ?<89>
[ 111.138363] usb 1-1: SerialNumber: %
[ 111.159863] usbhid 1-1:1.0: couldn't find an input interrupt endpoint
[ 111.167812] BUG: unable to handle kernel NULL pointer dereference at 000000000000037f
[ 111.168021] IP: [<ffffffff8119ff4d>] __kmalloc+0x8d/0x190
[ 111.168021] PGD 61a0067 PUD 59e5067 PMD 0
[ 111.168021] Oops: 0000 [#1] SMP
[ 111.168021] Modules linked in: io_ti ipaq ftdi_sio usbserial snd_usb_audio snd_usbmidi_lib snd_hwdep snd_pcm snd_page_alloc snd_seq_midi
snd_seq_midi_event snd_rawmidi snd_seq snd_seq_device snd_timer snd soundcore dvb_usb_dib0700 dib8000 dib7000m dib0090 dib0070 dib7000p
dib3000mc dibx000_common dvb_usb dvb_core rc_core gspca_zc3xx gspca_main videodev usbhid hid cirrus ttm drm_kms_helper drm bnep rfcomm
psmouse bluetooth serio_raw syscopyarea sysfillrect sysimgblt i2c_piix4 mac_hid parport_pc ppdev lp parport e1000 floppy
[ 111.168021] CPU: 0 PID: 1252 Comm: systemd-udevd Not tainted 3.13.0-24-generic #46-Ubuntu
[ 111.168021] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
[ 111.168021] task: ffff8800037617f0 ti: ffff8800063dc000 task.ti: ffff8800063dc000
[ 111.168021] RIP: 0010:[<ffffffff8119ff4d>] [<ffffffff8119ff4d>] __kmalloc+0x8d/0x190
[ 111.168021] RSP: 0018:ffff8800063ddd80 EFLAGS: 00010286
[ 111.168021] RAX: 0000000000000000 RBX: ffff8800005d7780 RCX: 000000000000f9e1
[ 111.168021] RDX: 000000000000f9e0 RSI: 0000000000000000 RDI: ffffffff81210512
[ 111.168021] RBP: ffff8800063dddb0 R08: 0000000000017280 R09: 0000000000000000
[ 111.168021] R10: ffff880005d42000 R11: 0000000000000000 R12: 000000000000037f
[ 111.168021] R13: 00000000000000d0 R14: 00000000000001f8 R15: ffff880007001600
[ 111.168021] FS: 00007f0081b02880(0000) GS:ffff880009200000(0000) knlGS:0000000000000000
[ 111.168021] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[ 111.168021] CR2: 000000000000037f CR3: 0000000004431000 CR4: 00000000000006f0
[ 111.168021] Stack:
[ 111.168021] ffffffff81210512 ffff8800005d7780 ffff880005d42000 00000000fffffff4
[ 111.168021] ffff8800063de000 00000000000001f8 ffff8800063dde78 ffffffff81210512
[ 111.168021] ffff8800063dddd0 ffffffff813199c3 ffff8800063dde38 ffffffff81318d82
[ 111.168021] Call Trace:
Sergej Schumilo
Mail:
[email protected]
Twitter:
@ms_s3c
Agenda
1. Die USB-Schnittstelle
2. vUSBf Framework
3. CAOS-Stick
4. Demo
5. Veröffentlichte Schwachstellen
6. Fazit
CAOS-Stick - Crash Any Operating System
2
USB
•
•
Verschiedene generische USB-Klassen:
•
HID
•
Mass-Storage
•
…
Geräte verlangen oft auch Hersteller-spezifische Treiber
CAOS-Stick - Crash Any Operating System
3
USB-Treiber
•
•
Unzählige Treiber:
•
verschiedenste USB-Klassen-Treiber
•
weitere Subklassen-Funktionen
•
unzählige Hersteller-spezifische Treiber
Plug & Play
•
•
Automatische Initialisierung durch den USB-Enumeration Prozess
Automatisches Laden des benötigten Treibers:
•
Udev (Linux)
•
Windows Update
CAOS-Stick - Crash Any Operating System
4
USB-Treiber
•
Code-Qualität variiert oft stark
•
Folgen:
•
•
Unprivilegierte Benutzer können Treiber nachladen
Fehler in Treibern führen zu:
•
Denial of Services
•
möglichen Exploits
CAOS-Stick - Crash Any Operating System
5
USB-Bedrohungsmodell
•
•
•
Kontrollierter DoS:
•
Event- oder zeitabhängig
•
Emulation eines bootfähigen Gerätes nach dem Neustart
Direkte Ausnutzung einer Schwachstelle:
•
Installation eines Kernel-Rootkits
•
Privilege Escalation
Annahme der „Lokalen-Ausnutzbarkeit“ ist strittig:
•
Social-Engineering
•
Das „Putzfrauen“-Szenario
CAOS-Stick - Crash Any Operating System
6
Motivation
•
Systematische Suche nach Schwachstellen
•
•
USB als Angriffs-Vektor
Möglichst umfassend und schnell
CAOS-Stick - Crash Any Operating System
7
vUSBf
•
virtual USB fuzzer
•
Einsatzzweck:
•
•
automatische und generische Suche
nach Fehlern
•
Virtualisierung mit Hilfe von KVM/QEMU
•
Emulation von USB-Geräten für die VM
GPLv2 lizenziert
•
https://www.github.com/schumilo
CAOS-Stick - Crash Any Operating System
8
vUSBf
•
Speed-Up durch paralleles Fuzzing auf mehreren CPUs bzw.
Systemen
•
Emulation des generischen Enumeration-Protokolls
•
•
Weitere Klassen-spezifische Emulationen möglich
Reproduzierbares Format für gefundene Fehler:
•
Unterstützt anschliessendes Debugging
•
Hohe Reproduzierbarkeit
CAOS-Stick - Crash Any Operating System
9
vUSBf Performance
Die Geschwindigkeit ist nur durch die Leistung begrenzt - nicht durch
die verfügbare USB-Hardware.
reload mode
vUSBf (1 process)
non reload mode
Setup: 3 x Intel Xeon E5-2630L mit je 64 GB RAM
0,5
0,5
50
vUSBf Multiprocessing
120
150
vUSBf Clustering
320
0
CAOS-Stick - Crash Any Operating System
100
200
10
300
400
tests/sec
vUSBf Performance
Laufzeit für 1 Millionen Tests:
reload mode
non reload mode
Setup: 3 x Intel Xeon E5-2630L mit je 64 GB RAM
23T 4h 0m
23T 4h 0m
vUSBf (1 process)
vUSBf Multiprocessing
0T 5h 30m
0T 2h 18m
vUSBf Clustering
0T 1h 48m
0T 0h 51m
0 Tage 0 Stunden 0 Minuten 0 Sekunden
CAOS-Stick - Crash Any Operating System
17 Tage 9 Stunden 0 Minuten 0 Sekunden
11
vUSBf
•
Ermöglicht eine umfassende Suche
•
Aktuell schnellste Lösung für USBFuzzing
•
Nächste Version:
•
Umfassender Windows-Support
•
Django-basiertes Webinterface
•
It’s done when it’s done! :)
CAOS-Stick - Crash Any Operating System
12
vUSBf Nachteile
•
Schwachstellen nur virtuell reproduzierbar
•
Artefakte der Virtualisierung können nicht ausgeschlossen werden
•
Die Reproduktion von Bugs kann „aufwändig“ sein:
•
Aufsetzen einer VM
•
Installation des Frameworks
CAOS-Stick - Crash Any Operating System
13
CAOS-Stick
•
Crash Any Operating System
•
Erweiterung für das vUSBf-Framework
•
Export von gefundenen Bugs:
•
Automatische Generierung von
Firmware
•
Arduino-Leonardo kompatible
Hardware (z.B. Freetronics
Leostick)
CAOS-Stick - Crash Any Operating System
14
CAOS-Stick
•
Mehrere Sequenzen von Payloads in einer Firmware
•
Nur durch die Größe des ROM limitiert
•
UART-Interface für das Debugging
•
Weitere Features:
•
time-to-wait-until-execute
•
timeout-between-payloads
•
…
CAOS-Stick - Crash Any Operating System
15
CAOS-Stick
•
CAOS-Erweiterung wird
demnächst veröffentlicht
•
Einschliesslich FacedancerInterface
CAOS-Stick - Crash Any Operating System
16
Demo
CAOS-Stick - Crash Any Operating System
17
Schwachstelle (Linux)
usbvision.ko
•
•
Nullpointer-Dereferenzierung durch fehlerhafte Input-Validierung
•
Kernel Panic
•
CVE: 2015-7833
•
CVSS: 4.9
•
Gemeldet im März 2015
•
Erste Reaktion erst nach der Veröffentlichung des Bugs und der
entsprechenden CAOS-Firmware
CAOS-Stick - Crash Any Operating System
18
Schwachstelle (Linux)
•
Upstream seit Anfang Februar 2016
•
Treiber erwartet fehlendes USB-Interface
•
•
Konzeptionelles Problem im Linux-Kernel
Advisory:
•
https://os-s.de/publikationen.html
•
oss-2015-4: RHEL 7 Kernel crashes on invalid USB device
descriptors (usbvision driver)
CAOS-Stick - Crash Any Operating System
19
Schwachstelle (Windows)
•
ser2co64.sys
•
Kernel-Stack Buffer Overflow
•
CVSS: 6.9
•
Wird automatisch installiert per Windows Update
•
Ermöglicht unter Umständen eine Code-Execution
•
Fehlerhafte Verwendung der Kernel-API:
•
64 Byte Buffer für ein maximal 64 Zeichen langen UTF-16 String
vorgesehen
CAOS-Stick - Crash Any Operating System
20
Schwachstelle (Windows)
•
Keine Reaktion seitens Prolific oder Microsoft
•
Bestätigt für Windows 7, 8 und 10
•
•
32-Bit Version des Treibers (noch) nicht überprüft
Advisory am 08.02.2016 veröffentlicht:
•
https://os-s.de/publikationen.html
•
oss-2016-4: Local Microsoft Windows 7 / 8 / 10 Buffer Overflow via
Third-Party USB-Driver (ser2co64.sys)
CAOS-Stick - Crash Any Operating System
21
Weitere Schwachstellen
•
Weitere Advisories folgen demnächst:
•
Nullpointer-Dereferenzierungen
•
Unhandleable Paging Requests
•
Heap-Overflows
•
…
•
Betreffen Linux, FreeBSD, MS Windows und OS X
•
Jedes Advisory enthält auch die entsprechende CAOS-Firmware
CAOS-Stick - Crash Any Operating System
22
Fazit
•
Generische, automatische und umfassende Suche nach
fehlerhaften USB-Treibern
•
CAOS-Stick ermöglicht die Generierung von echten PoC
•
Aktuelle Forschung:
•
•
Bessere Code-Coverage durch neue
Herangehensweisen
Don’t trust your USB :)
CAOS-Stick - Crash Any Operating System
23
Vielen Dank für Ihre
Aufmerksamkeit!
Sergej Schumilo
Mail:
Twitter:
CAOS-Stick - Crash Any Operating System
[email protected]
@ms_s3c
24