41
CTS CTSRD CRASH-worthy Trustworthy Systems Research and Development The CHERI CPU RISC in the age of risk David Chisnall University of Cambridge Approved for public release; distribution is unlimited. This research is sponsored by the Defense Advanced Research Projects Agency (DARPA) and the Air Force Research Laboratory (AFRL), under contracts FA8750-10-C-0237 and FA8750-11-C-0249. The views, opinions, and/or findings contained in this article/presentation are those of the author(s)/ presenter(s) and should not be interpreted as representing the official views or policies of the Department of Defense or the U.S. Government.

CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

CTSRDCTSRDCRASH-worthy Trustworthy

Systems Research and Development

The CHERI CPU RISC in the age of risk

David Chisnall

University of Cambridge

Approved for public release; distribution is unlimited. This research is sponsored by the Defense Advanced Research Projects Agency (DARPA) and the Air Force Research Laboratory (AFRL), under contracts FA8750-10-C-0237 and FA8750-11-C-0249. The views, opinions, and/or findings contained in this article/presentation are those of the author(s)/presenter(s) and should not be interpreted as representing the official views or policies of the Department of Defense or the U.S. Government.

Page 2: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Memory: You’re doing it wrong!

2

~82% of exploited vulnerabilities in 2012— Software Vulnerability Exploitation Trends, Microsoft

Page 3: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Low-level languages rule

3 Source: openhub.net

C: 8,323,328,367 lines of code C++: 2,966,693,989 lines of codeJava: 2,861,498,030 lines of code

Scala:13,780,744 lines of code

New

cod

e co

mm

itted

Page 4: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Security is important again

4

Multi-user systems

Disconnected single-user systems

Single-user, multi-attacker systems

Page 5: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

RISC is for compilers

• Nothing that can be done fast in software should be done in hardware.

• Everything that can only be done well in hardware should be in hardware.

5

Page 6: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

The CHERI model

• Memory protection as a first-class part of the ISA

• A single abstraction for bounds checking and sandboxing

• Mechanism in the hardware, policy in software

6

Page 7: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Pointers should be capabilities

• Smalltalk (Java, etc) pointers confer the rights to access an object.

• C pointers can (in practice) be constructed from arbitrary integers.

• Capabilities are unforgeable tokens of authority.

7

Page 8: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

CHERI capabilities

32 capability registers

8

base  [64]

length  [64]

Permissions  [32] Type  [24] Reserved  [8]

virtual  address  [64]  (exposed  as  offset)

Field Operation

Permissions Bitwise and

Base Increment (and decrease length)

Length Decrease

Offset Arbitrary manipulation

ISA Operations

Page 9: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Tags to Protect Capabilities in Memory

Capabilities on the stack and in data structures

DATA

256 bits1 bit

TAGS

9

Page 10: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Address Calculation

10

Instruction Fetch

Legacy Data Access

Capability Data Access

$PC $Rn $Cn

Physical Memory

TLB

Physical Address

Virtual Address

Offset$PCC $C0

Page 11: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Tag Table in Commodity DRAM

DATADRAM

Tag Lookup(with cache)

L2 Cache

TAGS<0.5%

Tags on physical memory Cache line is

tag(s) + data

11

128 tag bits per 4KB page

Page 12: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

• OS managed

• Enables swapping

• Centralised

• Allows revocation

Paged Memory

Address validation

12

Page 13: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Capabilities

• Compiler managed

• Precise

• Can be delegated

• Many domains

Pointer safety

13

Page 14: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

CHERICapabilities

• OS managed

• Enables swapping

• Centralised

• Allows revocation

• Compiler managed

• Precise

• Can be delegated

• Many domains

Paged Memory+

Address validation Pointer safety

14

Page 15: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Memory safety in hardware

• All memory accesses must be via a valid capability

• Instructions only allow restricting range / permissions of capabilities

• Now all we need is software…

15

Page 16: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Building on open source

• A full open source stack:

• LLVM/Clang-based compiler.

• Modified FreeBSD.

• Extended BERI processor.

• Real software from the FreeBSD ports collection.

16

Page 17: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Process start• $c0 and $pcc cover the entire address space.

• Unmodified code is completely oblivious.

• CHERI-aware code can derive restricted capabilities from either.

• Compartments can be created by discarding/subsetting $c0 in some threads.

17

Page 18: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Don’t break the world!

• Code that doesn’t contain memory safety errors should work!

• Even if it does slightly (or very) evil things with pointers!

• Ideally only code with memory safety errors should break.

18

Page 19: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

C is weird• Long standard describes allowed behaviour.

• Lots of things are implementation defined or undefined.

• All nontrivial programs depend on implementation-defined behaviour.

• Breaking this makes programmers cranky!

• We discovered most of these things when we broke them and tried to compile real programs (e.g. tcpdump)

19

Page 20: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Pointers and Integers

20

N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x

3 The following types are required:

int_fast8_tint_fast16_tint_fast32_tint_fast64_t

uint_fast8_tuint_fast16_tuint_fast32_tuint_fast64_t

All other types of this form are optional.

7.20.1.4 Integer types capable of holding object pointers1 The following type designates a signed integer type with the property that any valid

pointer to void can be converted to this type, then converted back to pointer to void,and the result will compare equal to the original pointer:

intptr_t

The following type designates an unsigned integer type with the property that any validpointer to void can be converted to this type, then converted back to pointer to void,and the result will compare equal to the original pointer:

uintptr_t

These types are optional.

7.20.1.5 Greatest-width integer types1 The following type designates a signed integer type capable of representing any value of

any signed integer type:

intmax_t

The following type designates an unsigned integer type capable of representing any valueof any unsigned integer type:

uintmax_t

These types are required.

7.20.2 Limits of specified-width integer types1 The following object-like macros specify the minimum and maximum limits of the types

declared in <stdint.h>. Each macro name corresponds to a similar type name in7.20.1.

2 Each instance of any defined macro shall be replaced by a constant expression suitablefor use in #if preprocessing directives, and this expression shall have the same type aswould an expression that is an object of the corresponding type converted according tothe integer promotions. Its implementation-defined value shall be equal to or greater inmagnitude (absolute value) than the corresponding value given below, with the same sign,except where stated to be exactly the given value.

§7.20.2 Library 291

void *a = something(); intptr_t b = (intptr_t)a; a = (void*)b;

void *a = something(); long long b = (long long)a; a = (void*)b;

Implementation defined!

Page 21: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Simple Problem: memcpy()

21

struct foo { void *a; int b; }; struct foo new = old;

memcpy(&new, &old, sizeof(struct foo);

The memcpy() function doesn’t know if it’s copying pointers or data!

Page 22: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Pointers as capabilities

22

C code used __capability qualifier to tag pointers to be represented as capabilities

// 64-bit integer (address) void *foo; // 256-bit capability __capability int *bar; // Increment offset by sizeof(int) bar++; // Load 4 bytes at offset+sizeof(int) bar[1];

Page 23: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Enabling pointer abuse

23

// The low bit of a sensibly aligned pointer is // always 0, so we can hide a flag in it __capability int *set_flag(__capability int *b) { return (__capability int*)((__intcap_t)b | 1); }

Page 24: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Enabling pointer abuse

24

# Integer constant 1 daddiu $1, $zero, 1 # Derive a canonical null capability cfromptr $c1, $c0, $zero # Set intcap_t (tag not valid) to 1 csetoffset $c1, $c1, $1 # Get the integer values of both operands cgetoffset $1, $c1 cgetoffset $2, $c3 # Perform the arithmetic or $1, $1, $2 # Set the offset in the original capability csetoffset $c3, $c3, $1

Page 25: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Legacy interoperability (is hard)

25

void *foo; __capability char *bar; // What does this do? bar = (__capability char *)foo; // Or this? foo = (void *)bar;

Page 26: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

First cut at Casts

26

# Cast from pointer ($1) to capability ($c1) CIncBase $c1, $c0, $1 # Cast from capability ($c1) to pointer ($1) CGetBase $c1, $1

• What happens if the pointer is null?

• What happens if the capability is outside the $c0 range or $c0 has a non-zero offset?

Page 27: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

NULL in C

27

§6.3.2.3.3:

An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.66) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

void *null = (void*)0; int a = 0; void *might_be_null = (void*)a;

No C programmer has ever paid attention to this!

Page 28: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Casts in CHERI

• CFromPtr gives a null capability if the integer is 0

• CToPtr gives a 0 integer if the capability is null or outside of $c0

28

# Cast from pointer ($1) to capability ($c1) CFromPtr $c1, $c0, $1 # Cast from capability ($c1) to pointer ($1) CToPtr $1, $c0, $c1

Page 29: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Where do bounds come from?

• An object in C is a single allocation.

• OpenSSL’s Heartbleed vulnerability was caused (partly) by splitting allocations.

• Some programmer policy is essential!

• Sizes of globals, stack allocations, malloc() calls are not enough (but they’re a good start!)

29

Page 30: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Safer returning

30

MIPS CHERI

Call jalr $t9, $ra cjalr $c12, $c17

Return jr $ra cjr $c17

Spill return address to stack sd $ra, 32($sp) csc $c17, $sp, 32($c11)

Behaviour if spilled value is corrupted

Jump somewhere (attacker’s choice) Trap

Capabilities are for code, not just for christmas data

Page 31: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Comparing pointers

• C says it’s undefined behaviour to compare pointers to different objects

• C programmers do it all the time

• CHERI adds pointer compare instructions

31

Page 32: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Some evil things people do to pointers

• Store them in integer variables (works if they’re [u]intcap_t)

• Do arbitrary arithmetic on them

• Let them go out of range in the middle of a calculation

• Compare pointers to different objects

32

All of these need to work!

Page 33: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

A tale of 2 3 ABIs• Incremental deployment is vital for testing

• Rewriting (or even recompiling) all code at once isn’t feasible

33

More compatible More safe

n64 Pure MIPS

Pure-capability All pointers are

capabilities

n64 + CHERI Some pointers are capabilities

Page 34: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

The pure-capability ABI

• Code where all pointers are capabilities.

• May have a null $c0.

• Can only see a subset of all memory.

• Incompatible with syscall ABI.

34

Page 35: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

CHERI-friendly libraries• Always use typedefs for pointer types.

• Don’t put struct definitions for opaque types in headers.

• Separate file-handling layers (that make syscalls) from buffer-handling layers.

• Write good code!

35

Page 36: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Memory Safety Overhead

36

Smaller is better

Bisort MSTTreeadd

Perimeter0

50

100

0

Tim

e(s

econ

ds)

MIPSCHERI

Figure 1. Olden results

Bigger is better

MIPSCHERI

0

10,000

20,000

30,000

0

Dhr

ysto

nes

(per

-sec

ond)

Figure 2. Dhrystone results

Smaller is better

MIPSCHERI

0

50

100

0

Tim

e(s

econ

ds)

Figure 3. Tcpdump results

2

Smaller is better

Bisort MSTTreeadd

Perimeter0

50

100

0

Tim

e(s

econ

ds)

MIPSCHERI

Figure 1. Olden results

Bigger is better

MIPSCHERI

0

10,000

20,000

30,000

0

Dhr

ysto

nes

(per

-sec

ond)

Figure 2. Dhrystone results

Smaller is better

MIPSCHERI

0

50

100

0

Tim

e(s

econ

ds)

Figure 3. Tcpdump results

2

Smaller is better

Bisort MSTTreeadd

Perimeter0

50

100

0

Tim

e(s

econ

ds)

MIPSCHERI

Figure 1. Olden results

Bigger is better

MIPSCHERI

0

10,000

20,000

30,000

0

Dhr

ysto

nes

(per

-sec

ond)

Figure 2. Dhrystone results

Smaller is better

MIPSCHERI

0

50

100

0

Tim

e(s

econ

ds)

Figure 3. Tcpdump results

2

Olden (pointer-chasing) benchmarks

Dhrystone (CPU-intensive) benchmark

tcpdump (real code!)

Page 37: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Building sandboxes

37

Shared Code Local Heap Shared

DataShared

Data

$pcc $c0 $c1 $c2 ...

No access to any memory without valid capabilities

Page 38: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Process-based sandboxes?

• More expensive to create (new kernel process, virtual memory map)

• More expensive to share (one TLB entry per page)

• No fine-grained sharing (page granularity)

• Better separation of kernel rights (so far!)

38

Page 39: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Library Sandboxing• Private heap per library instance (multiple isolated

copies of the same library allowed)

• Shared code between all instances

• Calls to the library delegate access to shared buffers

• Maintaining ABIs can be a bit tricky!

39

Page 40: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Lessons Learned

40

Only testing with real code can tell you how useful your ISA really is. Convincing a compiler it’s useful is a lot

harder than convincing yourself.

Software stack on GitHub now, hardware due new open-source release Real Soon Now™

Page 41: CRASH-worthy Trustworthy Systems Research and Development … · 2015. 2. 18. · CTSRD CRASH-worthy CTSRD Trustworthy Systems Research and Development The CHERI CPU RISC in the age

Further ReadingDavid Chisnall, Colin Rothwell, Brooks Davis, Robert N.M. Watson, Jonathan Woodruff, Munraj Vadera, Simon W. Moore, Peter G. Neumann and Michael Roe. Beyond the PDP-11: Processor support for a memory-safe C abstract machine. Proceedings of the Fifteenth Edition of ASPLOS on Architectural Support for Programming Languages and Operating Systems, ACM (2015).

Jonathan Woodruff, Robert N.M. Watson, David Chisnall, Simon W. Moore, Jonathan Anderson, Brooks Davis, Ben Laurie, Peter G. Neumann, Robert Norton and Michael Roe. The CHERI capability model: revisiting RISC in an age of risk. ISCA ’14: Proceeding of the 41st annual international symposium on Computer architecture, IEEE Press (2014), 457–468.

http://chericpu.org http://www.cl.cam.ac.uk/research/security/ctsrd/

Thanks to DARPA, AFRL, Google!41