References:
Identifier for all pointers:
Propagate and check the identifiers:
load, store, add immediate and add instructions. call/return instructions.Identifier = Key + Lock
stack_lock control register.
mem[stack_lock] = stack_key –> store id for the stack frame: rsp.id = (stack_key, stack_lock)stack_lock –> get a new stack_lock position –> set as id for the new stack frame: rsp.id = (current_key, stack_lock)key (64 bits) –> allocate a lock_ptr –> *lock_ptr = key –> id = (key, lock_ptr) –> q = setident(ptr, id)id = getident(p) –> use id to set invalid on the lock *(id.lock) = INVALID –> add the deallocated memory into free list: add_to_free_list(id.lock)Lock Location Cache
Identifying Pointer Load/Store Operations - conservative: Watchdog conservatively assumes that only a 64-bit load/store to an integer register may be a pointer operation.
an x86-64 simulator, statically linked 64-bit programs.
Only use-after-free checking:
With bound checking: 15% – 18%
If you could revise
the fundmental principles of
computer system design
to improve security...
... what would you change?