|
Memory Management in C
Vulnerabilities, Attacks, and Mitigations |
|
Prof. David Bernstein
|
| Computer Science Department |
| bernstdh@jmu.edu |
free() does not necessarily initialize memory
(for performance reasons)malloc() does not necessarily initialize memory
(for performance reasons)memset() to clear memory,
but optimizing compilers may remove this call if the memory
isn't accessed following the write
free())memset_s() (C11)malloc() to use randomization
* (i.e., the unary derefernce
operator) to an invalid address is undefined (i.e.,
it typically results in a segmentation fault but not always)
NULL might not crash the program but, instead,
give an attacker the ability to write a value into an
arbitrary location in memorymalloc() returns
NULL but the program doesn't check and crashes)
when the pointer is dereferenced
free() is passed a void*
not a void** it can't reset the pointer
it is passed
free() is called multiple times
for the same block of memory (i.e., being passed the same
pointer)create() and destroy()
functionsNULL to pointers after calling free (and
remember that there can be multiple pointers to the
same memory)phkmalloc (which can determine whether a
pointer passed to free() or realloc()
is valid without dereferencing it)