CWE Rule 839
Description
Rule Description
The program checks a value to ensure that it is less than or equal to a maximum, but it does not also verify that the value is greater than or equal to the minimum.
Polyspace Implementation
The rule checker checks for these issues:
Pointer dereference with tainted offset
Tainted sign change conversion
Examples
Pointer dereference with tainted offset
This issue occurs when a pointer dereference uses an offset variable from an unknown or unsecure source.
This check focuses on dynamically allocated buffers. For static
buffer offsets, see Array access with tainted index
.
The index might be outside the valid array range. If the tainted index is outside the array range, it can cause:
Buffer underflow/underwrite, or writing to memory before the beginning of the buffer.
Buffer overflow, or writing to memory after the end of a buffer.
Over reading a buffer, or accessing memory after the end of the targeted buffer.
Under-reading a buffer, or accessing memory before the beginning of the targeted buffer.
An attacker can use an invalid read or write to compromise your program.
Validate the index before you use the variable to access the pointer. Check to make sure that the variable is inside the valid range and does not overflow.
By default, Polyspace® assumes that data from external sources are tainted. See Sources of Tainting in a Polyspace Analysis. To consider
any data that does not originate in the current scope of Polyspace analysis as
tainted, use the command line option -consider-analysis-perimeter-as-trust-boundary
.
#include <stdio.h> #include <stdlib.h> enum { SIZE10 = 10, SIZE100 = 100, SIZE128 = 128 }; extern void read_pint(int*); int taintedptroffset(void) { int offset; scanf("%d",&offset); int* pint = (int*)calloc(SIZE10, sizeof(int)); int c = 0; if(pint) { /* Filling array */ read_pint(pint); c = pint[offset];//Noncompliant free(pint); } return c; }
In this example, the function initializes an integer
pointer pint
. The pointer is dereferenced using the input index
offset
. The value of offset
could be outside the
pointer range, causing an out-of-range error.
One possible correction is to validate the value of offset
. Continue with
the pointer dereferencing only if offset
is inside the valid range.
#include <stdlib.h> #include <stdio.h> enum { SIZE10 = 10, SIZE100 = 100, SIZE128 = 128 }; extern void read_pint(int*); int taintedptroffset(void) { int offset; scanf("%d",&offset); int* pint = (int*)calloc(SIZE10, sizeof(int)); int c = 0; if (pint) { /* Filling array */ read_pint(pint); if (offset>0 && offset<SIZE10) { c = pint[offset]; } free(pint); } return c; }
Tainted sign change conversion
This issue occurs when values from unsecure sources are converted, implicitly or explicitly, from signed to unsigned values.
For example, functions that use size_t
as arguments implicitly convert the argument to an unsigned integer. Some functions that implicitly convert size_t
are:
bcmp memcpy memmove strncmp strncpy calloc malloc memalign
If you convert a small negative number to unsigned, the result is a large positive number. The large positive number can create security vulnerabilities. For example, if you use the unsigned value in:
Memory size routines — causes allocating memory issues.
String manipulation routines — causes buffer overflow.
Loop boundaries — causes infinite loops.
To avoid converting unsigned negative values, check that the value being converted is within an acceptable range. For example, if the value represents a size, validate that the value is not negative and less than the maximum value size.
By default, Polyspace assumes that data from external sources are tainted. See Sources of Tainting in a Polyspace Analysis. To consider
any data that does not originate in the current scope of Polyspace analysis as
tainted, use the command line option -consider-analysis-perimeter-as-trust-boundary
.
#include <stdlib.h> #include <string.h> #include <stdio.h> enum { SIZE10 = 10, SIZE100 = 100, SIZE128 = 128 }; void bug_taintedsignchange(void) { int size; scanf("%d",&size); char str[SIZE128] = ""; if (size<SIZE128) { memset(str, 'c', size); //Noncompliant } }
In this example, a char
buffer is created
and filled using memset
. The size argument to memset
is
an input argument to the function.
The call to memset
implicitly converts size
to
unsigned integer. If size
is a large negative number,
the absolute value could be too large to represent as an integer,
causing a buffer overflow.
size
One possible correction is to check if size
is
inside the valid range. This correction checks if size
is
greater than zero and less than the buffer size before calling memset
.
#include <stdlib.h> #include <string.h> #include <stdio.h> enum { SIZE10 = 10, SIZE100 = 100, SIZE128 = 128 }; void corrected_taintedsignchange(void) { int size; scanf("%d",&size); char str[SIZE128] = ""; if (size>0 && size<SIZE128) { memset(str, 'c', size); } }
Check Information
Category: Numeric Errors |
Version History
Introduced in R2023a
See Also
External Websites
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)