Overview
If memory is allocated and not freed the process
could continue to consume more and more memory and
eventually crash.
Consequences
- Availability: If an attacker can find the memory
leak, an attacker may be able to cause the
application to leak quickly and therefore cause the
application to crash.
Exposure
period
- Requirements specification: The choice could be
made to use a language that is not susceptible to
these issues.
- Implementation: Many logic errors can lead to
this condition. It can be exacerbated by lack of or
misuse of mitigating technologies.
Platform
- Languages: C, C++, Fortran, Assembly
- Operating platforms: All, although partial
preventative measures may be deployed depending on
environment.
Required
resources
Any
Severity
Medium
Likelihood
of
exploit
Medium
Avoidance
and
mitigation
- Pre-design: Use a language or compiler that
performs automatic bounds checking.
- Design: Use an abstraction library to abstract
away risky APIs. Not a complete solution.
- Pre-design through Build: The Boehm-Demers-Weiser
Garbage Collector or valgrind can be used to detect
leaks in code. This is not a complete solution as it
is not 100% effective.
Discussion
If a memory leak exists within a program, the longer
a program runs, the more it encounters the leak scenario
and the larger its memory footprint will become. An
attacker could potentially discover that the leak
locally or remotely can cause the leak condition rapidly
so that the program crashes.
Examples
In C:
bar connection(){
foo = malloc(1024);
return foo;
}
endConnection(bar foo){
free(foo);
}
int main() {
while(1)
//thread 1
//On a connection
foo=connection();
//thread 2
//When the connection ends
endConnection(foo)
}
}
Here the problem is that every time a connection is
made, more memory is allocated. So if one just opened up
more and more connections, eventually the machine would
run out of memory.