02 CTRL Hijacking
02 CTRL Hijacking
02 CTRL Hijacking
Hijacking
Basic Control
Hijacking Attacks
Dan Boneh
Control hijacking attacks
• Attacker’s goal:
– Take over target machine (e.g. web server)
• Execute arbitrary code on target by
hijacking application control flow
• Examples.
– Buffer overflow attacks
– Integer overflow attacks
– Format string vulnerabilities
Dan Boneh
Example 1: buffer overflows
• Extremely common bug in C/C++ programs.
– First major exploit: 1988 Internet Worm. fingerd.
Source: web.nvd.nist.gov
Dan Boneh
What is needed
• Understanding C functions, the stack, and the heap.
• Know how system calls are made
• The exec() system call
• Attacker needs to know which CPU and OS used on the target machine:
– Our examples are for x86 running Linux or Windows
– Details vary slightly between CPUs and OSs:
• Little endian vs. big endian (x86 vs. Motorola)
• Stack Frame structure (Unix vs. Windows)
Dan Boneh
Linux process memory layout
0xC0000000
user stack
%esp
shared libraries
0x40000000
brk
run time heap
Loaded
from exec unused 0x08048000
0
Dan Boneh
Stack Frame
high
arguments
return address
stack frame pointer
exception handlers
char buf[128]
SP Dan Boneh
What are buffer overflows?
What if *str is 136 bytes long? void func(char *str) {
After strcpy: char buf[128];
strcpy(buf, str);
do-something(buf);
argument: str }
return address
stack frame pointer
*str Problem:
no length checking in strcpy()
char buf[128]
SP Dan Boneh
Basic stack exploit
high
Program P: exec(“/bin/sh”)
(exact shell code by Aleph One)
return address
FP1 method #1
ptr FP2 method #2
FP3
method #3
data vtable
data
buf[256] vtable
ptr
object T Dan Boneh
Finding buffer overflows
• To find overflow:
– Run web server on local machine
– Issue malformed requests (ending with “$$$$$” )
• Many automated tools exist (called fuzzers – next week)
– If web server crashes,
search core dump for “$$$$$” to find overflow location
Dan Boneh
Control Hijacking
More Control
Hijacking Attacks
Dan Boneh
More Hijacking Opportunities
• Integer overflows: (e.g. MS DirectX MIDI Lib)
• Double free: double free space on heap
– Can cause memory mgr to write data to specific location
– Examples: CVS server
• Use after free: using memory after it is freed
• Format string vulnerabilities
Dan Boneh
Integer Overflows (see Phrack 60)
Problem: what happens when int exceeds max value?
Dan Boneh
Format string bugs
Dan Boneh
Format string problem
int func(char *user) {
fprintf( stderr, user);
}
Printing:
printf, fprintf, sprintf, …
vprintf, vfprintf, vsprintf, …
Logging:
syslog, err, warn
Dan Boneh
Exploit
• Dumping arbitrary memory:
– Walk up stack until desired pointer is found.
– printf( “%08x.%08x.%08x.%08x|%s|”)
Platform Defenses
Dan Boneh
Preventing hijacking attacks
1. Fix bugs:
– Audit software
• Automated tools: Coverity, Prefast/Prefix.
– Rewrite software in a type safe languange (Java, ML)
• Difficult for existing (legacy) code …
• Limitations:
– Some apps need executable heap (e.g. JITs).
– Does not defend against `Return Oriented Programming’ exploits
Dan Boneh
Examples: DEP controls in Windows
Dan Boneh
Attack: Return Oriented Programming (ROP)
• Control hijacking without executing code
stack libc.so
args
ret-addr exec()
sfp printf()
Dan Boneh
Response: randomization
• ASLR: (Address Space Layout Randomization)
– Map shared libraries to rand location in process memory
⇒ Attacker cannot jump directly to exec function
– Deployment: (/DynamicBase)
• Windows 7: 8 bits of randomness for DLLs
– aligned to 64K page in a 16MB region ⇒ 256 choices
• Windows 8: 24 bits of randomness on 64-bit processors
• Other randomization methods:
– Sys-call randomization: randomize sys-call id’s
– Instruction Set Randomization (ISR) Dan Boneh
ASLR Example
Booting twice loads libraries into different locations:
heap
execute enabled execute enabled
vtable
Dan Boneh
Control Hijacking Defenses
Hardening the
executable
Dan Boneh
Run time checking: StackGuard
• Many run-time checking techniques …
– we only discuss methods relevant to overflow protection
• Solution 1: StackGuard
– Run time tests for stack integrity.
– Embed “canaries” in stack frames and verify their integrity
prior to function return.
Frame 2 Frame 1
top
local canary sfp ret str local canary sfp ret str of
stack
Dan Boneh
Canary Types
• Random canary:
– Random string chosen at program startup.
– Insert canary string into every stack frame.
– Verify canary before returning from function.
• Exit program if canary changed. Turns potential exploit into DoS.
– To corrupt, attacker must learn current random string.
String args
Growth ret addr Protects pointer args and local
SFP pointers from a buffer overflow
CANARY
Stack local string buffers
Growth local non-buffer variables pointers, but no arrays
copy of pointer args Dan Boneh
MS Visual Studio /GS [since 2003]
Compiler /GS option:
– Combination of ProPolice and Random canary.
– If cookie mismatch, default behavior is to call _exit(3)
Function prolog: Function epilog:
sub esp, 8 // allocate 8 bytes for cookie mov ecx, DWORD PTR [esp+8]
mov eax, DWORD PTR ___security_cookie xor ecx, esp
xor eax, esp // xor cookie with current esp call @__security_check_cookie@4
mov DWORD PTR [esp+8], eax // save in stack add esp, 8
ptr to high
next handler buf next
next handler next handler mem
attack code
Dan Boneh
Defenses: SAFESEH and SEHOP
• /SAFESEH: linker flag
– Linker produces a binary with a table of safe exception handlers
– System will not jump to exception handler not on list
Dan Boneh
Summary: Canaries are not full proof
• Canaries are an important defense tool, but do not prevent all
control hijacking attacks:
– Heap-based attacks still possible
– Integer overflow attacks still possible
– /GS by itself does not prevent Exception Handling attacks
(also need SAFESEH and SEHOP)
Dan Boneh
What if can’t recompile: Libsafe
• Solution 2: Libsafe (Avaya Labs)
– Dynamically loaded library (no need to recompile app.)
– Intercepts calls to strcpy (dest, src)
• Validates sufficient space in current stack frame:
|frame-pointer – dest| > strlen(src)
• If so, does strcpy. Otherwise, terminates application
top
sfp ret-addr dest src buf sfp ret-addr of
stack
Dan Boneh
More methods …
Ø StackShield
§ At function prologue, copy return address RET and SFP to
“safe” location (beginning of data segment)
§ Upon return, check that RET and SFP is equal to copy.
§ Implemented as assembler file processor (GCC)
ensures target is
the entry point of a
function
Dan Boneh
Control Flow Guard (CFG) (Windows 10)
Poor man’s version of CFI:
• Protects indirect calls by checking against a bitmask of all valid
function entry points in executable
• Does not prevent attacker from causing
a jump to a valid wrong function
ensures target is
the entry point of a
function
Dan Boneh
Control Hijacking
Advanced
Hijacking Attacks
Dan Boneh
Heap Spray Attacks
Dan Boneh
Heap-based control hijacking
• Compiler generated function pointers (e.g. C++ code)
FP1 method #1
ptr FP2 method #2
FP3
method #3
data vtable
Object T
data
buf[256] vtable
ptr
object T Dan Boneh
Heap-based control hijacking
• Compiler generated function pointers (e.g. C++ code)
FP1 method #1
ptr FP2 method #2
FP3
method #3
data vtable
Object T shell
code
• After overflow of buf we have:
data
buf[256] vtable
ptr
object T Dan Boneh
A reliable exploit?
<SCRIPT language="text/javascript">
shellcode = unescape("%u4343%u4343%...");
overflow-string = unescape(“%u2332%u4276%...”);
cause-overflow( overflow-string ); // overflow buf[ ]
</SCRIPT>
data
buf[256] vtable shellcode
ptr
Dan Boneh
Heap Spraying [SkyLined 2004]
Idea: 1. use Javascript to spray heap
with shellcode (and NOP slides)
2. then point vtable ptr anywhere in spray area
heap
vtable
heap
object O
Dan Boneh