Linux Core-Api Documentation

Total Page:16

File Type:pdf, Size:1020Kb

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. void list_replace(struct list_head * old, struct list_head * new) replace old entry by new one Parameters struct list_head * old the element to be replaced struct list_head * new the new element to insert Description If old was empty, it will be overwritten. void list_replace_init(struct list_head * old, struct list_head * new) replace old entry by new one and initialize the old one Parameters struct list_head * old the element to be replaced struct list_head * new the new element to insert Description If old was empty, it will be overwritten. void list_swap(struct list_head * entry1, struct list_head * entry2) replace entry1 with entry2 and re-add entry1 at entry2’s position Parameters struct list_head * entry1 the location to place entry2 struct list_head * entry2 the location to place entry1 void list_del_init(struct list_head * entry) deletes entry from list and reinitialize it. Parameters struct list_head * entry the element to delete from the list. void list_move(struct list_head * list, struct list_head * head) delete from one list and add as another’s head Parameters struct list_head * list the entry to move struct list_head * head the head that will precede our entry 4 Chapter 1. Core utilities Linux Core-api Documentation void list_move_tail(struct list_head * list, struct list_head * head) delete from one list and add as another’s tail Parameters struct list_head * list the entry to move struct list_head * head the head that will follow our entry void list_bulk_move_tail(struct list_head * head, struct list_head * first, struct list_head * last) move a subsection of a list to its tail Parameters struct list_head * head the head that will follow our entry struct list_head * first first entry to move struct list_head * last last entry to move, can be the same as first Description Move all entries between first and including last before head. All three entries must belong to the same linked list. int list_is_first(const struct list_head * list, const struct list_head * head) • tests whether list is the first entry in list head Parameters const struct list_head * list the entry to test const struct list_head * head the head of the list int list_is_last(const struct list_head * list, const struct list_head * head) tests whether list is the last entry in list head Parameters const struct list_head * list the entry to test const struct list_head * head the head of the list int list_empty(const struct list_head * head) tests whether a list is empty Parameters const struct list_head * head the list to test. int list_empty_careful(const struct list_head * head) tests whether a list is empty and not being modified Parameters const struct list_head * head the list to test Description tests whether a list is empty _and_ checks that no other CPU might be in the pro- cess of modifying either member (next or prev) NOTE 1.1. The Linux Kernel API 5 Linux Core-api Documentation using list_empty_careful() without synchronization can only be safe if the only activity that can happen to the list entry is list_del_init(). Eg. it cannot be used if another CPU could re-list_add() it. void list_rotate_left(struct list_head * head) rotate the list to the left Parameters struct list_head * head the head of the list void list_rotate_to_front(struct list_head * list, struct list_head * head) Rotate list to specific item. Parameters struct list_head * list The desired new front of the list. struct list_head * head The head of the list. Description Rotates list so that list becomes the new front of the list. int list_is_singular(const struct list_head * head) tests whether a list has just one entry. Parameters const struct list_head * head the list to test. void list_cut_position(struct list_head * list, struct list_head * head, struct list_head * entry) cut a list into two Parameters struct list_head * list a new list to add all removed entries struct list_head * head a list with entries struct list_head * entry an entry within head, could be the head itself and if so we won’t cut the list Description This helper moves the initial part of head, up to and including entry, from head to list. You should pass on entry an element you know is on head. list should be an empty list or a list you do not care about losing its data. void list_cut_before(struct list_head * list, struct list_head * head, struct list_head * entry) cut a list into two, before given entry Parameters struct list_head * list a new list to add all removed entries struct list_head * head a list with entries struct list_head * entry an entry within head, could be the head itself Description 6 Chapter 1. Core utilities Linux Core-api Documentation This helper moves the initial part of head, up to but excluding entry, from head to list. You should pass in entry an element you know is on head. list should be an empty list or a list you do not care about losing its data. If entry == head, all entries on head are moved to list. void list_splice(const struct list_head * list, struct list_head * head) join two lists, this is designed for stacks Parameters const struct list_head * list the new list to add. struct list_head * head the place to add it in the first list. void list_splice_tail(struct list_head * list, struct list_head * head) join two lists, each list being a queue Parameters struct list_head * list the new list to add. struct list_head * head the place to add it in the first list. void list_splice_init(struct list_head * list, struct list_head * head) join two lists and reinitialise the emptied list. Parameters struct list_head * list the new list to add. struct list_head * head the place to add it in the first list. Description The list at list is reinitialised void list_splice_tail_init(struct list_head * list, struct list_head * head) join two lists and reinitialise the emptied list Parameters struct list_head * list the new list to add. struct list_head * head the place to add it in the first list. Description Each of the lists is a queue. The list at list is reinitialised list_entry(ptr, type, member) get the struct for this entry Parameters ptr the struct list_head pointer. type the type of the struct this is embedded in. member the name of the list_head within the struct. list_first_entry(ptr, type, member) get the first element from a list Parameters 1.1. The Linux Kernel API 7 Linux Core-api Documentation ptr the list head to take the element from. type the type of the struct this is embedded in. member the name of the list_head within the struct. Description Note, that list is expected to be not empty. list_last_entry(ptr, type, member) get the last element from a list Parameters ptr the list head to take the element from. type the type of the struct this is embedded in. member the name of the list_head within the struct. Description Note, that list is expected to be not empty. list_first_entry_or_null(ptr, type, member) get the first element from a list Parameters ptr the list head to take the element from. type the type of the struct this is embedded in. member the name of the list_head within the struct. Description Note that if the list is empty, it returns NULL. list_next_entry(pos, member) get the next element in list Parameters pos the type * to cursor member the name of the list_head within the struct. list_prev_entry(pos, member) get the prev element in list Parameters pos the type * to cursor member the name of the list_head within the struct. list_for_each(pos, head) iterate over a list Parameters pos the struct list_head to use as a loop cursor. head the head for your list. 8 Chapter 1. Core utilities Linux Core-api Documentation list_for_each_continue(pos, head) continue iteration over a list Parameters pos the struct list_head to use as a loop cursor. head the head for your list. Description Continue to iterate over a list, continuing after the current position. list_for_each_prev(pos, head) iterate over a list backwards Parameters pos the struct list_head to use as a loop cursor. head the head for your list. list_for_each_safe(pos, n, head) iterate over a list safe against removal of list entry Parameters pos the struct list_head to use as a loop cursor.
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]
  • 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]
  • 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.
    [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]