1617
Strategy = Resource Limitation
Use resource-limiting settings provided by the operating system or environment. For example,
when managing system resources in POSIX, setrlimit() can be used to set limits for certain types
of resources, and getrlimit() can determine how many resources are available. However, these
functions are not available on all operating systems. When the current levels get close to the
maximum that is defined for the application (see CWE-770), then limit the allocation of further
resources to privileged users; alternately, begin releasing resources for less-privileged users.
While this mitigation may protect the system from attack, it will not necessarily stop attackers
from adversely impacting other users. Ensure that the application performs the appropriate error
checks and error handling in case resources become unavailable (CWE-703).
Demonstrative Examples
Example 1:
This code allocates a socket and forks each time it receives a new connection.
Example Language: C (Bad)
sock=socket(AF_INET, SOCK_STREAM, 0);
while (1) {
newsock=accept(sock, ...);
printf("A connection has been accepted\n");
pid = fork();
}
The program does not track how many connections have been made, and it does not limit the
number of connections. Because forking is a relatively expensive operation, an attacker would be
able to cause the system to run out of CPU, processes, or memory by making a large number of
connections. Alternatively, an attacker could consume all available connections, preventing others
from accessing the system remotely.
Example 2:
In the following example a server socket connection is used to accept a request to store data on
the local file system using a specified filename. The method openSocketConnection establishes
a server socket to accept requests from a client. When a client establishes a connection to this
service the getNextMessage method is first used to retrieve from the socket the name of the file
to store the data, the openFileToWrite method will validate the filename and open a file to write to
on the local file system. The getNextMessage is then used within a while loop to continuously read
data from the socket and output the data to the file until there is no longer any data from the socket.
Example Language: C (Bad)
int writeDataFromSocketToFile(char *host, int port)
{
char filename[FILENAME_SIZE];
char buffer[BUFFER_SIZE];
int socket = openSocketConnection(host, port);
if (socket < 0) {
printf("Unable to open socket connection");
return(FAIL);
}
if (getNextMessage(socket, filename, FILENAME_SIZE) > 0) {
if (openFileToWrite(filename) > 0) {
while (getNextMessage(socket, buffer, BUFFER_SIZE) > 0){
if (!(writeToFile(buffer) > 0))
break;
}
}
closeFile();
}
closeSocket(socket);
CWE Version 4.14
CWE-770: Allocation of Resources Without Limits or Throttling
CWE-770: Allocation of Resources Without Limits or Throttling