Memory Exploits & Defenses Presenter: Kevin Snow What is the - - PowerPoint PPT Presentation

memory exploits defenses
SMART_READER_LITE
LIVE PREVIEW

Memory Exploits & Defenses Presenter: Kevin Snow What is the - - PowerPoint PPT Presentation

Memory Exploits & Defenses Presenter: Kevin Snow What is the threat? How do we defend ourselves? What is the threat? Stack Smashing Return-to-libc Format String Error Heap Overflow Generic Stack Frame Caller Callee Stack


slide-1
SLIDE 1

Memory Exploits & Defenses

Presenter: Kevin Snow

slide-2
SLIDE 2

What is the threat? How do we defend ourselves?

slide-3
SLIDE 3

What is the threat?

 Stack Smashing  Return-to-libc  Format String Error  Heap Overflow

slide-4
SLIDE 4

Generic Stack Frame

Caller Callee

slide-5
SLIDE 5

Stack Smashing

Goal: Point return address to our buffer, which contains executable code

slide-6
SLIDE 6

Stack Smashing

void f(char *p){ char x[128]; strcpy(x, p); }

Our Stack Generic Stack

slide-7
SLIDE 7

return-to-libc

Goal: Point return address to an existing library function

slide-8
SLIDE 8

return-to-libc

f(){ g(&foo); } g(char *x){ char y [SZ]; scanf(y); }

Linked libraries often have useful strings lying around

slide-9
SLIDE 9

Format String Errors

 Goal: Take advantage of printf() family of

functions

Good: printf(“%d”, num); Bad: printf(“%d”); Good: printf(“%s”, myString); Bad: printf(myString);

slide-10
SLIDE 10

Format String Errors

Goal: Craft a special string that can write arbitrary values to arbitrary addresses

slide-11
SLIDE 11

Format String Errors

f(){ int x; int y; char s[128]; scanf(s); printf(s); }

slide-12
SLIDE 12

Heap Overflow

Goal: Overwrite function pointers on heap to point to injected code

slide-13
SLIDE 13

Heap Overflow

 C++ objects are allocated on the heap  Addresses of these object’s functions

stored on the heap (vfptr’s)

 Overflow heap variable and overwrite

these vfptr’s

 When function is invoked, our code is

executed instead

slide-14
SLIDE 14

How do we defend ourselves?

 Canary  Library Wrapper  Shadow Stack  W⊕X Pages

slide-15
SLIDE 15

Canary

  • Place “Canary” before return address
  • terminator (0x00, 0x0a, 0x0d)
  • random
  • Check validity of Canary before

returning

slide-16
SLIDE 16

Canary (2)

 This is a great solution, right?  Wrong! What about format string attacks?

slide-17
SLIDE 17

Library Wrappers (libsafe)

 Replace know vulnerable function calls

with ‘safe’ versions

 ‘Safe’ versions ensure nothing is written

past the current stack frame

slide-18
SLIDE 18

Library Wrappers (libsafe)

 If we can not get past the stack frame,

we can’t exploit anything?

 Many problems:

  • User written input loops not protected
  • We can still corrupt local variables
  • We can still do a heap overflow
slide-19
SLIDE 19

Shadow Stacks

  • Keeps extra copy of return address in

separate memory space

  • Only allows a return if address

matches up

slide-20
SLIDE 20

Shadow Stacks (2)

 So, this is the foolproof solution?

  • Limitations: Does not protect other data
  • Local variables
  • Heap overflow overwrites function pointers
slide-21
SLIDE 21

W⊕X Pages

  • Idea: if memory is writable, it should

not be executable

  • Does not allow stack to be executed
  • Try to thwart Stack-smashing
slide-22
SLIDE 22

W⊕X Pages

 Game over, we can not execute injected

code

 Wait! We can return-to-libc instead

slide-23
SLIDE 23

Defense Conclusions

 No defense protects against all memory

exploits

 We need a defense-in-breadth approach

slide-24
SLIDE 24

Two Countermeasures

 Instruction Set Randomization  Address Space Randomization

slide-25
SLIDE 25

Countering Code-Injection Attacks With Instruction-Set Randomization

Gaurav S. Kc et. Al. 10th ACM International Conference on Computer and Communications Security (CCS)

Intrusion detection: Randomized instruction set emulation to disrupt binary code injection attacks

Elena Gabriela Barrantes et. Al. 10th ACM International Conference on Computer and Communications Security (CCS)

slide-26
SLIDE 26

Instruction Set Randomization

 Observation: attackers need to know the

instruction set

 Idea: Obfuscate the instruction set

slide-27
SLIDE 27

How do we obfuscate?

 Encode the machine code of an

executable

 Decode instructions before sending to

processor

slide-28
SLIDE 28

Encoding Process

  • XOR a key with

instructions

  • Worst case for attacker:

2^32 guesses

32-bit Key 32-bit Key 32-bit Key Code

⊕ ⊕ ⊕

Barrantes et. al. Proposed a one time pad to the code

slide-29
SLIDE 29

Decoding Process

 Decoding is performed when instructions are fetched

from memory

Encoding Key Encoded Instruction Stream Processor

XOR

slide-30
SLIDE 30

Practical Considerations

 Shared libraries  Kc et al. implemented in hardware

(ideally)

 Barrantes et al. implemented in emulator  Performance may suffer

slide-31
SLIDE 31

ISR Thwarts an Attack

X86 Apache Web Server ISR Protected 0-day exploit shellcode[] = "\x31\xdb" // xorl "\x8d\x43\x17"// leal "\xcd\x80" // int ... //... Encoded: "\x31\xdb" // xorl "\x8d\x43\x17"// leal "\xcd\x80" // int ... //... Decoded: “\x23\x54” //invalid “\xa3\x2f\x9e” //invalid “\x65\xc1 //invalid Attacker Crash!

slide-32
SLIDE 32

ISR Conclusions

 The good: completely eliminates executing

injected code, seemingly

 The bad: do not always have to inject code

slide-33
SLIDE 33

Wheres the FEEB? On the Effectiveness of Instruction Set Randomization

  • N. Sovarel, D. Evans, and N. Paul

USENIX Security, 2005

slide-34
SLIDE 34

On the Effectiveness of ISR

 ISR designed to prevent successful code

injection

 But, Sovarel et al. demonstrate attacks

that CAN inject code successfully

slide-35
SLIDE 35

Assumptions

 Address of vulnerable buffer is known  Same randomization key used for each

forked process

 Encoding vulnerable to known ciphertext-

plaintext attack

  • XOR encoding satisfies this assumption

 X86 instruction set is used

slide-36
SLIDE 36

Attack Methodology Goal: Distinguish between correct and incorrect guesses

slide-37
SLIDE 37

Attack Methodology

X86 Apache Web Server ISR Protected Encoded Guess: \x01 //ret? Decoded: “\x23\x54” //invalid Attacker \x02 //ret? \x03 //ret? \x04 //ret? \x05 //ret? \xc5 //invalid (crash) \xef //invalid (crash) \x7a //invalid (crash) \xc3 //valid (observable behavior)

slide-38
SLIDE 38

ISR Attacks

 Return attack  Jump attack  Extended attack

slide-39
SLIDE 39

Return Attack

 Inject a 1-byte near return instruction  Incorrect guess causes a crash  Correct guess causes observable behaviour

  • For example, some output will be returned
slide-40
SLIDE 40

Return Attack (2)

Top of stack … … Return address … Bottom of stack Local Buffer Top of stack … … Address of buffer Original return address Bottom of stack Local Buffer Near return (0xc3) Normal Stack Layout Stack Layout After Attack

slide-41
SLIDE 41

Several Hurdles to Jump

 The stack has been corrupted  What about false positives?

slide-42
SLIDE 42

False Positives

 Apparent correct behavior in several

circumstances:

  • It was actually correct (1/256)
  • Another opcode produced the same behavior;

'near return and pop' instruction (1/256)

  • It decoded to a harmless opcode (NOP, etc),

and some other instruction produced the same behavior

slide-43
SLIDE 43

Reducing False Positives (2)

… … Address of buffer … Near return (0xc3) (1) Apparently correct

Use a harmless instruction to eliminate false positives

(Previously guessed) … … Address of buffer … Harmless instr. (0x90) (2) Double check Near return (0xc3)

slide-44
SLIDE 44

Reducing False Positives (3)

 Near return / near return and pop very similar

… 0x00 Address of buffer … Guessed ret instr. (1) Apparently Correct 0x00 … 0xFF Address of buffer … Guessed ret instr. (2) Double Check 0xFF

slide-45
SLIDE 45

Return Attack Conclusions

 Strength: only need to guess a 1-byte

instruction at a time

 Weakness: stack corruption makes it

difficult to use reliably

slide-46
SLIDE 46

Jump Attack

slide-47
SLIDE 47

Jump Attack

 Inject a 2-byte short jump instruction  Correct guess causes an infinite loop  Incorrect guess causes crash

slide-48
SLIDE 48

Jump Attack (2)

Top of stack … … Return address … Bottom of stack Local Buffer Top of stack … … Address of buffer … Bottom of stack Local Buffer Offset (0xfe) Short jump (0xeb) Normal Stack Layout Stack Layout After Attack

slide-49
SLIDE 49

False Positives

 Again, apparent correct behavior will be exhibited in

several circumstances:

  • It was actually correct
  • An incorrectly decoded instruction produced an

infinite loop; there are 16 near conditional jumps

  • It decoded to a harmless instruction (NOP, etc), and

some other instruction produced an infinite loop

slide-50
SLIDE 50

False Positives (2)

(1) Apparently Correct

Change high bit in the 3rd byte to eliminate false positives

… 0x00 Address of buffer … Short jump Offset (0xfe) … 0xFF Address of buffer … Short jump Offset (0xfe) (2) Double Check

slide-51
SLIDE 51

Jump Attack Conclusions

 Strength:

  • Use not restricted to special circumstances

 Weaknesses:

  • 2-byte instruction must be guessed
  • Infinite loops created
slide-52
SLIDE 52

Extended Attack

slide-53
SLIDE 53

Extended Attack

 Near jmp jumps to original return address

0xcd …

  • ffset
  • ffset
  • ffset

Address of buffer 0xcd

  • ffset

Near jump (0xe9) Stack Layout After Attack … Short jump (0xeb)

  • ffset

{

Jump Attack

slide-54
SLIDE 54

Extended Attack Conclusions

 Strengths:

  • Not restricted to special circumstances
  • Only creates a few infinite loops

 Weaknesses:

  • Initially 2-byte instructions must be guessed
slide-55
SLIDE 55

MicroVM

 Consider an ISR aware worm  Proposed ‘MicroVM’ is only 100 bytes

long

  • Use to execute small chunks of the worm at

a time

slide-56
SLIDE 56

Results

  • Is 6 minutes and 8,636 attempts reasonable?

2919.4 95 8.36 25.0 102389 4096 947.3 100 7.90 29.3 30035 1024 627.4 95 8.31 36.9 18904 512 365.6 100 9.15 86.4 8636 100 283.6 98 8.28 226.3 7240 32 207.9 99 8.11 1052.1 4208 4 138.3 98 3.86 1991.6 3983 2 Time (s) Success Rate (%) Infinite Loops Attempts per byte Attempts Key Bytes

slide-57
SLIDE 57

Practical Considerations

 The attacks make many assumptions

  • Address of buffer is known
  • Key is not re-randomized
  • Encoding vulnerable to known plaintext-

ciphertext attack

 Attacks are x86 instruction set dependent

slide-58
SLIDE 58

Wheres the FEEB? Conclusions

 ISR can easily fix the assumptions

  • In fact, Sovarel et. al. had to change the RISE

implementation to conform

 Take this paper as a lesson in safe

implementation

”if you’re going to implement ISR, make sure every process gets a fresh key!” “When I have tried to exploit buffer overflows, a noop sled has always been needed”

slide-59
SLIDE 59

ISR Conclusions

 The good – Effectively eliminates code

injection, if implemented correctly

 The bad – Implemented in hardware or

an emulator

 The ugly – Still, does nothing to protect

against return-to-libc

slide-60
SLIDE 60

We still need a more general approach!

slide-61
SLIDE 61

Address Space Randomization

slide-62
SLIDE 62

Address Space Randomization Observation: Attacker needs to know

certain addresses in memory

Idea: Obfuscate memory addresses

slide-63
SLIDE 63

PaX ASLR

 PageEXec Address Space Layout

Randomization brought to us by the PaX Team

 Popular open-source ASR implementation

  • Hardened Debian
  • Hardened Gentoo
  • Grsecurity kernel enhancements

 Randomizes: stack, heap, libraries

slide-64
SLIDE 64

PaX - Randomization

delta_mmap

2^16 2^16 2^24

32-bit architecture process address space

Image Source: http://www.csc.ncsu.edu/faculty/junxu/software/aslp/

slide-65
SLIDE 65

On the Effectiveness of Address-Space Randomization Means: return-to-libc, lack of entropy in

PaX ASLR randomization

Goal: Guess library offset and compute

location of system()

slide-66
SLIDE 66

The Exploit Note:

  • Library offset is limited to 2

16 possibilities

  • PaX ASLR does not rerandomize on fork()
  • Relative addresses inside libraries are not

randomized

slide-67
SLIDE 67

The Exploit - Setup Apache web server on a 32-bit

architecture

PaX ASLR for randomization Separated attack machine from victim

with a 100 Mbps network

slide-68
SLIDE 68

The Exploit - Guessing Addresses Send probes using return-to-libc attack Unsuccessful guess crashes Successful guess produces observable

behavior

TIME: usleep()

slide-69
SLIDE 69

Attack Methodology

X86 Apache Web Server ASR Protected Offset? 0x00000001 Result: Crash! Attacker 0x00000002 0x00000003 0x00000004 Crash! Crash! Sleep 16 seconds

slide-70
SLIDE 70

Probing for the offset

Top of stack … … 64 byte buffer … Bottom of stack … Top of stack … AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAA … Bottom of stack Arg (0x01010101) Usleep() addr. Ret (0xDEADBEEF) Normal Stack Layout Stack Layout After Attack Arguments Return address

slide-71
SLIDE 71

Return-to-libc Attack

… … … 64 byte buffer … Bottom of stack … Ret (0xDEADBEEF) System() addr. AAAAAAAAAAAAAAAAA ‘/bin/sh’ … Bottom of stack Ret() addr. Ret() addr. Ret() addr. Normal Stack Layout Stack Layout After Attack Arguments Return address Buffer addr. Buffer addr. Top of stack Top of stack

slide-72
SLIDE 72

ASR Conclusions

 The good: attempts to hinder all types of

memory exploits (defense-in-breadth)

 The bad: low entropy leaves it vulnerable

slide-73
SLIDE 73

We can still do better!

slide-74
SLIDE 74

A better approach to ASR?

 64-bit architecture

  • Can increase randomness from 2^16 to 2^40

 Randomization Frequency  Granularity

  • Permute stack variables
  • Permute code & library functions
  • Permute static data

 Combine with other approaches

slide-75
SLIDE 75

Questions?

slide-76
SLIDE 76

Wheres the FEEB? On the Effectiveness of Instruction Set Randomization

  • N. Sovarel, D. Evans, and N. Paul

USENIX Security, 2005 References

slide-77
SLIDE 77

On the Effectiveness of Address Space Randomization

  • H. Schacham, M. Page, B. Pfaff, E.

Goh, N. Modadugu, D. Boneh ACM CCS 04 References

slide-78
SLIDE 78

Countering Code-Injection Attacks With Instruction-Set Randomization

Gaurav S. Kc et. Al. 10th ACM International Conference on Computer and Communications Security (CCS)

Intrusion detection: Randomized instruction set emulation to disrupt binary code injection attacks

Elena Gabriela Barrantes et. Al. 10th ACM International Conference on Computer and Communications Security (CCS)

References

slide-79
SLIDE 79

References

 Thanks to Lucas Ballard for lending some of his

slides for this presentation.

 Images on slide 64 are from the Address Space

Layout Permutation project by Jun Xu at North Carolina State Univ.