Real-World Buffer Overflow Protection for Userspace & Kernelspace

Total Page:16

File Type:pdf, Size:1020Kb

Real-World Buffer Overflow Protection for Userspace & Kernelspace Real-World Buffer Overflow Protection for Userspace & Kernelspace Michael Dalton, Hari Kannan, Christos Kozyrakis Computer Systems Laboratory Stanford University {mwdalton, hkannan, kozyraki}@stanford.edu Abstract Despite decades of research, the available buffer over- Despite having been around for more than 25 years, flow protection mechanisms are partial at best. These buffer overflow attacks are still a major security threat for mechanisms provide protection only in limited situa- deployed software. Existing techniques for buffer over- tions [9], require source code access [51], cause false flow detection provide partial protection at best as they positives in real-world programs [28, 34], can be de- detect limited cases, suffer from many false positives, re- feated by brute force [44], or result in high runtime over- quire source code access, or introduce large performance heads [29]. Additionally, there is no practical mechanism overheads. Moreover, none of these techniques are easily to protect the OS kernel from buffer overflows or unsafe applicable to the operating system kernel. user pointer dereferences. This paper presents a practical security environment Recent research has established dynamic information for buffer overflow detection in userspace and ker- flow tracking (DIFT) as a promising platform for detect- nelspace code. Our techniques build upon dynamic in- ing a wide range of security attacks on unmodified bina- formation flow tracking (DIFT) and prevent the attacker ries. The idea behind DIFT is to tag (taint) untrusted data from overwriting pointers in the application or operat- and track its propagation through the system. DIFT as- ing system. Unlike previous work, our technique does sociates a tag with every memory location in the system. not have false positives on unmodified binaries, protects Any new data derived from untrusted data is also tagged. both data and control pointers, and allows for practi- If tainted data is used in a potentially unsafe manner, cal hardware support. Moreover, it is applicable to the such as dereferencing a tagged pointer, a security excep- kernel and provides robust detection of buffer overflows tion is raised. The generality of the DIFT model has led and user/kernel pointer dereferences. Using a full sys- to the development of several software [31, 32, 38, 51] tem prototype of a Linux workstation (hardware and soft- and hardware [5, 10, 13] implementations. ware), we demonstrate our security approach in practice Current DIFT systems use a security policy based on and discuss the major challenges for robust buffer over- bounds-check recognition (BR) in order to detect buffer flow protection in real-world software. overflows. Under this scheme, tainted information must receive a bounds check before it can be safely deref- 1 Introduction erenced as a pointer. While this technique has been used to defeat several exploits [5, 10, 10, 13], it suf- Buffer overflows remain one of the most critical threats fers from many false positives and false negatives. In to systems security, although they have been prevalent practice, bounds checks are ambiguously defined at best, for over 25 years. Successful exploitation of a buffer and may be completely omitted in perfectly safe situ- overflow attack often results in arbitrary code execu- ations [12, 13]. Thus, the applicability of a BR-based tion, and complete control of the vulnerable application. scheme is limited, rendering it hard to deploy. Many of the most damaging worms and viruses [8, 27] Recent work has proposed a new approach for pre- use buffer overflow attacks. Kernel buffer overflows venting buffer overflows using DIFT [19]. This novel are especially potent as they can override any protection technique prevents pointer injection (PI) by the attacker. mechanisms, such as Solaris jails or SELinux access con- Most buffer overflow attacks are exploited by corrupt- trols. Remotely exploitable buffer overflows have been ing and overwriting legitimate application pointers. This found in modern operating systems including Linux [23], technique prevents such pointer corruption and does not Windows XP and Vista [48], and OpenBSD [33]. rely on recognizing bounds checks, avoiding the false positives associated with BR-based analyses. However, 2.1 Existing Buffer Overflow Solutions this work has never been applied to a large application, or the operating system kernel. Moreover, this technique Many solutions have been proposed to prevent pointer or requires hardware that is extremely complex and imprac- code corruption by untrusted data. Unfortunately, the so- tical to build. lutions deployed in existing systems have drawbacks that This paper presents a practical approach for prevent- prevent them from providing comprehensive protection ing buffer overflows in userspace and kernelspace using against buffer overflows. a pointer injection-based DIFT analysis. Our approach Canary-based buffer overflow protection uses a ran- identifies and tracks all legitimate pointers in the appli- dom, word-sized canary value to detect overwrites of cation. Untrusted input must be combined with a legiti- protected data. Canaries are placed before the begin- mate pointer before being dereferenced. Failure to do so ning of protected data and the value of the canary is ver- will result in a security exception. ified each time protected data is used. A standard buffer The specific contributions of this work are: overflow attack will change the canary value before over- writing protected data, and thus canary checks provide • We present the first DIFT policy for buffer overflow buffer overflow detection. Software implementations of prevention that runs on stripped, unmodified bina- canaries typically require source code access and have ries, protects both code and data pointers, and runs been used to protect stack linking information [16] and on real-world applications such as GCC and Apache heap chunk metadata [39]. Related hardware canary im- without false positives. plementations [21, 46] have been proposed to protect the stack return address and work with unmodified binaries. • We demonstrate that the same policy is applicable to However, buffer overflows may be exploited with- the Linux kernel. It is the first security policy to dy- out overwriting canary values in many situations. For namically protect the kernel code from buffer over- example, in a system with stack canaries, buffer over- flows and user-kernel pointer dereferences without flows may overwrite local variables, even function point- introducing false positives. ers, because the stack canary only protects stack link- ing information. Similarly, heap overflows can overwrite • We use a full-system DIFT prototype based on the neighboring variables in the same heap chunk without SPARC V8 processor to demonstrate the integra- overwriting canaries. Additionally, this technique may tion of hardware and software techniques for robust change data structure layout by inserting canary words, protection against buffer overflows. Our results are breaking compatibility with legacy applications. Canary- evaluated on a Gentoo Linux platform. We show based approaches also do not protect other memory re- that hardware support requirements are reasonable gions such as the global data segment, BSS or custom and that the performance overhead is minimal. heap allocation arenas. Non-executable data protection prevents stack or • We discuss practical shortcomings of our approach, heap data from being executed as code. Modern hard- and discuss how flaws can be mitigated using addi- ware platforms, including the x86, support this technique tional security policies based on DIFT. by enforcing executable permissions on a per-page basis. The remainder of the paper is organized as follows. However, this approach breaks backwards compatibility Section 2 reviews related work. Section 3 summarizes with legacy applications that generate code at runtime the Raksha architecture and our full-system prototype. on the heap or stack. More importantly, this approach Section 4 presents our policy for buffer overflow protec- only prevents buffer overflow exploits that rely on code tion for userspace applications, while Section 5 extends injection. Rather than injecting new code, attackers can the protection to the operating system kernel. Section 6 take control of an application by using existing code in discusses weaknesses in our approach, and how they can the application or libraries. This form of attack, known be mitigated with other buffer overflow prevention poli- as a return-into-libc exploit, can perform arbitrary com- cies. Finally, Section 7 concludes the paper. putations and in practice is just as powerful as a code injection attack [43]. Address space layout randomization (ASLR) is a 2 Related Work buffer overflow defense that randomizes the memory lo- cations of system components [34]. In a system with Buffer overflow prevention is an active area of research ASLR, the base address of each memory region (stack, with decades of history. This section summarizes the executable, libraries, heap) is randomized at startup. A state of the art in buffer overflow prevention and the standard buffer overflow attack will not work reliably, shortcomings of currently available approaches. as the security-critical information is not easy to locate in memory. ASLR has been adopted on both Linux whether tagged input can ever be validated by applica- and Windows platforms. However, ASLR is not back- tion code. wards compatible with legacy code, as it requires pro- Most DIFT
Recommended publications
  • Protecting the Stack with Metadata Policies and Tagged Hardware
    2018 IEEE Symposium on Security and Privacy Protecting the Stack with Metadata Policies and Tagged Hardware Nick Roessler Andre´ DeHon University of Pennsylvania University of Pennsylvania [email protected] [email protected] Abstract—The program call stack is a major source of ex- stack data, or hijack the exposed function call mechanism in ploitable security vulnerabilities in low-level, unsafe languages a host of other malicious ways. like C. In conventional runtime implementations, the underlying Consequently, protecting the stack abstraction is critical stack data is exposed and unprotected, allowing programming errors to turn into security violations. In this work, we design for application security. Currently deployed defenses such as W X and stack canaries [2] make attacks more difficult to novel metadata-tag based, stack-protection security policies for ⊕ a general-purpose tagged architecture. Our policies specifically conduct, but do not protect against more sophisticated attack exploit the natural locality of dynamic program call graphs to techniques. Full memory safety can be retrofitted onto existing achieve cacheability of the metadata rules that they require. C/C++ code through added software checks, but at a high cost Our simple Return Address Protection policy has a performance overhead of 1.2% but just protects return addresses. The two of 100% or more in runtime overhead [3]. These expensive richer policies we present, Static Authorities and Depth Isola- solutions are unused in practice due to their unacceptably high tion, provide object-level protection for all stack objects. When overheads [4]. enforcing memory safety, our Static Authorities policy has a There is a long history of accelerating security policies with performance overhead of 5.7% and our Depth Isolation policy hardware to bring their overheads to more bearable levels has a performance overhead of 4.5%.
    [Show full text]
  • In-Fat Pointer: Hardware-Assisted Tagged-Pointer Spatial Memory Safety Defense with Subobject Granularity Protection
    In-Fat Pointer: Hardware-Assisted Tagged-Pointer Spatial Memory Safety Defense with Subobject Granularity Protection Shengjie Xu Wei Huang David Lie [email protected] [email protected] [email protected] University of Toronto University of Toronto University of Toronto Canada Canada Canada ABSTRACT 1 INTRODUCTION Programming languages like C and C++ are not memory-safe be- Memory corruption vulnerabilities in programs written in non- cause they provide programmers with low-level pointer manipu- memory-safe programming languages like C and C++ have been lation primitives. The incorrect use of these primitives can result a research focus for more than a decade [40]. When a pointer is in bugs and security vulnerabilities: for example, spatial memory dereferenced, errors, causing memory-safety violations, can result safety errors can be caused by dereferencing pointers outside the in the unintended disclosure or corruption of memory. Such errors legitimate address range belonging to the corresponding object. are a powerful primitive for attackers to mount further attacks, While a range of schemes to provide protection against these vul- such as code reuse attacks [34] and data-only attacks [18]. Memory- nerabilities have been proposed, they all suffer from the lack of one safety violations usually result from spatial memory errors, where or more of low performance overhead, compatibility with legacy incorrect pointer arithmetic causes an address to point outside the code, or comprehensive protection for all objects and subobjects. intended memory range when it is dereferenced. We present In-Fat Pointer, the first hardware-assisted defense To detect all spatial memory errors, the value of the pointer that can achieve spatial memory safety at subobject granularity must be checked against pointer bounds, which are metadata that while maintaining compatibility with legacy code and low over- describes the memory range over which the pointer may safely head.
    [Show full text]
  • Fast and Generic Metadata Management with Mid-Fat Pointers
    Fast and Generic Metadata Management with Mid-Fat Pointers ∗ ∗ Taddeus Kroes Koen Koning [email protected] [email protected] Cristiano Giuffrida Herbert Bos Erik van der Kouwe [email protected] [email protected] [email protected] Vrije Universiteit Amsterdam ABSTRACT there is an increasing need for generic and composable de- Object metadata management schemes are a fundamental fense frameworks, which can combine multiple defenses but building block in many modern defenses and significantly disable others to tune the performance-security trade-off affect the overall run-time overhead of a software harden- according to the deployment requirements [23]. Second, we ing solution. To support fast metadata lookup, many meta- need fast pointer-to-object metadata lookup schemes to em- data management schemes embed metadata tags directly in- power such frameworks [12]. A promising strategy to design side pointers. However, existing schemes using such tagged such schemes efficiently is to embed tags inside pointers. pointers either provide poor compatibility or restrict the Two tagged pointer schemes dominate the literature. Fat generality of the solution. pointers change the size and representation of pointers to In this paper, we propose mid-fat pointers to implement support arbitrary metadata tags [4, 14, 19]. This solution fast and generic metadata management while retaining most can support generic defenses with no restrictions, but it is of the compatibility benefits of existing schemes. The key plagued by compatibility problems since pointers radically idea is to use spare bits in a regular 64-bit pointer to encode change their format [6,7]. Low-fat pointers carefully place arbitrary metadata and piggyback on software fault isola- objects in the memory address space to implement the other tion (SFI) already employed by many modern defenses to extreme: no changes in pointer size and representation, and efficiently decode regular pointers at memory access time.
    [Show full text]
  • Maxsim: a Simulation Platform for Managed Applications
    R MaxSim: A Simulation Platform for Managed Applications Open-source: https://github.com/beehive-lab/MaxSim Andrey Rodchenko, Christos Kotselidis, Andy Nisbet, Antoniu Pop, Mikel Lujan Advanced Processor Technologies Group, School Of Computer Science, The University of Manchester Overview R ● What simulation platform for managed applications is needed and why? ● VM Selection Justification: Maxine VM ● Simulator Selection Justification: ZSim ● MaxSim: Overview and Features ● Use Cases: Characterization, Profiling, and HW/SW Co-design ● Conclusion 1 What simulation platform for managed R applications is needed and why? TIOBE Programming Community Index (March 2017) 1. Java 2. C 3. C++ 4. C# 5. Python 6. Visual Basic .NET 7. PHP 8. JavaScript 9. Delphi/Object Pascal 10. Swift Source: www.tiobe.com 25 20 ) % ( s 15 g n i t a 10 R 5 0 2002 2004 2006 2008 2010 2012 2014 2016 2 What simulation platform for managed R applications is needed and why? Specific Characteristics of Managed Applications // Example of a class. Memory class Foo { Stack Heap public long bar; 0x00 } obj:0xd0 // Source code example. 0x40 0xd0 CIP:0x80 { // Allocation site. ... Code Cache 0xd8 <reserved> Object obj = new Foo(); 0x78 0xe0 bar:0x00 ... // GC can happen. ... // Type introspection. 0x80 if (obj instanceof Foo) { Class - reference ... ... } Information - primitive } 0xb8 ● ● Distributed in the verifiable JIT compilation and bytecode format interpretation ● ● Automatic memory Object orientation and management associated metadata 3 What simulation platform for managed
    [Show full text]
  • Inline and Sideline Approaches for Low-Cost Memory Safety in C
    UCAM-CL-TR-954 Technical Report ISSN 1476-2986 Number 954 Computer Laboratory Inline and sideline approaches for low-cost memory safety in C Myoung Jin Nam February 2021 15 JJ Thomson Avenue Cambridge CB3 0FD United Kingdom phone +44 1223 763500 https://www.cl.cam.ac.uk/ c 2021 Myoung Jin Nam This technical report is based on a dissertation submitted November 2020 by the author for the degree of Doctor of Philosophy to the University of Cambridge, Selwyn College. Technical reports published by the University of Cambridge Computer Laboratory are freely available via the Internet: https://www.cl.cam.ac.uk/techreports/ ISSN 1476-2986 Inline and Sideline Approaches for Low-cost Memory Safety in C Myoung Jin Nam System languages such as C or C++ are widely used for their high performance, however the allowance of arbitrary pointer arithmetic and typecast introduces a risk of memory corruptions. These memory errors cause unexpected termination of pro- grams, or even worse, attackers can exploit them to alter the behavior of programs or leak crucial data. Despite advances in memory safety solutions, high and unpredictable overhead remains a major challenge. Accepting that it is extremely difficult to achieve com- plete memory safety with the performance level suitable for production deployment, researchers attempt to strike a balance between performance, detection coverage, in- teroperability, precision, and detection timing. Some properties are much more desir- able, e.g. the interoperability with pre-compiled libraries. Comparatively less critical properties are sacrificed for performance, for example, tolerating longer detection de- lay or narrowing down detection coverage by performing approximate or probabilistic checking or detecting only certain errors.
    [Show full text]
  • Linux Core-Api Documentation
    Linux Core-api Documentation The kernel development community Jul 14, 2020 CONTENTS i ii Linux Core-api Documentation This is the beginning of a manual for core kernel APIs. The conversion (and writ- ing!) of documents for this manual is much appreciated! CONTENTS 1 Linux Core-api Documentation 2 CONTENTS CHAPTER ONE CORE UTILITIES This section has general and “core core”documentation. The first is a massive grab-bag of kerneldoc info left over from the docbook days; it should really be broken up someday when somebody finds the energy to do it. 1.1 The Linux Kernel API 1.1.1 List Management Functions void INIT_LIST_HEAD(struct list_head * list) Initialize a list_head structure Parameters struct list_head * list list_head structure to be initialized. Description Initializes the list_head to point to itself. If it is a list header, the result is an empty list. void list_add(struct list_head * new, struct list_head * head) add a new entry Parameters struct list_head * new new entry to be added struct list_head * head list head to add it after Description Insert a new entry after the specified head. This is good for implementing stacks. void list_add_tail(struct list_head * new, struct list_head * head) add a new entry Parameters struct list_head * new new entry to be added struct list_head * head list head to add it before Description 3 Linux Core-api Documentation Insert a new entry before the specified head. This is useful for implementing queues. void list_del(struct list_head * entry) deletes entry from list. Parameters struct list_head * entry the element to delete from the list. Note list_empty() on entry does not return true after this, the entry is in an undefined state.
    [Show full text]
  • Baggy Bounds Checking: an Efficient and Backwards-Compatible Defense Against Out-Of-Bounds Errors
    Baggy Bounds Checking: An Efficient and Backwards-Compatible Defense against Out-of-Bounds Errors � � Periklis Akritidis, Manuel Costa,† Miguel Castro,† Steven Hand � Computer Laboratory †Microsoft Research University of Cambridge, UK Cambridge, UK {pa280,smh22}@cl.cam.ac.uk {manuelc,mcastro}@microsoft.com Abstract Attacks that exploit out-of-bounds errors in C and C++ programs are still prevalent despite many years of re- search on bounds checking. Previous backwards compat- ible bounds checking techniques, which can be applied to unmodified C and C++ programs, maintain a data struc- ture with the bounds for each allocated object and per- form lookups in this data structure to check if pointers remain within bounds. This data structure can grow large and the lookups are expensive. In this paper we present a backwards compatible bounds Figure 1: Allocated memory is often padded to a partic- checking technique that substantially reduces perfor- ular alignment boundary, and hence can be larger than mance overhead. The key insight is to constrain the sizes the requested object size. By checking allocation bounds rather than object bounds, we allow benign accesses to the of allocated memory regions and their alignment to en- padding, but can significantly reduce the cost of bounds able efficient bounds lookups and hence efficient bounds lookups at runtime. checks at runtime. Our technique has low overhead in practice—only 8% throughput decrease for Apache— and is more than two times faster than the fastest pre- cause looking up bounds is expensive and the data struc- vious technique and about five times faster—using less ture can grow large.
    [Show full text]
  • Architecture-Independent Dynamic Information Flow Tracking
    ARCHITECTURE-INDEPENDENT DYNAMIC INFORMATION FLOW TRACKING A Thesis Presented by Ryan Whelan to The Department of Electrical and Computer Engineering in partial fulfillment of the requirements for the degree of Master of Science in Electrical and Computer Engineering Northeastern University Boston, Massachusetts November 2012 c Copyright 2012 by Ryan Whelan All Rights Reserved ii Abstract Dynamic information flow tracking is a well-known dynamic software analysis tech- nique with a wide variety of applications that range from making systems more secure, to helping developers and analysts better understand the code that systems are ex- ecuting. Traditionally, the fine-grained analysis capabilities that are desired for the class of these systems which operate at the binary level require that these analyses are tightly coupled to a specific ISA. This fact places a heavy burden on developers of these systems since significant domain knowledge is required to support each ISA, and our ability to amortize the effort expended on one ISA implementation cannot be leveraged to support the next ISA. Further, the correctness of the system must carefully evaluated for each new ISA. In this thesis, we present a general approach to information flow tracking that allows us to support multiple ISAs without mastering the intricate details of each ISA we support, and without extensive verification. Our approach leverages bi- nary translation to an intermediate representation where we have developed detailed, architecture-neutral information flow models. To support advanced instructions that are typically implemented in C code in binary translators, we also present a combined static/dynamic analysis that allows us to accurately and automatically support these instructions.
    [Show full text]
  • Cornucopia: Temporal Safety for CHERI Heaps
    Cornucopia: Temporal Safety for CHERI Heaps Nathaniel Wesley Filardo,∗ Brett F. Gutstein,∗ Jonathan Woodruff,∗ Sam Ainsworth,∗ Lucian Paul-Trifu,∗ Brooks Davis,y Hongyan Xia,∗ Edward Tomasz Napierala,∗ Alexander Richardson,∗ John Baldwin,z David Chisnall,x Jessica Clarke,∗ Khilan Gudka,∗ Alexandre Joannou,∗ A. Theodore Markettos,∗ Alfredo Mazzinghi,∗ Robert M. Norton,∗ Michael Roe,∗ Peter Sewell,∗ Stacey Son,∗ Timothy M. Jones,∗ Simon W. Moore,∗ Peter G. Neumann,y Robert N. M. Watson∗ ∗University of Cambridge, Cambridge, UK; ySRI International, Menlo Park, CA, USA; xMicrosoft Research, Cambridge, UK; zArarat River Consulting, Walnut Creek, CA, USA Abstract—Use-after-free violations of temporal memory safety While use-after-free heap vulnerabilities are ultimately due continue to plague software systems, underpinning many high- to application misuse of the malloc() and free() interface, impact exploits. The CHERI capability system shows great complete sanitization of the vast legacy C code base, or even promise in achieving C and C++ language spatial memory safety, preventing out-of-bounds accesses. Enforcing language-level tem- of highly maintained security-critical programs, has proved poral safety on CHERI requires capability revocation, traditionally infeasible. Instead, we turn our attention to the allocator achieved either via table lookups (avoided for performance in itself, and seek to robustly mitigate temporal-safety bugs. the CHERI design) or by identifying capabilities in memory to Many attempts have been made to mitigate temporal-safety revoke them (similar to a garbage-collector sweep). CHERIvoke, vulnerabilities in existing architectures (discussed in §IX), and a prior feasibility study, suggested that CHERI’s tagged capa- bilities could make this latter strategy viable, but modeled only they have demonstrated that temporal safety is not possible for architectural limits and did not consider the full implementation today’s computers without overheads above 5%, a threshold that or evaluation of the approach.
    [Show full text]
  • MESH: a Memory-Efficient Safe Heap for C/C++
    MESH: A Memory-Efficient Safe Heap for C/C++ Emanuel Q. Vintila Philipp Zieris Julian Horsch [email protected] [email protected] [email protected] Fraunhofer AISEC Fraunhofer AISEC Fraunhofer AISEC Garching, near Munich, Germany Garching, near Munich, Germany Garching, near Munich, Germany ABSTRACT 1 INTRODUCTION While memory corruption bugs stemming from the use of unsafe The C and C++ programming languages are preferred for system programming languages are an old and well-researched problem, programming because they are efficient and offer low-level control. the resulting vulnerabilities still dominate real-world exploitation These advantages come at the cost of memory safety, requiring the today. Various mitigations have been proposed to alleviate the programmer to manually manage heap memory and ensure the problem, mainly in the form of language dialects, static program legality of memory accesses. Incorrect handling by the programmer analysis, and code or binary instrumentation. Solutions like Adress- can lead to serious issues [43] such as buffer overflows or use-after- Sanitizer (ASan) and Softbound/CETS have proven that the latter free bugs, which can be exploited by attackers to hijack the control- approach is very promising, being able to achieve memory safety flow (causing the program to inadvertently change its course of without requiring manual source code adaptions, albeit suffering execution) [6, 11, 35, 39] or to leak information [18, 40]. Even though substantial performance and memory overheads. While perfor- memory vulnerabilities are long-known issues, they are still very mance overhead can be seen as a flexible constraint, extensive common in mainstream programs: Out of all the vulnerabilities memory overheads can be prohibitive for the use of such solutions reported in the Common Vulnerabilities and Exposures (CVE) data- in memory-constrained environments.
    [Show full text]
  • Analysis of Defenses Against Code Reuse Attacks on Modern and New
    Analysis of Defenses Against Code Reuse Attacks on Modern and New Architectures by Isaac Noah Evans Submitted to the Department of Electrical Engineering and Computer Science in partial fulfillment of the requirements for the degree of Master of Engineering in Electrical Engineering and Computer Science at the MASSACHUSETTS INSTITUTE OF TECHNOLOGY September 2015 ○c Massachusetts Institute of Technology 2015. All rights reserved. The author hereby grants to MIT permission to reproduce and to distribute publicly paper and electronic copies of this thesis document in whole or in part in any medium now known or hereafter created. Author................................................................ Department of Electrical Engineering and Computer Science September 2015 Certified by. Dr. Hamed Okhravi Technical Staff, MIT Lincoln Laboratory Thesis Supervisor Certified by. Dr. Howard Shrobe Principal Research Scientist and Director of Security, CSAIL Thesis Supervisor Accepted by . Dr. Christopher J. Terman Chairman, Masters of Engineering Thesis Committee 2 Analysis of Defenses Against Code Reuse Attacks on Modern and New Architectures by Isaac Noah Evans Submitted to the Department of Electrical Engineering and Computer Science on September 2015, in partial fulfillment of the requirements for the degree of Master of Engineering in Electrical Engineering and Computer Science Abstract Today, the most common avenue for exploitation of computer systems is a control-flow attack in which the attacker gains direct or indirect control of the instruction pointer. In order to gain remote code execution, attackers then exploit legitimate fragments of code in the executable via techniques such as return-oriented-programming or virtual table overwrites. This project aims to answer fundamental questions about the efficacy of control- flow-integrity (CFI), a defensive technique which attempts to prevent such attacks by ensuring that every control flow transfer corresponds to the original intent ofthe program author.
    [Show full text]
  • The SPARC Architecture Manual Version 8
    The SPARC Architecture Manual Version 8 Revision SAV080SI9308 SPARC International Inc. · 535 Middle®eld Road, Suite 210 · Menlo Park, CA 94025 · 415-321-8692 SPARC International, Inc. SPARC is a registered trademark of SPARC International, Inc. The SPARC logo is a registered trademark of SPARC International, Inc. UNIX and OPEN LOOK are registered trademarks of UNIX System Labora- tories, Inc. Copyright 1991,1992 SPARC International, Inc. − Printed in U.S.A. All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, electronic, mechanical, photocopying, recording or otherwise, without the prior permission of the copyright owners. Restricted rights legend: use, duplication, or disclosure by the U.S. government is subject to restrictions set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 52.227-7013 and in similar clauses in the FAR and NASA FAR Supplement. The SPARC Architecture Manual Version 8 Revision SAV080SI9308 1 Introduction This document speci®es Version 8 of the Scalable Processor ARChitecture, or SPARC. 1.1. SPARC Attributes SPARC is a CPU instruction set architecture (ISA), derived from a reduced instruction set computer (RISC) lineage. As an architecture, SPARC allows for a spectrum of chip and system implementations at a variety of price/performance points for a range of applications, including scienti®c/engineering, programming, real-time, and commercial. Design Goals SPARC was designed as a target for optimizing compilers and easily pipelined hardware implementations. SPARC implementations provide exceptionally high execution rates and short time-to-market development schedules.
    [Show full text]