code pointer integrity
play

Code-Pointer Integrity Volodmyr Kuzentsov, Lszl Szekeres, Mathias - PowerPoint PPT Presentation

Code-Pointer Integrity Volodmyr Kuzentsov, Lszl Szekeres, Mathias Payer , George Candea, R. Sekar, and Dawn Song (c) TriStar Pictures, Inc. & Touchstone Pictures, 1997 Memory Corruption is Abundant! Acrobat Firefox IE OS X Linux


  1. Code-Pointer Integrity Volodmyr Kuzentsov, László Szekeres, Mathias Payer , George Candea, R. Sekar, and Dawn Song

  2. (c) TriStar Pictures, Inc. & Touchstone Pictures, 1997

  3. Memory Corruption is Abundant! Acrobat Firefox IE OS X Linux Average 150 Control-Flow Hijack CVEs 120 90 60 30 0 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013

  4. (c) TriStar Pictures, Inc. & Touchstone Pictures, 1997

  5. Memory safety: invalid dereference ● Violation iff Dangling pointer: – Pointer is read (temporal) – Pointer is written – Pointer is freed ● No violation – Otherwise Out-of-bounds pointer: (spatial)

  6. Threat Model ● Attacker can read/write data, read code ● Attacker cannot – Modify program code – Influence program loading Code Heap Stack RX RW RW

  7. Control-Flow Hijack Attack Memory 1 void *(func_ptr)(); q int *q = buf + input; 1 … buf func_ptr = &foo; … *q = input2; 2 func_ptr func_ptr … 2 (*func_ptr)(); 3 gadget

  8. What about existing defenses? Data Execution Prevention ('06) Address Space Layout Randomization ('05) Image: http://www.computing.co.uk Canaries ('06) Image: Ted Atchley, http://torwars.com Image: http://socialcanary.com

  9. (c) TriStar Pictures, Inc. & Touchstone Pictures, 1997 Presented at 30c3 http://youtu.be/CQbXevkR4us

  10. Memory Safety to the Rescue Swift Python code ~3 kloc MEMORY ! e SAFETY Python runtime ~500 kloc f FIRST a s libc ~2,500 kloc n U Linux kernel ~15,803 kloc

  11. SAFE LANGUAGES (c) TriStar Pictures, Inc. & Touchstone Pictures, 1997

  12. Retrofit Memory Safety C/C++ Overhead SoftBound+CETS 116% MEMORY SAFETY CCured 56% FIRST AddressSanitizer 73%

  13. Memory Safety 1. Assign meta-data char *buf = malloc(10); buf_lo = p; buf_up = p+10; 116% performance overhead … 2. Propagate meta-data char *q = buf + input; q_lo = buf_lo; q_up = buf_up; (Nagarakatte et al., PLDI'09 and ISMM'10) if (q < q_lo || q >= q_up) abort(); 3. Check meta-data *q = input2; … (*func_ptr)();

  14. Safety vs. Flexibility and Performance (c) TriStar Pictures, Inc. & Touchstone Pictures, 1997

  15. (c) TriStar Pictures, Inc. & Touchstone Pictures, 1997 Presented at 30c3 http://youtu.be/2ybcByjNlq8

  16. New Approach: Protect Select Data Code Heap Stack Safe Instead of Stack protecting everything a little protect a little completely Strong protection for a select subset of data Attacker may modify any unprotected data

  17. Memory Safety (116% performance overhead) Protect only ? Code Pointers Control-Flow Hijack Protection (1.9% or 8.4% performance overhead)

  18. Code-Pointer Separation: Heap Safe Memory Memory Regular Memory All other q q Code data Pointers Separate only buf buf Program memory func_ptr func_ptr func_ptr func_ptr Control plane: Memory either code Layout pointer or NULL unchanged

  19. Locals Safely Code-Pointer Separation: Stack accessed Accessed through locals pointers Safe Stack Regular Stack int foo() { char buf[16]; r int r; ret address r = scanf(“%s”, buf); buf return r; Any location } may be corrupted

  20. CPS Memory Layout Accesses are safe Accesses are fast Safe Memory Regular Memory (code pointers) (non-code-pointer data) Safe Heap Regular Heap Safe Safe Regular Regular Stack Stack ... Stack Stack ... (Thread 1) (Thread 2) (Thread 1) (Thread 2) Code (Read-Only) Hardware-based instruction-level isolation

  21. Attacking Code-Pointer Separation Memory void *(func_ptr)(); func_ptr int *q = buf + input; int *q = buf + input; *q = input2; *q = input2; … struct_ptr struct_ptr' func_ptr = struct_ptr->f; … func_ptr' (*func_ptr)(); NULL or a ptr to another function

  22. Code-Pointer Separation ● Identify Code-Pointer accesses using static type-based analysis ● Separate using instruction-level isolation (e.g., segmentation) ● CPS security guarantees – An attacker cannot forge new code pointers – Code-Pointer is either immediate or assigned from code pointer – An attacker can only replace existing functions through indirection: e.g., foo->bar->func() vs. foo->baz->func2()

  23. (c) TriStar Pictures, Inc. & Touchstone Pictures, 1997

  24. Code-Pointer Integrity (CPI) Sensitive Pointers = code pointers and pointers used to access sensitive pointers ● CPI identifies all sensitive pointers using an over-approximate type-based static analysis: is_sensitive(v) = is_sensitive_type(type of v) ● Over-approximation only affects performance On SPEC2006 <= 6.5% accesses are sensitive

  25. Attacking Code-Pointer Integrity void *(func_ptr)(); int *q = buf + input; q_lo = buf_lo; q_up = buf_up; Exception if (q < q_lo || q >= q_up) abort(); when *q = input2; dereferenced func_ptr = struct_ptr->f; … (*func_ptr)();

  26. Code-Pointer Integrity vs. Separation ● Separate sensitive pointers from regular data – Type-based static analysis – Sensitive pointers = code pointers + pointers to sensitive pointers ● Accessing sensitive pointers is safe – Separation + runtime (bounds) checks ● Accessing regular data is fast – Instruction-level safe region isolation

  27. Security Guarantees ● Code-Pointer Integrity: formally guaranteed protection – 8.4% to 10.5% overhead (~6.5% of memory accesses) ● Code-Pointer Separation: strong protection in practice – 0.5% to 1.9% overhead (~2.5% of memory accesses) ● Safe Stack: full ROP protection – Negligible overhead

  28. (c) TriStar Pictures, Inc. & Touchstone Pictures, 1997

  29. Implementation ● LLVM-based prototype – Front end (clang): collect type information – Back-end (llvm): CPI/CPS/SafeStack instrumentation pass – Runtime support: safe heap and stack management – Supported ISA's: x64 and x86 (partial) – Supported systems: Mac OSX, FreeBSD, Linux

  30. Current status ● Great support for CPI on Mac OSX and FreeBSD on x64 ● Upstreaming in progress Safe Stack coming to LLVM soon – Fork it on GitHub now: https://github.com/cpi-llvm – ● Code-review of CPS/CPI in process Play with the prototype: http://levee.epfl.ch/levee-early-preview-0.2.tgz – Will release more packages soon – ● Some changes to super complex build systems needed Adapt Makefiles for FreeBSD –

  31. Is It Practical? hardened ● Recompiled entire FreeBSD userpsace ● … and more than 100 packages OpenSSL PostgreSQL

  32. (c) TriStar Pictures, Inc. & Touchstone Pictures, 1997

  33. Conclusion ● CPI/CPS offers strong control-flow hijack protection – Key insight: memory safety for code pointers only ● Working prototype – Supports unmodified C/C++, low overhead in practice – Upstreaming patches in progress, SafeStack available soon! – Homepage: http://levee.epfl.ch – GitHub: https://github.com/cpi-llvm

  34. (c) TriStar Pictures, Inc. & Touchstone Pictures, 1997 ? http://levee.epfl.ch http://nebelwelt.net/publications/14OSDI/

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