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?