Integer Overflow Vulnerability Pattern
From Guidance Share
Jump to navigationJump to search
Context
The target application is written in a language that is not type safe.
Problem
Calculations that result in values larger than the datatype can represent.
Forces
- Calculation stored in a primitive data type (such as short or integer).
- Untrusted input can impact the calculation.
- Absence of a sanity check on the result of the calculation.
- Calculation result is used for memory allocation, buffer indexing or pointer arithmetic.
Solution
The most common forms are:
- Failure to account for heterogeneous primitive data types
void RecordBytes(int maxGet) { //this counter, as a short, does not have the same range as maxGet. short counter = 0; char buf[maxGet]; while (counter < maxGet) { counter += getFromInput(buf+counter); } }
- Mistaken operator precedence
void PartialRecordBytes(int maxGet) { int counter = 0; //trying to allocate 3/4 of the size //but operator precedence makes an overflow possible int partialMaxGet = maxGet*3/4; char buf[partialMaxGet]; while (counter < partialMaxGet) { counter += getFromInput(buf+counter); } }
- Incrementing too far
int bytesRead = 0; byte b; do { b = ReadByte(); //since there may be more bytes to read than max_int //at which point bytesRead will overflow bytesRead++; } while (b != NULL);