Practical Memory Safety with REST
KANAD SINHA & SIMHA SETHUMADHAVAN COLUMBIA UNIVERSITY
Practical Memory Safety with REST KANAD SINHA & SIMHA - - PowerPoint PPT Presentation
Practical Memory Safety with REST KANAD SINHA & SIMHA SETHUMADHAVAN COLUMBIA UNIVERSITY Is memory safety relevant? In 2017, 55% of remote-code execution causing bugs in Microsoft due to memory errors Is memory safety relevant? Yes!
KANAD SINHA & SIMHA SETHUMADHAVAN COLUMBIA UNIVERSITY
In 2017, 55% of remote-code execution causing bugs in Microsoft due to memory errors
Presenting…
Random Embedded Security Tokens or REST
Core H/W primitive: Insert known 64B random value (token) in program and detect accesses to them.
Presenting…
Random Embedded Security Tokens or REST
Core H/W primitive: Insert known 64B random value (token) in program and detect accesses to them.
Other allocs buf char *buf = malloc(BUF_LEN); for (i=0; i<out_of_bounds; i++) buf = 0;
Heap
Presenting…
Random Embedded Security Tokens or REST
Core H/W primitive: Insert known 64B random value (token) in program and detect accesses to them.
char *buf = malloc(BUF_LEN); for (i=0; i<out_of_bounds; i++) buf = 0; Other allocs buf
Heap Token Token
Presenting…
Random Embedded Security Tokens or REST
Core H/W primitive: Insert known 64B random value (token) in program and detect accesses to them.
Zoey’s House Yana’s House Xander’s House
buf
char *ptrbuf = malloc(BUF_LEN); … ptrbuf[in_bounds] = X; … ptrbuf[out_of_bounds] = Y; ptrbuf
buf
char *ptrbuf = malloc(BUF_LEN); … ptrbuf[in_bounds] = X; … ptrbuf[out_of_bounds] = Y; ptrbuf
buf
char *ptrbuf = malloc(BUF_LEN); … ptrbuf[in_bounds] = X; … ptrbuf[out_of_bounds] = Y; ptrbuf
Xander’s House
Xander moves out, Will moves in Zoey’s House Yana’s House
Will’s House Xander moves out, Will moves in Zoey’s House Yana’s House
buf
char *ptrbuf = malloc(BUF_LEN); ptrbuf[in_bounds] = X; … free(ptrbuf); ptrbuf[in_bounds] = Y; ptrbuf
char *ptrbuf = malloc(BUF_LEN); ptrbuf[in_bounds] = X; … free(ptrbuf); ptrbuf[in_bounds] = Y; ptrbuf
Mainly categorizable into 2 types.
buf
ptrbuf
Mainly categorizable into 2 types.
+ Good coverage + Temporal safety (for some)
Mainly categorizable into 2 types.
+ Good coverage + Temporal safety (for some)
+ Fast
buf
ptr
Buf
Tag-based
buf
*ptrbuf
Metadata
is_valid(ptrbuf)?
Buf
Content-based blacklisting
buf
*ptrbuf is(*ptrbuf == token)?
REST primitive has trivial complexity, overhead
Token Token
Zoey’s House Yana’s House Xander’s House
Will gets new house Zoey’s House Yana’s House
program
24
Heap buf
program
sufficiently consumed
25
Heap
program
sufficiently consumed
26
Heap
Spatial Protection
program
sufficiently consumed
27
Heap
Temporal Protection
Can be enabled for legacy binaries
Previous frame
28
void foo() { char buf[64]; … return; }
buf
foo‘s frame
Previous frame
29
buf
void foo() { char rz1[64]; char buf[64]; char rz2[64]; arm(rz1); arm(rz2); … disarm(rz1); disarm(rz2); return; }
rz1 rz2
foo‘s frame
Previous frame
30
buf
void foo() { char rz1[64]; char buf[64]; char rz2[64]; arm(rz1); arm(rz2); … disarm(rz1); disarm(rz2); return; }
rz1 rz2
foo‘s frame
char rz1[64]; char buf[64]; char rz2[64];
Previous frame
31
buf
void foo() { char rz1[64]; char buf[64]; char rz2[64]; arm(rz1); arm(rz2); … disarm(rz1); disarm(rz2); return; }
rz1 rz2
foo‘s frame
arm rz1; arm rz2;
arm: Set token
Previous frame
32
buf
void foo() { char rz1[64]; char buf[64]; char rz2[64]; arm(rz1); arm(rz2); … disarm(rz1); disarm(rz2); return; }
rz1 rz2
foo‘s frame
disarm rz1; disarm rz2;
disarm: Unset token
Previous frame
33
buf
void foo() { char rz1[64]; char buf[64]; char rz2[64]; arm(rz1); arm(rz2); … disarm(rz1); disarm(rz2); return; }
rz1 rz2
foo‘s frame
Requires recompilation with REST plugin
Every store involves an extra load Complicated and expensive
L1-D
Memory Core =
Token Value
load/store X
Comparator at L1-D mem interface + 1b per L1-D line
L1-D
Memory Core load/store X Token Bits =
Token Value
L1-D
Memory Core load/store X Token Bits =
Token Value
L1-D
Memory Core =
Token Value
load/store X Token Bits
L1-D
Memory Core =
Token Value
load/store X Token Bits
Armed outgoing line filled with token value
TODO: Have to support arms and disarms
LSQ design concerns:
Add 1b tag Only update token bit Split regular match logic
Address CAM
Data
Token bit
=
Match Logic Match Address
6
Add 1b tag Only update token bit Split regular match logic
Address CAM
Data
Token bit = = Match Logic REST Violation
6
Match Address
REST primitive overhead near-zero. Software overhead mostly from allocator.
REST: Hardware/software mechanism to detect common memory safety errors
22-90% faster than comparable software solution on SPEC CPU
Questions?