shuffler fast and deployable continuous code re
play

Shuffler: Fast and Deployable Continuous Code Re-Randomization - PowerPoint PPT Presentation

Shuffler: Fast and Deployable Continuous Code Re-Randomization David Williams-King, Graham Gobieski, Kent Williams-King, James P. Blake, Xinhao Yuan, Patrick Colp, Michelle Zheng, Vasileios P. Kemerlis, Junfeng Yang, William Aiello OSDI 2016


  1. Shuffler: Fast and Deployable Continuous Code Re-Randomization David Williams-King, Graham Gobieski, Kent Williams-King, James P. Blake, Xinhao Yuan, Patrick Colp, Michelle Zheng, Vasileios P. Kemerlis, Junfeng Yang, William Aiello OSDI 2016 1

  2. Software Remains Vulnerable ● High-profile server breaches are commonplace 2

  3. Software Remains Vulnerable ● High-profile server breaches are commonplace ● 90% of today’s attacks utilize ROP [1] 3

  4. Return-Oriented Programming ● Reuse fragments of legitimate code (gadgets) Program code Stack func_1 func_1 func_2 func_2 ret addr func_3 func_3 4

  5. Return-Oriented Programming ● Reuse fragments of legitimate code (gadgets) Program code Stack ret addr 5

  6. Return-Oriented Programming ● Reuse fragments of legitimate code (gadgets) Program code Stack ret addr data ret addr ret addr ret addr Buffer Overrun 6

  7. Return-Oriented Programming ● Reuse fragments of legitimate code (gadgets) Program code Stack ret addr ROP gadget chain data ret addr ret addr ret addr Buffer Overrun 7

  8. Modern ROP Attacks ● JIT-ROP [2]: iteratively read code at runtime 8

  9. Modern ROP Attacks ● JIT-ROP [2]: iteratively read code at runtime Attacker Target program func_1 func_1 func_2 func_2 func_3 func_3 9

  10. Modern ROP Attacks ● JIT-ROP [2]: iteratively read code at runtime Attacker Target program func_1 func_2 func_3 10

  11. Modern ROP Attacks ● JIT-ROP [2]: iteratively read code at runtime Attacker Target program func_1 func_2 ROP gadget chain func_3 11 Inject exploit

  12. Modern ROP Attacks ● JIT-ROP [2]: iteratively read code at runtime Attacker Target program func_1 func_2 ROP gadget chain func_3 12 Inject exploit

  13. The Shuffler Idea ● What if we re-randomize code more rapidly than an attacker discovers gadgets? func_1 func_1 func_2 func_2 func_3 func_3 13

  14. The Shuffler Idea ● What if we re-randomize code more rapidly than an attacker discovers gadgets? func_1 func_2 func_3 14

  15. The Shuffler Idea ● What if we re-randomize code more rapidly than an attacker discovers gadgets? func_1 func_2 func_2 func_3 func_3 func_1 15

  16. The Shuffler Idea ● What if we re-randomize code more rapidly than an attacker discovers gadgets? ?? func_2 ROP gadget chain func_3 func_1 16 Inject exploit

  17. The Shuffler Idea ● What if we re-randomize code more rapidly than an attacker discovers gadgets? ROP gadget chain 17 Inject exploit

  18. How Is This Possible? ● Re-randomize code before an attacker uses it 18

  19. How Is This Possible? ● Re-randomize code before an attacker uses it – faster than disclosure vulnerability execution time; – faster than gadget chain computation time; – or, faster than network communication time 19

  20. How Is This Possible? ● Re-randomize code before an attacker uses it – faster than disclosure vulnerability execution time; – faster than gadget chain computation time; – or, faster than network communication time 20

  21. How Is This Possible? ● Re-randomize code before an attacker uses it – faster than disclosure vulnerability execution time; – faster than gadget chain computation time; – or, faster than network communication time ● one memory disclosure can only travel 820 miles! 21

  22. What Is Shuffler? ● Defense based on continuous re-randomization – Defeats all known code reuse attacks – 20-50 millisecond shuffling, scales to 24 threads ● Fast: bounds attacker’s available time – Defeats even attackers with zero network latency ● Deployable: – Binary analysis w/o modifying kernel, compiler, ... ● Egalitarian: – Shuffler runs in same address space, defends itself 22

  23. Outline 23

  24. Outline 1. Continuous re-randomization 2. Accelerating our randomization 3. Binary analysis and egalitarianism 4. Results and Demo 24

  25. Continuous Re-Randomization ● Easy to copy code & fix direct references func_1 func_2 ... call func_2 ... func_2 25

  26. Continuous Re-Randomization ● Easy to copy code & fix direct references func_1 (deleted) ... call func_2 ... func_2 26

  27. Continuous Re-Randomization ● Easy to copy code & fix direct references ● What about code pointers? 27

  28. Continuous Re-Randomization ● Easy to copy code & fix direct references ● What about code pointers? ptr: func_1 func_2 ... mov $func_2, ptr ... call *ptr ... 28

  29. Continuous Re-Randomization ● Easy to copy code & fix direct references ● What about code pointers? ptr: &func_2 func_1 func_2 ... mov $func_2, ptr ... call *ptr ... 29

  30. Continuous Re-Randomization ● Easy to copy code & fix direct references ● What about code pointers? ptr: &func_2 func_1 func_2 (deleted) func_2 ... mov $func_2, ptr ... call *ptr ... 30

  31. Continuous Re-Randomization ● Easy to copy code & fix direct references ● What about code pointers? ptr: &func_2 func_1 (deleted) func_2 ... mov $func_2, ptr ... call *ptr ... 31

  32. Continuous Re-Randomization ● Easy to copy code & fix direct references ● What about code pointers? &func_2 &func_2 &func_2 &func_2 ptr: &func_2 &func_2 &func_2 func_2 (deleted) &func_2 ● How to update all propagated pointers? func_2 32

  33. Continuous Re-Randomization ● Solution: add extra level of indirection f_2_idx f_2_idx f_2_idx f_2_idx ptr: f_2_idx %gs: (table) ... ... &func_2 ... func_2 33

  34. Continuous Re-Randomization ● Solution: add extra level of indirection f_2_idx f_2_idx f_2_idx f_2_idx ptr: f_2_idx f_2_idx f_2_idx %gs: (table) f_2_idx ... ... &func_2 ... func_2 34

  35. Continuous Re-Randomization ● Solution: add extra level of indirection f_2_idx f_2_idx f_2_idx f_2_idx ptr: f_2_idx f_2_idx f_2_idx %gs: (table) f_2_idx ... ... func_2 &func_2 ... func_2 35

  36. Continuous Re-Randomization ● Solution: add extra level of indirection f_2_idx f_2_idx f_2_idx f_2_idx ptr: f_2_idx f_2_idx f_2_idx %gs: (table) f_2_idx ... ... func_2 &func_2 ... (deleted) 36

  37. Code Pointer Abstraction ● Transforming *code_ptr into **code_ptr – Correctness : pointer updates sound & precise – Disclosure-resilience : code ptr table is hidden 37

  38. Code Pointer Abstraction ● Transforming *code_ptr into **code_ptr – Correctness : pointer updates sound & precise – Disclosure-resilience : code ptr table is hidden ptr: f_2_idx func_2 %gs: ... func_2 ... 38

  39. Code Pointer Abstraction ● Transforming *code_ptr into **code_ptr – Correctness : pointer updates sound & precise – Disclosure-resilience : code ptr table is hidden ptr: f_2_idx func_2 %gs: ... func_2 ... Rewrite call sites Rewrite initialization points callq *%rax mov $0x40054d, %rax => callq * %gs:( %rax ) => mov $ 0x20 , %rax 39

  40. Outline 1. Continuous re-randomization 2. Accelerating our randomization 3. Binary analysis and egalitarianism 4. Results and Demo 40

  41. Return Address Encryption ● Return addresses are code pointers too ● Could use code pointer table, but inefficient – call/ret instructions highly optimized 41

  42. Return Address Encryption ● Return addresses are code pointers too ● Could use code pointer table, but inefficient – call/ret instructions highly optimized ● Alternative mechanism – correct and hidden – Use normal call instructions – Encrypt return addresses with XOR key 42

  43. Return Address Encryption ● Prevent return address disclosure 43

  44. Return Address Encryption ● Prevent return address disclosure Thread Stack func_1 ret addr func_2 ret addr ret addr func_3 44

  45. Return Address Encryption ● Prevent return address disclosure Thread Stack func_1 + (encrypted) func_2 + (encrypted) + (encrypted) func_3 XOR key 45

  46. Return Address Encryption ● Prevent return address disclosure Thread Stack func_1 func: + (encrypted) func_2 + (encrypted) ; original code + (encrypted) ret func_3 XOR key 46

  47. Return Address Encryption ● Prevent return address disclosure ● We use binary rewriting (expand basic blocks) Thread Stack func_1 func: mov %fs:0x28,%r11 + (encrypted) xor %r11,(%rsp) func_2 + (encrypted) ; original code mov %fs:0x28,%r11 xor %r11,(%rsp) + (encrypted) ret func_3 XOR key 47

  48. Return Address Migration ● Unwind stack and re-encrypt new addresses func_1 func_2 Thread Stack func_3 + (encrypted) + (encrypted) + (encrypted) XOR key 48

  49. Return Address Migration ● Unwind stack and re-encrypt new addresses func_1 func_2 Thread Stack func_3 + (encrypted) + (encrypted) func_1 + (encrypted) func_2 func_3 XOR key 49

  50. Return Address Migration ● Unwind stack and re-encrypt new addresses (deleted) (deleted) Thread Stack (deleted) + (encrypted) + (encrypted) func_1 + (encrypted) func_2 func_3 XOR key 50

  51. Asynchronous Randomization 51

  52. Asynchronous Randomization ● Creating new code copies takes time 20ms shuffle period Computations 52

Recommend


More recommend