Agenda
Virtualization : big picture Attack surface analysis Introducing the Virtual 8086 mode Practical use : Fuzzing using vm86()
Virtualization : big picture
Market shares
Defnitions
Virtualization : market shares
Source : Forrester Research 2009
78% of companies have production servers virtualized.
20% only have virtualized servers.
Virtualization : market shares
Source : Forrester Research 2009
VMWare is present in 98% of the companies.
Microsoft virtualization products are used by 17%.
Citrix/Xen is used by 10%.
Virtualization : Defnitions
Virtualization
Virtualization is the name given to the simulation with higher level components, of lower level components.
NOTE: Virtualization of applications (as opposed to full Oses) is out of topic.
Virtualization : Defnitions
Virtual Machine
A virtual machine (VM) is : "an efficient, isolated duplicate of a real machine".
--Gerald J. Popek and Robert P. Goldberg (1974). "Formal Requirements for Virtualizable Third Generation Architectures", Communications of the ACM.
Virtualization : Defnitions
Paravirtualization
Requires the modifcation of the guest Oses (eg: Xen, UML, Qemu with kquemu, VMWare Workstation with VMWare Tools).
Opposed to « full virtualization ».
Paravirtualization
Virtualization : Defnitions
There are two types of virtualizations : Virtual Machine Monitors (or
Hypervisors) of type I and type II.
Virtualization : Defnitions
Hypervisors of type I
Run on bare metal (eg: Xen,
Type I Hypervisor
Virtualization : Defnitions
Hypervizors of type II
Run as a process inside a host OS to virtualize guests Oses (eg: Qemu, Virtualbox, VMWare Workstation, Parallels).
Type II hypervisor
Virtualization : Defnitions
Isolation
Isolation of the userland part of the OS to simulate independant machines (eg:
Isolation
Attack surface analysis
Privilege escalation on the
host
VMware Tools HGFS Local Privilege Escalation Vulnerability
(http://labs.idefense.com/intelligence/
vulnerabilities/display.php?id=712)
Privilege escalation on the
Guest
Attacking other guests
Vmare workstation guest isolation weaknesses (clipboard transfer)
http://www.securiteam.com/
securitynews/5GP021FKKO.html
DoS (Host + Guests)
ioctls crashing the Host+Guests)
Escape to host
Rafal Wojtczuk (Invisible things, BHUS 2008)
IDEFENSE VMware Workstation Shared Folders Directory Traversal Vulnerability
(hardware level) attack
vectors
Ioports:
outb, outw, outl, outsb, outsw, outsl, inb, inw, inl, insb, insw, insl, outb_p, outw_p, outl_p, inb_p, inw_p, inl_p
Problems: sequence, multiple ports
Ioctls:
int ioctl(int d, int request, ...)
Problems : arbitrary input size !
Introducing the Virtual 8086 mode
Introduced with Intel 386 (1985)
Introducing the
Virtual 8086 mode
Intel x86 cpus support 3 modes
-Protected mode
-Real mode
-System Management Mode (SMM)
Introducing the
Virtual 8086 mode
Protected mode
This mode is the native state of the processor. Among the capabilities of protected mode is the ability to directly execute
Introducing the
Virtual 8086 mode
This mode implements the programming environment of the Intel 8086 processor with extensions (such as the ability to switch to protected or system management mode). The processor is placed in
Introducing the
Virtual 8086 mode
System management mode (SMM)
This mode provides an operating system or executive with a transparent mechanism for implementing platform specifc functions such as power management and system security. The processor enters SMM when the external SMM interrupt pin (SMI#) is activated or an SMI is received from the advanced programmable interrupt controller (APIC).
Nice things about Real
mode / Virtual 8086 mode
Direct access to hardware via interruptions !
exemple:
Mov ah, 0x42 ; read sector from drive Mov ch, 0x01 ; Track
Mov cl, 0x02 ; Sector
Mov dh, 0x03 ; Head
Mov dl, 0x80 ; Drive (here frst HD) Mov bx, ofset buf ; es:bx is destination
Int 0x13 ; hard disk operation
Complexity
ax*bx*cx*dx (per interruption)
Id est: [0;65535]^4 ~ 1.8 * 10^19 => still huge
=> much better than ioctl()'s arbitrary input length !
Introducing the Virtual 8086 mode
Putting it all together...
Introducing the
Virtual 8086 mode
Corollary
The hypervisor runs under protected
mode (ring0, ring1 (!!) or ring3).
All of the guests run in protected mode.
Introducing the
Virtual 8086 mode
The kernel boots in (16b) real mode, and then switches to protected mode (32b).
The cpu normally doesn't get back to
real mode untill next reboot.
GAME OVER ?
Not quite ;)
Leaving protected mode ?
(Ascii Art : Courtesy of phrack 65)
Setting the VM fag in CR0 under protected mode would get us to Virtual Mode Removing the PE fag from CR0 would get us back to real mode
Leaving protected mode ?
|
|
|
|
|
|||
static const unsigned char real_mode_switch [] = |
|
|
|
||||
{ |
0x66, 0x0f, 0x20, 0xc0, |
/* |
movl |
%cr0,%eax |
*/ |
||
|
0x66, 0x83, 0xe0, 0x11, |
/* |
andl |
$0x00000011,%eax */ |
|||
|
0x66, 0x0d, 0x00, 0x00, 0x00, 0x60, |
/* |
orl |
$0x60000000,%eax */ |
|||
|
0x66, 0x0f, 0x22, 0xc0, |
/* |
movl |
%eax,%cr0 |
*/ |
||
|
0x66, 0x0f, 0x22, 0xd8, |
/* |
movl |
%eax,%cr3 |
*/ |
||
|
0x66, 0x0f, 0x20, 0xc3, |
/* |
movl |
%cr0,%ebx |
*/ |
||
|
0x66, 0x81, 0xe3, 0x00, 0x00, 0x00, 0x60, |
/* |
andl $0x60000000,%ebx */ |
||||
|
0x74, 0x02, |
/* |
jz |
f |
|
*/ |
|
|
0x0f, 0x09, |
/* |
wbinvd |
*/ |
*/ |
||
|
0x24, 0x10, |
/* f: andb |
$0x10,al |
||||
}; |
0x66, 0x0f, 0x22, 0xc0 |
/* |
movl |
%eax,%cr0 |
*/ |
Trouble is...
This obviously won't work inside a virtual machine !
Because
Truth is : we don't need to
switch back to real
mode/virtual 8086 mode !
Most Operating systems ofer a way to run 16b applications (eg: MS DOS) under protected mode by emulating a switch to Virtual 8086 Mode.
Notably Windows (x86) and Linux (x86).
The Windows case
NTVDM : ntvdm.exe
« Windows 16b Virtual Machine »
The Linux case
The linux kernel provides an emulation |
|
of real mode in the form of two |
|
syscalls: |
|
#defne __NR_vm86old |
113 |
#defne __NR_vm86 |
166 |
The Linux case
#include <sys/vm86.h>
int vm86old(struct vm86_struct *info);
int vm86(unsigned long fn, struct vm86plus_struct *v86);
struct vm86_struct {
};
struct vm86_regs regs;
unsigned long fags; unsigned long screen_bitmap; unsigned long cpu_type; struct revectored_struct
int_revectored; struct revectored_struct int21_revectored;
struct vm86_struct {
};
struct vm86_regs regs;
unsigned long fags; unsigned long screen_bitmap; unsigned long cpu_type; struct revectored_struct
int_revectored;
struct revectored_struct int21_revectored;
The Linux case
struct vm86_regs { long ebx; long ecx; long edx; long esi; long edi; long ebp;
(…) long eax;
unsigned short es, __esh; unsigned short ds, __dsh; unsigned short fs, __fsh; unsigned short gs, __gsh;
};
In a nutshell
-The switch to Virtual mode is completely emulated by the kernel (this will work inside a VM)
-We can still program using old school interruptions (easy !)
-Those interruptions are delivered to the hardware (id est: either the emulated one, or the real one).
=> We just got a « bare metal (possibly virtualized) hardware interface »
Practical use : Fuzzing
using vm86()
Looking at the IVT
Practical use : Fuzzing
using vm86()
Hypervizors bugs !
Virtualbox
00:21:13.603 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00:21:13.603 !!
00:21:13.603 !! Guru Meditation
00:21:13.603 !! TRAP=0e ERRCD=0000000000000000 CR2=00000000000c0000 EIP=f215e33 Type=0
00:21:13.603 !! EIP in VMMGC.gc (f1dd000) at rva 38e33 near symbols: 00:21:13.603 !! f215df0 rva 00038df0 of 00000043
_ZL10disCoreOneP12_DISCPUSTATEyPj
00:21:13.603 !! f216040 rva 00039040 of
00:21:13.603 !! ff8:f215e33 0f b6 10 movzx edx, byte [eax] 00:21:13.603 !!
00:21:13.603 !! 00:21:13.603 !!
00:21:13.603 Hypervisor CPUM state: se
00:21:13.603 .eax=000c0000 .ebx=fed69cfc .ecx=00000000 .edx=00000000 .esi=000000 01 .edi=fec01000
Virtualbox (take 2)
00:02:51.129 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00:02:51.129 !!
00:02:51.129 !! Guru Meditation
00:02:51.129 !! TRAP=0e ERRCD=0000000000000000 CR2=00000000000ab000 EIP=f215e33 Type=0
00:02:51.129 !! EIP in VMMGC.gc (f1dd000) at rva 38e33 near symbols: 00:02:51.129 !! f215df0 rva 00038df0 of 00000043
_ZL10disCoreOneP12_DISCPUSTATEyPj
00:02:51.129 !! f216040 rva 00039040 of
00:02:51.129 !! ff8:f215e33 0f b6 10 movzx edx, byte [eax] 00:02:51.129 !!
00:02:51.129 !! 00:02:51.129 !!
00:02:51.129 Hypervisor CPUM state: se
00:02:51.129 .eax=000ab000 .ebx=fed69cfc .ecx=00000000 .edx=00000000 .esi=000000 01 .edi=fec01000
00:02:51.129 .eip=f215e33 .esp=fed69c7c .ebp=fed69cc4 .iopl=0 rf nv up di nt zr ac pe cy
More bugs
Virtual PC (Guest ?)
Parallels (Guest)
Inhibit Mask=0
CS=FF63 [0000FFFF 0000F30F] V=1
SS=FFD3 [0000FFFF 00CF9300] V=1
DS=0018 [0000FFFF 00CFF300] V=1
ES=0018 [0000FFFF 00CFF300] V=1
FS=FF9B [0000FFFF 00CF9300] V=1
GS=0018 [0000FFFF 00CF9300] V=1
EAX=000000A9 EBX=00005148 ECX=0000F686 EDX=0000000B ESI=00002D72 EDI=000007E4 EBP=00002E99 ESP=00000FFA EIP=0000FE96 EFLAGS=00023202
DEMOS
Thank you for coming
Questions ?