Virtdbg. Using virtualization features for debugging the Windows 7 kernel. Damien Aumaitre. Recon 2011



Similar documents
Nested Virtualization

FRONT FLYLEAF PAGE. This page has been intentionally left blank

A Hypervisor IPS based on Hardware assisted Virtualization Technology

Virtualization in Linux KVM + QEMU

matasano Hardware Virtualization Rootkits Dino A. Dai Zovi

Intel s Virtualization Extensions (VT-x) So you want to build a hypervisor?

Brian Walters VMware Virtual Platform. Linux J. 1999, 63es, Article 6 (July 1999).

Bluepilling the Xen Hypervisor

Uses for Virtual Machines. Virtual Machines. There are several uses for virtual machines:

Intel Vanderpool Technology for IA-32 Processors (VT-x) Preliminary Specification

Intel Virtualization Technology Specification for the IA-32 Intel Architecture

Intel Virtualization Technology Overview Yu Ke

CS5460: Operating Systems. Lecture: Virtualization 2. Anton Burtsev March, 2013

Hardware Assisted Virtualization Intel Virtualization Technology

ERNW Newsletter 43 / May 2014

Attacking Hypervisors via Firmware and Hardware

Security Challenges in Virtualized Environments

Compromise-as-a-Service

Taming Hosted Hypervisors with (Mostly) Deprivileged Execution

Introducing Ring -3 Rootkits

Virtualization. ! Physical Hardware. ! Software. ! Isolation. ! Software Abstraction. ! Encapsulation. ! Virtualization Layer. !

Outline. Outline. Why virtualization? Why not virtualize? Today s data center. Cloud computing. Virtual resource pool

Windows Kernel Internals for Security Researchers

Virtualization Technology. Zhiming Shen

Hardware virtualization technology and its security

Hypervisors and Virtual Machines

UEFI Hypervisors Winning the Race to Bare Metal

Virtualization Technologies

SUBVERTING LINUX ON-THE-FLY USING HARDWARE VIRTUALIZATION TECHNOLOGY

Melde- und Analysestelle Informationssicherung MELANI Torpig/Mebroot Reverse Code Engineering (RCE)

Electrical Engineering and Computer Science Department

Hooking Nirvana RECON 2015 ALEX 1/26/2016 COPYRIGHT 2015 ALEX IONESCU. ALL RIGHTS RESERVED. 1

COS 318: Operating Systems

Hardware Based Virtualization Technologies. Elsie Wahlig Platform Software Architect

Virtual Machines. COMP 3361: Operating Systems I Winter

Full and Para Virtualization

Cloud^H^H^H^H^H Virtualization Technology. Andrew Jones May 2011

1. Computer System Structure and Components

Poacher turned gamekeeper: Lessons learned from eight years of breaking hypervisors

Hypervisor-Based, Hardware-Assisted System Monitoring

Nested Virtualization

Chapter 5 Cloud Resource Virtualization

Nested Virtualization

Attacking Hypervisors via Firmware and Hardware

KVM Architecture Overview

Implementation and Implications of a Stealth Hard-Drive Backdoor

A Tour Beyond BIOS Supporting an SMM Resource Monitor using the EFI Developer Kit II

Virtualization. Jukka K. Nurminen

The Turtles Project: Design and Implementation of Nested Virtualization

Virtualization Technology. Zhonghong Ou Data Communications Software Lab, Aalto University

Virtualization VMware Inc. All rights reserved

Virtual machines and operating systems

Hypervisor Memory Forensics

Basics of Virtualisation

Kernel Virtual Machine

Recon Montreal

VMware and CPU Virtualization Technology. Jack Lo Sr. Director, R&D

Linux Driver Devices. Why, When, Which, How?

Virtual Machines. Virtual Machine (VM) Examples of Virtual Systems. Types of Virtual Machine

Secure In-VM Monitoring Using Hardware Virtualization

One-byte Modification for Breaking Memory Forensic Analysis

OSes. Arvind Seshadri Mark Luk Ning Qu Adrian Perrig SOSP2007. CyLab of CMU. SecVisor: A Tiny Hypervisor to Provide

Jukka Ylitalo Tik TKK, April 24, 2006

Machine Virtualization: Efficient Hypervisors, Stealthy Malware

Virtualization Technology

Detection of virtual machine monitor corruptions

Distributed System Monitoring and Failure Diagnosis using Cooperative Virtual Backdoors

The Microsoft Windows Hypervisor High Level Architecture

ProMoX: A Protocol Stack Monitoring Framework

How do Users and Processes interact with the Operating System? Services for Processes. OS Structure with Services. Services for the OS Itself

A Survey on Virtual Machine Security

I Control Your Code Attack Vectors Through the Eyes of Software-based Fault Isolation. Mathias Payer, ETH Zurich

Intel Trusted Platforms Overview

Virtualization. Explain how today s virtualization movement is actually a reinvention

CSC 2405: Computer Systems II

Intel Virtualization Technology

VICE Catch the hookers! (Plus new rootkit techniques) Jamie Butler Greg Hoglund

Virtualization and Other Tricks.

BHyVe. BSD Hypervisor. Neel Natu Peter Grehan

Computer Organization & Architecture Lecture #19

Code Injection From the Hypervisor: Removing the need for in-guest agents. Matt Conover & Tzi-cker Chiueh Core Research Group, Symantec Research Labs

Under the Hood: How Actaeon Unveils Your Hypervisor

Virtualization. Dr. Yingwu Zhu

INPUT/OUTPUT ORGANIZATION

Virtualization. Jia Rao Assistant Professor in CS

Distributed Systems. Virtualization. Paul Krzyzanowski

Hybrid Virtualization The Next Generation of XenLinux

Virtualization. P. A. Wilsey. The text highlighted in green in these slides contain external hyperlinks. 1 / 16

EXPLORING LINUX KERNEL: THE EASY WAY!

Knut Omang Ifi/Oracle 19 Oct, 2015

Introduction. What is an Operating System?

Hotpatching and the Rise of Third-Party Patches

Virtualization. Clothing the Wolf in Wool. Wednesday, April 17, 13

9/26/2011. What is Virtualization? What are the different types of virtualization.

Virtualization System Vulnerability Discovery Framework. Speaker: Qinghao Tang Title:360 Marvel Team Leader

Fine-grained covert debugging using hypervisors and analysis via visualization

Guardian: Hypervisor as Security Foothold for Personal Computers

Architecture of the Kernel-based Virtual Machine (KVM)

Operating System Overview. Otto J. Anshus

VxWorks Guest OS Programmer's Guide for Hypervisor 1.1, 6.8. VxWorks GUEST OS PROGRAMMER'S GUIDE FOR HYPERVISOR

Transcription:

Virtdbg Using virtualization features for debugging the Windows 7 kernel Damien Aumaitre Recon 2011

D. Aumaitre Virtdbg 2/42 Roadmap How it began Designing a kernel debugger Debugging Windows 7 x64 1 How it began Designing a kernel debugger Debugging Windows 7 x64 2 3

D. Aumaitre Virtdbg 3/42 How it began Designing a kernel debugger Debugging Windows 7 x64 How it began Study of Windows 7 x64 internals PatchGuard Code integrity DRM But how? Static analysis: IDA, metasm Dynamic analysis: need a kernel debugger, Which one?

D. Aumaitre Virtdbg 4/42 How it began Designing a kernel debugger Debugging Windows 7 x64 Dynamic analysis: kernel debugger Plenty of kernel debuggers Local: SoftICE, Syser, HyperDbg... Remote: WinDbg, Gdb,... Which one to choose? Need x64 support gdb and windbg handle x64 Need to work without /DEBUG gdb inside virtual machine?

D. Aumaitre Virtdbg 5/42 Dynamic analysis: virtualisation How it began Designing a kernel debugger Debugging Windows 7 x64 Lots of candidates XEN, qemu, vmware,... But kernel debugging not easy with gdb stub (too process-centric), need to develop extensions to gdb protocol Big softwares, hard to tinker with Emulated devices may interfere with Windows 7 internals (not sure if DRM stack will load under vmware) Need a debugger! Which handles x64 And work without /DEBUG boot flag Using real hardware

D. Aumaitre Virtdbg 6/42 How it began Designing a kernel debugger Debugging Windows 7 x64 What kind of debugger? Local debuggers Pros Cons Need only one box Easy to setup Hard to extend Lack basic features (copy/paste?) Hard dependencies on hardware like framebuffer, keyboard for the GUI Remote debuggers Pros Cons Extendable easily with plugins Lot of code is deported, easier to develop Copy/paste :) Requires two boxes Need a remote stub for handling communications

D. Aumaitre Virtdbg 7/42 How do they work? How it began Designing a kernel debugger Debugging Windows 7 x64 They catch processor interrupts (often by hooking the IDT). Example: IA-32 IDT (Interruption Descriptor Table) stores interruption vectors INT1 is used by hardware breakpoints (DR registers) and singlestep INT3 is used by software breakpoints INT14 (page fault) is used for catching memory breakpoints

D. Aumaitre Virtdbg 8/42 How it began Designing a kernel debugger Debugging Windows 7 x64 How do they work? Two modes of operations Debug mode: debugger waits for user interactions, other processors are halted Normal mode: the operating system runs as usual Interactions We switch to debug mode when receiving a breakin request: To inspect processor registers To inspect memory (virtual, physical, io) To set breakpoints Switch to normal mode with a continue request

D. Aumaitre Virtdbg 9/42 Debugging Windows 7 x64 How it began Designing a kernel debugger Debugging Windows 7 x64 Several problems arise How to execute kernel code when signed drivers are mandatory? How to gain control of the interruption vectors when PatchGuard deny modifications of the IDT? Patching the kernel is not possible with PatchGuard (bye bye software breakpoints) How to communicate with the debugger stub when the entire OS is frozen?

D. Aumaitre Virtdbg 10/42 How it began Designing a kernel debugger Debugging Windows 7 x64 Bypassing PatchGuard PatchGuard PatchGuard protects the kernel from malicious activities: It prevents kernel code modification Also prevents the modification of major structures (IDT, SSDT,... ) Causes a blue screen if a modification is detected Bypassing PatchGuard control of IDT By using hardware assisted virtualization We can control very precisely the execution of the target system with a hypervisor (VMM) We take control whenever an interruption occurs Bonus: very stealth by design (cf. BluePill)

D. Aumaitre Virtdbg 11/42 Communication with the hypervisor How it began Designing a kernel debugger Debugging Windows 7 x64 Communication between debugger/debuggee Usually kernel debuggers use a serial interface to communicate; it works but it s really slow :( WinDbg uses FireWire for highspeed debugging, it s convenient and easy to setup Using FireWire? Speed is good (around 10Mb/s) Widely deployed But I don t know FireWire... Except for doing DMA attacks :-)

D. Aumaitre Virtdbg 12/42 How it began Designing a kernel debugger Debugging Windows 7 x64 DMA Theory Historically, all I/O came through the CPU. It s slow. DMA instead goes through a fast memory controller Implemented as part of the PCI specification Any device on the PCI / PCI Express bus can issue a read/write DMA A flawed idea? The CPU and thus OS are entirely bypassed, cannot prevent malicious DMA requests

D. Aumaitre Virtdbg 13/42 DMA How it began Designing a kernel debugger Debugging Windows 7 x64 Consequences Any device may read/write the physical memory Operating system s code and internal data can be modified Security mechanisms rendered useless Over-simplified example of DMA access

D. Aumaitre Virtdbg 14/42 How it began Designing a kernel debugger Debugging Windows 7 x64 Communication with the hypervisor Using DMA over FireWire? No hardware specific code (only read/write in shared buffers) libforensic1394 library allows easy development bus = Bus.new() bus.enable_sbp2 puts "waiting for dma access..." sleep 5 devices = bus.devices dev = devices[0] dev.open mem = FireWireMem.new(dev) puts mem.hexdump(0x8000, 0x100) Bonus: use DMA attacks to load unsigned kernel drivers

D. Aumaitre Virtdbg 15/42 Bypassing driver integrity verification How it began Designing a kernel debugger Debugging Windows 7 x64 Signed drivers Since Vista, drivers need to be signed on x64 editions of Windows This can be disabled but there are side effects (booting in test signing mode) Solution: Loading a driver using FireWire Do not use the kernel code for loading drivers We implement our own loader thus skipping the verification process

D. Aumaitre Virtdbg 16/42 Roadmap Reconstructing the virtual memory Rerouting execution flow 1 2 Reconstructing the virtual memory Rerouting execution flow 3

D. Aumaitre Virtdbg 17/42 Loading the driver code Reconstructing the virtual memory Rerouting execution flow "Live" loader Parses physical memory and reconstructs virtual/physical layer Injects driver code in two stages (more on that later) Loads driver code without using kernel API but custom routines (hence bypassing signatures) 1 Copy binary sections, resolve imports and apply relocations 2 Redirect execution to driver entrypoint

D. Aumaitre Virtdbg 18/42 Reconstructing the virtual memory Rerouting execution flow Injecting a driver with DMA requests What do we need? Reconstructing the virtual memory mapping Space for storing our payload Finding a function pointer Difficulties Can t use kernel routines for loading the image Need to not trigger PatchGuard

D. Aumaitre Virtdbg 19/42 x64 Virtual address translation Reconstructing the virtual memory Rerouting execution flow

D. Aumaitre Virtdbg 20/42 Reconstructing the virtual memory Rerouting execution flow Finding cr3 Classic method Searching for the beginning of an EPROCESS structure Use backup copy of cr3 in DirectoryTableBase field Take forever... (around several minutes) Can be at the end of the physical memory struct _KPROCESS, 37 elements, 0x160 bytes +0x000 Header : struct _DISPATCHER_HEADER, 29 elements, 0x18 bytes +0x018 ProfileListHead : struct _LIST_ENTRY, 2 elements, 0x10 bytes +0x028 DirectoryTableBase : Uint8B...

D. Aumaitre Virtdbg 21/42 Reconstructing the virtual memory Rerouting execution flow Finding cr3 Quicker method Searching for the kernel beginning Getting kernel symbols addresses using debug information (PDB) Get offset of the first KPCR structure (KiInitialPCR) We find the values of all control registers included cr3 struct _KPCR, 27 elements, 0x4e80 bytes +0x180 Prcb : struct _KPRCB, 242 elements, 0x4d00 bytes +0x040 ProcessorState : struct _KPROCESSOR_STATE, 2 elements, 0x5b0 bytes +0x000 SpecialRegisters : struct _KSPECIAL_REGISTERS, 27 elements, 0xd8 bytes +0x000 Cr0 : Uint8B +0x008 Cr2 : Uint8B +0x010 Cr3 : Uint8B...

D. Aumaitre Virtdbg 22/42 Reconstructing the virtual memory Rerouting execution flow What s next? We can interpret any address in virtual memory In order to execute arbitrary kernel code we need a pointer to overwrite Which pointer? Solution Can t touch IDT or SSDT or kernel code due to PatchGuard Need something stealthier, often called and not checked by PatchGuard! Using function pointers located in OBJECT_TYPE_INITIALIZER structure a a Must read: Skape and Skywing, A catalog of Windows Local Kernel-mode Backdoor Techniques, 2007, Uninformed Vol. 8

D. Aumaitre Virtdbg 23/42 OBJECT_TYPE_INITIALIZER Reconstructing the virtual memory Rerouting execution flow Each object is categorized by an object type represented by a OBJECT_TYPE structure struct _OBJECT_TYPE, 12 elements, 0xd0 bytes +0x000 TypeList : struct _LIST_ENTRY, 2 elements, 0x10 bytes +0x010 Name : struct _UNICODE_STRING, 3 elements, 0x10 bytes +0x020 DefaultObject : Ptr64 to Void +0x028 Index : UChar... +0x040 TypeInfo : struct _OBJECT_TYPE_INITIALIZER, 25 elements, 0x70 bytes... OBJECT_TYPE structure contains a nested structure named OBJECT_TYPE_INITIALIZER

D. Aumaitre Virtdbg 24/42 Reconstructing the virtual memory Rerouting execution flow OBJECT_TYPE_INITIALIZER Several fields of the OBJECT_TYPE_INITIALIZER structure are functions pointers struct _OBJECT_TYPE_INITIALIZER, 25 elements, 0x70 bytes... +0x030 DumpProcedure : Ptr64 to void +0x038 OpenProcedure : Ptr64 to long +0x040 CloseProcedure : Ptr64 to void +0x048 DeleteProcedure : Ptr64 to void +0x050 ParseProcedure : Ptr64 to long +0x058 SecurityProcedure : Ptr64 to long +0x060 QueryNameProcedure : Ptr64 to long +0x068 OkayToCloseProcedure : Ptr64 to unsigned char For example, OpenProcedure will point to nt!pspopenprocess for a Process

D. Aumaitre Virtdbg 25/42 Finding OBJECT_TYPE structures Reconstructing the virtual memory Rerouting execution flow Finding non-exported kernel symbols Several non-exported kernel symbols are present in the KDDEBUGGER_DATA64 structure a b defined in the Debugging Tools For Windows SDK header file wdbgexts.h This structure is pointed by the KdDataBlock kernel global variable typedef struct _KDDEBUGGER_DATA64 { DBGKD_DEBUG_DATA_HEADER64 Header; ULONG64 KernBase;... ULONG64 PsLoadedModuleList;... ULONG64 ObpTypeObjectType;... a http://uninformed.org/index.cgi?v=4&a=2&p=5 b http://web.archive.org/web/20061110120809/http: //www.rootkit.com/newsread.php?newsid=153

D. Aumaitre Virtdbg 26/42 Reconstructing the virtual memory Rerouting execution flow The hypervisor code is implemented as a WDK driver We inject the hypervisor with several steps: 1 We inject a stager responsible for allocating the memory used for storing the code of the hypervisor (for example, first memory page of a already loaded driver or at the end of the KUSER_SHARED_DATA structure) 2 Once the memory is allocated, we map the driver section by section 3 Then we resolve imports and apply relocations Signed drivers Effectively bypassing signed driver mechanism

D. Aumaitre Virtdbg 27/42 What s next? Reconstructing the virtual memory Rerouting execution flow We can load an arbitrary driver in the target OS What kind of driver? Hypervisor Virtualize the operating system without rebooting (ala BluePill) Requires Intel VMX hardware virtualization features (no AMD support)

D. Aumaitre Virtdbg 28/42 Roadmap Hypervisor Using an hypervisor for debugging Communication Implementation 1 2 3 Hypervisor Using an hypervisor for debugging Communication Implementation

D. Aumaitre Virtdbg 29/42 Specifications Hypervisor Using an hypervisor for debugging Communication Implementation Constraints Minimal impact on the system (don t use OS functions (if possible) and no modifications of kernel structures Features Stealth by design Heavy treatment deported on the client Basic primitives (for the moment): Read/write memory Read/write registers Singlestepping execution Stopping and resuming execution

VMX (Virtual Machines extensions) Hypervisor Using an hypervisor for debugging Communication Implementation Two operating modes VMX root hypervisor mode VMX non-root guest mode Remarks By design we can t tell which mode is active Switching between these modes is called VM-Entry (VMM Guest) and VM-Exit (Guest VMM) Processor behavior is modified in VMX non-root mode: some events cause transitions (access to control or debug registers, exceptions etc.) D. Aumaitre Virtdbg 30/42

VMX (Virtual Machines extensions) Hypervisor Using an hypervisor for debugging Communication Implementation Virtualization setup VMX mode is activated by the VMXON instruction Virtual machines are launched with the VMLAUNCH instruction Each VM-Exit calls the hypervisor handler The hypervisor resume guest execution with the VMRESUME instruction VMX mode is deactivated by the VMXOFF instruction VMCS (Virtual Machine Control Structure) Controls transitions between VMX root and VMX non-root Manipulated by new instructions: (VMPTRST, VMPTRLD, VMREAD, VMWRITE and VMCLEAR) D. Aumaitre Virtdbg 31/42

D. Aumaitre Virtdbg 32/42 Transitions Hypervisor Using an hypervisor for debugging Communication Implementation VM-root (hypervisor) VM-non-root (virtual machine aka target) _ExitHandler VM-Exit mov cr3, rax HandleVmExit : - CPUID? - MSR_READ - MSR_WRITE - CR_ACCESS - DR_ACCESS - EXCEPTION vmresume VM-Entry

Using an hypervisor for debugging Hypervisor Using an hypervisor for debugging Communication Implementation primitives Break or continue target execution Inspect registers Inspect memory Singlestep through code D. Aumaitre Virtdbg 33/42

Using an hypervisor for debugging Hypervisor Using an hypervisor for debugging Communication Implementation Break/Continue VM-Exit occurs when context is changed (mov cr3, rax for example) hence providing us with a regular callback for knowing if the user asked for system interactions If we need to switch to debug mode: Hypervisor stops the other processors And enters a loop waiting for orders If we don t: just resume target execution Inspecting registers A part of the context is saved in the VMCS We save the rest before entering in VMX root mode We restore the context before executing the VMRESUME instruction D. Aumaitre Virtdbg 34/42

Using an hypervisor for debugging Hypervisor Using an hypervisor for debugging Communication Implementation Inspecting memory Must be careful, no page fault can occur in the VMX-root handler! We check the PTE (Page Table Entry) in order to validate the address provided by the client Manipulating physical memory (no copy-on-write :-s) Single Step Easy because we control the RFLAGS register and can intercept INT1 D. Aumaitre Virtdbg 35/42

D. Aumaitre Virtdbg 36/42 Communication Hypervisor Using an hypervisor for debugging Communication Implementation Shared physical memory Use libforensic1394 a for handling DMA setup Contains the necessary information for synchronising and exchanging data between the hypervisor and the client Two areas are for exchanging requests ("uplink" and "downlink") a https://freddie.witherden.org/tools/libforensic1394/

D. Aumaitre Virtdbg 37/42 Virtdbg Hypervisor Using an hypervisor for debugging Communication Implementation What is it? Uses Hypervisor (like BluePill) to control the target Uses FireWire DMA requests for loading the VMM and giving orders to the debugger Client GUI leveraging the Metasm framework Designed to debug Windows 7 x64 on the fly (i.e. without booting with /DEBUG) Analyze hardware specific software like DRM Malware analysis (TLD4) Debugging Windows internals (PatchGuard, code integrity)

First implementation (march 2010) Hypervisor Using an hypervisor for debugging Communication Implementation 2 FPGA: one for handling DMA requests (Cardbus), the other for handling client requests (USB) Custom DMA engine in VHDL Driver for USB FPGA works only on Windows XP :(. Aumaitre Virtdbg 38/42

D. Aumaitre Virtdbg 39/42 Second implementation Hypervisor Using an hypervisor for debugging Communication Implementation Drops FPGA and uses only a FireWire cable for communication Leverages the metasm framework DEMO

D. Aumaitre Virtdbg 40/42 Conclusion Hypervisor Using an hypervisor for debugging Communication Implementation Why this project? No real kernel debuggers for Windows 7 x64 (except WinDbg) They are very intrusive and need OS cooperation Future work Porting the hypervisor to support 32-bit Windows Support of AMD processors (Phenom) Add more primitives and events (leveraging all possibilities of hardware virtualization features) Increase furtivity and anti-debug resilience Reduce operating system dependancy Support for VT-d Intel family of processors (currently only VT-x) Check out ramooflax a : preboot hypervisor a https://github.com/sduverger/ramooflax

Thanks and credits Hypervisor Using an hypervisor for debugging Communication Implementation Joanna Rutkowska for releasing BluePill (great source of information on hypervisors) Freddie Witherden 1, author of libforensic1394 (much better than previous bindings) Yoann Guillot for the Metasm framework 2 My colleagues at SOGETI/ESEC Lab (especially Christophe Devine) 1 https://freddie.witherden.org/tools/libforensic1394/ 2 http://metasm.cr0.org D. Aumaitre Virtdbg 41/42

D. Aumaitre Virtdbg 42/42 Q&A Hypervisor Using an hypervisor for debugging Communication Implementation Thank you for your attention! Give it a try! http://code.google.com/p/virtdbg Questions? Contact: damien (at) security-labs.org