487
Scope Impact Likelihood
This weakness will generally lead to undefined behavior
and therefore crashes. In the case of overflows involving
loop index variables, the likelihood of infinite loops is also
high.
Integrity Modify Memory
If the value in question is important to data (as opposed
to flow), simple data corruption has occurred. Also, if the
wrap around results in other conditions such as buffer
overflows, further memory corruption may occur.
Confidentiality
Availability
Access Control
Execute Unauthorized Code or Commands
Bypass Protection Mechanism
This weakness can sometimes trigger buffer overflows
which can be used to execute arbitrary code. This is
usually outside the scope of a program's implicit security
policy.
Detection Methods
Automated Static Analysis
Automated static analysis, commonly referred to as Static Application Security Testing (SAST),
can find some instances of this weakness by analyzing source code (or binary/compiled code)
without having to execute it. Typically, this is done by building a model of data flow and control
flow, then searching for potentially-vulnerable patterns that connect "sources" (origins of input)
with "sinks" (destinations where the data interacts with external components, a lower layer such
as the OS, etc.)
Effectiveness = High
Potential Mitigations
Phase: Implementation
When copying character arrays or using character manipulation methods, the correct size
parameter must be used to account for the null terminator that needs to be added at the end
of the array. Some examples of functions susceptible to this weakness in C include strcpy(),
strncpy(), strcat(), strncat(), printf(), sprintf(), scanf() and sscanf().
Demonstrative Examples
Example 1:
The following code allocates memory for a maximum number of widgets. It then gets a userspecified
number of widgets, making sure that the user does not request too many. It then
initializes the elements of the array using InitializeWidget(). Because the number of widgets can
vary for each request, the code inserts a NULL pointer to signify the location of the last widget.
Example Language: C (Bad)
int i;
unsigned int numWidgets;
Widget **WidgetList;
numWidgets = GetUntrustedSizeValue();
if ((numWidgets == 0) || (numWidgets > MAX_NUM_WIDGETS)) {
ExitError("Incorrect number of widgets requested!");
}
WidgetList = (Widget **)malloc(numWidgets * sizeof(Widget *));
printf("WidgetList ptr=%p\n", WidgetList);
for(i=0; i<numWidgets; i++) {
WidgetList[i] = InitializeWidget();
}
WidgetList[numWidgets] = NULL;
CWE Version 4.14
CWE-193: Off-by-one Error
CWE-193: Off-by-one Error