0% found this document useful (0 votes)
94 views

Attacking The Windows Kernel

The document outlines various attack vectors against the Windows kernel, including directly from user mode, through public and undocumented APIs, and by exploiting architectural flaws or bugs in kernel code. It discusses tools for static and dynamic analysis, such as debuggers, driver verifiers, and disassemblers. Examples are provided of past vulnerabilities involving buffer overflows, integer overflows, and trusting user input. Defensive measures like parameter validation, code signing, and moving functionality to user mode are assessed. Future work exploring fuzzing, virtualizing the kernel, and automated binary analysis is proposed.

Uploaded by

batong96
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
94 views

Attacking The Windows Kernel

The document outlines various attack vectors against the Windows kernel, including directly from user mode, through public and undocumented APIs, and by exploiting architectural flaws or bugs in kernel code. It discusses tools for static and dynamic analysis, such as debuggers, driver verifiers, and disassemblers. Examples are provided of past vulnerabilities involving buffer overflows, integer overflows, and trusting user input. Defensive measures like parameter validation, code signing, and moving functionality to user mode are assessed. Future work exploring fuzzing, virtualizing the kernel, and automated binary analysis is proposed.

Uploaded by

batong96
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 36

Attacking the Windows Kernel

Below The Root

Jonathan Lindsay, Reverse Engineer in extremis


Introduction
Limited to Windows, and aimed at IA32:
• Outline of protected mode and the kernel
• Attack vectors
• Useful tools
• Examples
• Defensive measures
• Future directions
Architecture Overview
A long time ago in a galaxy far, far
away…
The progression from Intel’s 8088 to 80386,
via the 80286, added:
• Page and segment level protection
• Call, interrupt and task gates
• Privileged and sensitive instructions
• Four privilege levels underlying the
protection mechanisms above
• 32bit support
The supervisor
The NT kernel provides:
• Segregation of user mode processes
• Protection of the kernel from user mode
• Provide services to user mode and other
kernel mode code
• Session management and the Windows
graphics subsystem
The NT kernel
• System call and DeviceIoControl covered
• Graphics drivers
– Display driver
– Miniport driver
• NDIS and TDI
• Port objects
• Windows Driver Framework
• Kernel mode callbacks
• Hardware interfaces
– Talking to hardware
– Listening to hardware
A plan of attack
• Directly from user mode?
– CPU bugs
– Operating system design
• Public APIs
– StartService, DeviceIoControl, ExtEscape
• Undocumented APIs
– ZwSystemDebugControl, ZwSetSystemInformation
• Architectural flaws
• Bugs in code
• Subverting operating system initialization
• Modifying kernel modules on disk
– Viruses
– DLL (export driver) injection
Tools of the trade
Two different approaches
• Dynamic analysis
– Will not guarantee results
– Fuzzing awkward to automate
• Static analysis
– Can be complicated and time consuming
– Source code very helpful
• Best results achieved by combining both
Static analysis
• Static driver verifier
• PREFast
• Disassembler
• Windows Driver Kit
– Documentation and header files
Dynamic analysis
• WinDbg
• Driver verifier
• Miscellaneous
– WinObj
– NtDispatchPoints
– Rootkit Hook Analyzer
Getting our hands dirty
I have the tools, now what?
• Poor access control
• Trusting user supplied data
– Pointers and lengths
• Typical coding bugs
– Boundary conditions
– Off-by-one errors
• Design flaws
– Expose kernel functionality or data
Reverse engineering
• Knowing the correct entry points means
code coverage can be guaranteed
• Subtle bugs are easier to find - signedness
• Memory overwrites are very easy to find
• Highlight areas of code more suited to
fuzzing
• No need to analyze a crash dump
• Lack of symbolic information may prove
awkward
CDFS DispatchDeviceControl
Source code analysis
• Access to source is not common
• Source code and a suitable IDE will
greatly improve auditing speed
• Assumptions made by the coder may help
hide subtle bugs
• Tools are available to help speed up the
process even further
• grep FIXME –r *.*
CDFS DispatchDeviceControl
Getting a foot in the door
Kernel targets we are interested in:
• Static or object function pointers
• Kernel variables - MmUserProbeAddress
• Descriptor tables
• Return address
• Code from a kernel module
• I/O access map from TSS
• Kernel structures – process token, loaded
module list, privilege LUIDs
Real world examples
NT kernel compression support
• Kernel runtime library exports functions to
support compression
– Used by SMB and NTFS
• Support routines take a parameter indicating
what algorithm to use
– Used as an index into a function table
• The table only has 8 entries, whereas the
maximum index allowed is 15
– We can treat code or data as a function pointer,
potentially to a user mode address
Trusting user input
• The following code takes a pointer from a
buffer supplied by the user and trusts it
– Either a sign-extended kernel stack address
or an internal handle will be written there
• This can be used to overwrite other code
or data, allowing arbitrary code execution
• User supplied pointers into:
– user mode should be validated
– kernel mode should be opaque, e.g. a handle
An architectural flaw
• A function designed to allow the
modification of arbitrary memory
• Exposed to unprivileged users
• Provided the internal data structure can be
figured out, it is then easy to exploit
• Either access control to the driver, or a
different architecture is needed
Defensive measures
Current architecture
• Parameter validation
• Code signing – quality control?
• PatchGuard
• Moving functionality into user mode –
UMDF, display drivers in Vista
• Restricting access to APIs
– User restrictions
– Privilege restrictions
– Process restrictions
Alternative approaches
• Hypervisor
– Designed to help virtualization
– Provides a layer beneath the supervisor
– It could be used to provide a microkernel architecture
• Microkernel
– Does not require virtualization hardware
– Minimizes the attack surface provided by the kernel
– Increases flexibility with respect to service
implementation
– Microsoft’s Singularity microkernel is strongly typed
and uses software based protection
Future work
Fuzzing
• Application fuzzing unlikely to crash the
OS
• We need to automate crash recovery and
analysis:
– Run in a VM, but what about real hardware?
– Have bugcheck callbacks
– Modify the kernel itself
• Fuzzing interfaces is greatly aided by
some form of static analysis
Virtualizing the kernel
• Provide a user mode environment that looks the
same as the kernel
• Implement user mode compatible APIs where
necessary
• Provide basic I/O, PnP, Process Support and
executive functionality
• Trap and handle protected and privileged code
execution
• Add instrumentation for analysis and logging
Automated binary analysis
• Model basic CPU functionality
– Instead of processing a specific value, instructions
work on a defined range
– Instructions can modify the range stored in a register
• Allows all code paths to be assessed
– Large state space
• Determine ranges of values that will hit certain
pieces of code
• Heuristic bug detection
In conclusion …
Summary
• Current NT kernel architecture increases
the likelihood of security issues
• Debatable how much effort has gone into
securing kernel code
• Some areas of the kernel have not
received much attention
• There is plenty of scope for further
research and tool development
Questions?

Thanks

You might also like