The program does not release or incorrectly releases a resource before it is made available for re-use.
Extended Description
When a resource is created or allocated, the developer is responsible for properly releasing the resource as well as accounting for all potential paths of expiration or invalidation, such as a set period of time or revocation.
Time of Introduction
Architecture and Design
Implementation
Applicable Platforms
Languages
All
Common Consequences
Scope
Effect
Availability
Other
Technical Impact: DoS: resource consumption
(other); Varies by context
Most unreleased resource issues result in general software reliability
problems, but if an attacker can intentionally trigger a resource leak,
the attacker might be able to launch a denial of service attack by
depleting the resource pool.
Confidentiality
Technical Impact: Read application
data
When a resource containing sensitive information is not correctly
shutdown, it may expose the sensitive data in a subsequent
allocation.
Likelihood of Exploit
Low to Medium
Detection Methods
Automated Dynamic Analysis
This weakness can be detected using dynamic tools and techniques that
interact with the software using large test suites with many diverse
inputs, such as fuzz testing (fuzzing), robustness testing, and fault
injection. The software's operation may slow down, but it should not
become unstable, crash, or generate incorrect results.
Resource clean up errors might be detected with a stress-test by
calling the software simultaneously from a large number of threads or
processes, and look for evidence of any unexpected behavior. The
software's operation may slow down, but it should not become unstable,
crash, or generate incorrect results.
Effectiveness: Moderate
Manual Dynamic Analysis
Identify error conditions that are not likely to occur during normal
usage and trigger them. For example, run the program under low memory
conditions, run with insufficient privileges or permissions, interrupt a
transaction before it is completed, or disable connectivity to basic
network services such as DNS. Monitor the software for any unexpected
behavior. If you trigger an unhandled exception or similar error that
was discovered and handled by the application's environment, it may
still indicate unexpected conditions that were not handled by the
application itself.
Demonstrative Examples
Example 1
The following method never closes the file handle it opens. The
Finalize() method for StreamReader eventually calls Close(), but there is no
guarantee as to how long it will take before the Finalize() method is
invoked. In fact, there is no guarantee that Finalize() will ever be
invoked. In a busy environment, this can result in the VM using up all of
its available file handles.
(Bad Code)
Example
Language: Java
private void processFile(string fName) {
StreamWriter sw = new
StreamWriter(fName);
string line;
while ((line = sr.ReadLine()) != null)
processLine(line);
}
Example 2
If an exception occurs after establishing the database connection
and before the same connection closes, the pool of database connections may
become exhausted. If the number of available connections is exceeded, other
users cannot access this resource, effectively denying access to the
application. Using the following database connection pattern will ensure
that all opened connections are closed. The con.close() call should be the
first executable statement in the finally block.
(Bad Code)
Example
Language: Java
try {
Connection con =
DriverManager.getConnection(some_connection_string)
}
catch ( Exception e ) {
log( e )
}
finally {
con.close()
}
Example 3
Under normal conditions the following C# code executes a database
query, processes the results returned by the database, and closes the
allocated SqlConnection object. But if an exception occurs while executing
the SQL or processing the results, the SqlConnection object is not closed.
If this happens often enough, the database will run out of available cursors
and not be able to execute any more SQL queries.
(Bad Code)
Example
Language: C#
...
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(queryString);
cmd.Connection = conn;
conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
HarvestResults(rdr);
conn.Connection.Close();
...
Example 4
The following C function does not close the file handle it opens if
an error occurs. If the process is long-lived, the process can run out of
file handles.
(Bad Code)
Example
Language: C
int decodeFile(char* fName) {
char buf[BUF_SZ];
FILE* f = fopen(fName, "r");
if (!f) {
printf("cannot open %s\n", fName);
return DECODE_FAIL;
}
else {
while (fgets(buf, BUF_SZ, f)) {
if (!checkChecksum(buf)) {
return DECODE_FAIL;
}
else {
decodeBlock(buf);
}
}
}
fclose(f);
return DECODE_SUCCESS;
}
Example 5
In this example, the program does not use matching functions such as
malloc/free, new/delete, and new[]/delete[] to allocate/deallocate the
resource.
(Bad Code)
Example
Language: C++
class A {
void foo();
};
void A::foo(){
int *ptr;
ptr = (int*)malloc(sizeof(int));
delete ptr;
}
Example 6
In this example, the program calls the delete[] function on non-heap
memory.
Return values of file/socket operations not
checked, allowing resultant consumption of file
descriptors.
Potential Mitigations
Phase: Requirements
Strategy: Language Selection
Use a language that does not allow this weakness to occur or provides
constructs that make this weakness easier to avoid.
For example, languages such as Java, Ruby, and Lisp perform automatic
garbage collection that releases memory for objects that have been
deallocated.
Phase: Implementation
It is good practice to be responsible for freeing all resources you
allocate and to be consistent with how and where you free memory in a
function. If you allocate memory that you intend to free upon completion
of the function, you must be sure to free the memory at all exit points
for that function including error conditions.
Phase: Implementation
Memory should be allocated/freed using matching functions such as
malloc/free, new/delete, and new[]/delete[].
Phase: Implementation
When releasing a complex object or structure, ensure that you properly
dispose of all of its member components, not just the object
itself.
Weakness Ordinalities
Ordinality
Description
Primary
Improper release or shutdown of resources can be primary to resource
exhaustion, performance, and information confidentiality problems to
name a few.
Resultant
Improper release or shutdown of resources can be resultant from
improper error handling or insufficient resource tracking.