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

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