advanced systems security control flow integrity
play

Advanced Systems Security: Control-Flow Integrity Trent Jaeger - PowerPoint PPT Presentation

Systems and Internet Infrastructure Security Network and Security Research Center Department of Computer Science and Engineering Pennsylvania State University, University Park PA Advanced Systems Security: Control-Flow Integrity Trent


  1. Systems and Internet Infrastructure Security Network and Security Research Center Department of Computer Science and Engineering Pennsylvania State University, University Park PA Advanced Systems Security: � Control-Flow Integrity Trent Jaeger Systems and Internet Infrastructure Security (SIIS) Lab Computer Science and Engineering Department Pennsylvania State University Systems and Internet Infrastructure Security (SIIS) Laboratory Page 1

  2. Vulnerability • How do you define computer ‘ vulnerability ’ ? Systems and Internet Infrastructure Security (SIIS) Laboratory Page 2

  3. Bu ff er Overflow • First and most common way to take control of a process • Attack code Call the victim with inputs necessary to overflow ‣ buffer Overwrites the return address on the stack ‣ • Exploit Jump to attacker chosen code ‣ Run that code ‣ Systems and Internet Infrastructure Security (SIIS) Laboratory Page 3

  4. Determine what to attack • Local variable that is a char buffer BEFORE picture of stack 0xbfa3b854: 0x3 0xbfa3b855: 0x0 0xbfa3b856: 0x0 Called buf ‣ 0xbfa3b857: 0x0 buf 0xbfa3b858: 0x3 0xbfa3b859: 0x0 0xbfa3b85a: 0x0 0xbfa3b85b: 0x0 0xbfa3b85c: 0x0 0xbfa3b85d: 0x0 0xbfa3b85e: 0x0 ... printf("BEFORE picture of stack\n"); 0xbfa3b85f: 0x0 for ( i=((unsigned) buf-8); i<((unsigned) ((char *)&ct)+8); i++ ) 0xbfa3b860: 0x0 printf("%p: 0x%x\n", (void *)i, *(unsigned char *) i); 0xbfa3b861: 0x0 0xbfa3b862: 0x0 /* run overflow */ 0xbfa3b863: 0x0 for ( i=1; i<tmp; i++ ){ 0xbfa3b864: 0x0 printf("i = %d; tmp= %d; ct = %d; &tmp = %p\n", i, tmp, ct, (void *)&tmp); 0xbfa3b865: 0x0 strcpy(p, inputs[i]); 0xbfa3b866: 0x0 0xbfa3b867: 0x0 /* print stack after the fact */ 0xbfa3b868: 0xa8 printf("AFTER iteration %d\n", i); 0xbfa3b869: 0xb8 ebp for ( j=((unsigned) buf-8); j<((unsigned) ((char *)&ct)+8); j++ ) 0xbfa3b86a: 0xa3 printf("%p: 0x%x\n", (void *)j, *(unsigned char *) j); 0xbfa3b86b: 0xbf p += strlen(inputs[i]); 0xbfa3b86c: 0x71 if ( i+1 != tmp ) 0xbfa3b86d: 0x84 rtn addr *p++ = ' '; 0xbfa3b86e: 0x4 } 0xbfa3b86f: 0x8 printf("buf = %s\n", buf); 0xbfa3b870: 0x3 printf("victim: %p\n", (void *)&victim); 0xbfa3b871: 0x0 ct 0xbfa3b872: 0x0 return 0; 0xbfa3b873: 0x0 } Systems and Internet Infrastructure Security (SIIS) Laboratory Page 4

  5. Configure Attack • Configure following Distance to return address from buffer ‣ Where to write? • Location of start of attacker’s code ‣ Where to take control? • What to write on stack ‣ How to invoke code (jump-to existing function)? • How to launch the attack ‣ How to send the malicious buffer to the victim? • Systems and Internet Infrastructure Security (SIIS) Laboratory Page 5

  6. Return Address BEFORE picture of stack • x86 Architecture 0xbfa3b854: 0x3 0xbfa3b855: 0x0 0xbfa3b856: 0x0 0xbfa3b857: 0x0 Build 32-bit code for Linux environment ‣ buf 0xbfa3b858: 0x3 0xbfa3b859: 0x0 0xbfa3b85a: 0x0 • Remember integers are represented in 0xbfa3b85b: 0x0 0xbfa3b85c: 0x0 0xbfa3b85d: 0x0 “ little endian ” format 0xbfa3b85e: 0x0 0xbfa3b85f: 0x0 0xbfa3b860: 0x0 0xbfa3b861: 0x0 • Take address 0x8048471 0xbfa3b862: 0x0 0xbfa3b863: 0x0 0xbfa3b864: 0x0 0xbfa3b865: 0x0 See trace at right ‣ 0xbfa3b866: 0x0 0xbfa3b867: 0x0 0xbfa3b868: 0xa8 0xbfa3b869: 0xb8 ebp 0xbfa3b86a: 0xa3 0xbfa3b86b: 0xbf 0xbfa3b86c: 0x71 0xbfa3b86d: 0x84 rtn addr 0xbfa3b86e: 0x4 0xbfa3b86f: 0x8 0xbfa3b870: 0x3 0xbfa3b871: 0x0 ct 0xbfa3b872: 0x0 0xbfa3b873: 0x0 Systems and Internet Infrastructure Security (SIIS) Laboratory Page 6

  7. Anatomy of Control Flow Attacks • Two steps • First, the attacker changes the control flow of the program In buffer overflow, overwrite the return ‣ address on the stack What are the ways that this can be done? ‣ • Second, the attacker uses this change to run code of their choice In buffer overflow, inject code on stack ‣ What are the ways that this can be done? ‣ Systems and Internet Infrastructure Security (SIIS) Laboratory Page 9

  8. Return-oriented Programming • General approach to control flow attacks • Demonstrates how general the two steps of a control flow attack can be • First, change program control flow In any way ‣ • Then, run any code of attackers’ choosing - code in the existing program From starting address (gadget) to ret ‣ Systems and Internet Infrastructure Security (SIIS) Laboratory Page 10

  9. ROP • Use ESP as program counter E.g., Store 5 at address 0x8048000 ‣ without introducing new code • Code Stack pop %eax G1 Return Address ret 5 pop %ebx jmp G2 ret buf 0x8048000 movl %eax, (%ebx) ret jump G3 . . . Memory Registers %eax = 0x8048000 = %ebx = Systems and Internet Infrastructure Security (SIIS) Laboratory Page

  10. ROP • Use ESP as program counter E.g., Store 5 at address 0x8048000 ‣ without introducing new code • Code Stack G!: pop %eax G1 Return Address ret 5 G2: pop %ebx jmp G2 ret buf 0x8048000 G3: movl %eax, (%ebx) ret jump G3 . . . Memory Registers %eax = 0x8048000 = %ebx = Systems and Internet Infrastructure Security (SIIS) Laboratory Page

  11. ROP • Use ESP as program counter E.g., Store 5 at address 0x8048000 ‣ without introducing new code • Code Stack G!: pop %eax G1 Return Address ret 5 G2: pop %ebx jmp G2 ret buf 0x8048000 G3: movl %eax, (%ebx) ret jump G3 . . . Memory Registers %eax = 0x8048000 = %ebx = Systems and Internet Infrastructure Security (SIIS) Laboratory Page

  12. ROP • Use ESP as program counter E.g., Store 5 at address 0x8048000 ‣ without introducing new code • Code Stack G!: pop %eax G1 Return Address ret 5 G2: pop %ebx jmp G2 ret buf 0x8048000 G3: movl %eax, (%ebx) ret jump G3 . . . Memory Registers %eax = 5 0x8048000 = %ebx = Systems and Internet Infrastructure Security (SIIS) Laboratory Page

  13. ROP • Use ESP as program counter E.g., Store 5 at address 0x8048000 ‣ without introducing new code • Code Stack G!: pop %eax G1 Return Address ret 5 G2: pop %ebx jmp G2 ret buf 0x8048000 G3: movl %eax, (%ebx) ret jump G3 . . . Memory Registers %eax = 5 0x8048000 = %ebx = Systems and Internet Infrastructure Security (SIIS) Laboratory Page

  14. ROP • Use ESP as program counter E.g., Store 5 at address 0x8048000 ‣ without introducing new code • Code Stack G!: pop %eax G1 Return Address ret 5 G2: pop %ebx jmp G2 ret buf 0x8048000 G3: movl %eax, (%ebx) ret jump G3 . . . Memory Registers %eax = 5 0x8048000 = %ebx = 0x8048000 Systems and Internet Infrastructure Security (SIIS) Laboratory Page

  15. ROP • Use ESP as program counter E.g., Store 5 at address 0x8048000 ‣ without introducing new code • Code Stack G!: pop %eax G1 Return Address ret 5 G2: pop %ebx jmp G2 ret buf 0x8048000 G3: movl %eax, (%ebx) ret jump G3 . . . Memory Registers %eax = 5 0x8048000 = %ebx = 0x8048000 Systems and Internet Infrastructure Security (SIIS) Laboratory Page

  16. ROP • Use ESP as program counter E.g., Store 5 at address 0x8048000 ‣ without introducing new code • Code Stack G!: pop %eax G1 Return Address ret 5 G2: pop %ebx jmp G2 ret buf 0x8048000 G3: movl %eax, (%ebx) ret jump G3 . . . Memory Registers %eax = 5 0x8048000 = 5 %ebx = 0x8048000 Systems and Internet Infrastructure Security (SIIS) Laboratory Page

  17. Prevent ROP Attacks • How would you prevent a program from executing gadgets rather than the expected code? Systems and Internet Infrastructure Security (SIIS) Laboratory Page 19

  18. Prevent ROP Attacks • How would you prevent a program from executing gadgets rather than the expected code? Control-flow integrity ‣ Force the program to execute according to an expected CFG • Systems and Internet Infrastructure Security (SIIS) Laboratory Page 20

  19. Control-Flow Integrity Our Mechanism F A F B nop IMM 1 if(*fp != nop IMM 1 ) halt if(**esp != nop IMM 2 ) halt call fp return nop IMM 2 CFG excerpt B 1 A call NB: Need to ensure bit patterns for nops B ret A call+1 appear nowhere else in code memory Systems and Internet Infrastructure Security (SIIS) Laboratory Page 21

  20. Control-Flow Integrity More Complex CFGs CFG excerpt Maybe statically all we know is that F A can call any int int function B 1 A call F A C 1 succ(A call ) = {B 1 , C 1 } F B nop IMM 1 if(*fp != nop IMM 1 ) halt call fp F C nop IMM 1 Construction: All targets of a computed jump must have the same destination id (IMM) in their nop instruction 9 Systems and Internet Infrastructure Security (SIIS) Laboratory Page 22

  21. Control-Flow Integrity Imprecise Return Information Q: What if F B can return CFG excerpt to many functions ? F A A call+1 A: Imprecise CFG B ret D call+1 call F B F B succ(B ret ) = {A call+1 , D call+1 } nop IMM 2 CFG Integrity: F D if(**esp != nop IMM 2 ) halt Changes to the return PC are only to valid successor call F B PCs, per succ(). nop IMM 2 10 Systems and Internet Infrastructure Security (SIIS) Laboratory Page 23

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend