Description
The product reads or writes to a buffer using an index or pointer that references a memory location prior to the beginning of the buffer.
This typically occurs when a pointer or its index is decremented to a position before the buffer, when pointer arithmetic results in a position before the beginning of the valid memory location, or when a negative index is used.
Potential Impact
Confidentiality
Read Memory
Integrity, Availability
Modify Memory, DoS: Crash, Exit, or Restart
Integrity
Modify Memory, Execute Unauthorized Code or Commands
Demonstrative Examples
char* trimTrailingWhitespace(char *strMessage, int length) {
char *retMessage;char *message = malloc(sizeof(char)*(length+1));
// copy input string to a temporary string
char message[length+1];int index;for (index = 0; index < length; index++) {message[index] = strMessage[index];}message[index] = '\0';
// trim trailing whitespace
int len = index-1;while (isspace(message[len])) {message[len] = '\0';len--;}
// return string without trailing whitespace
retMessage = message;return retMessage;
}int main (int argc, char **argv) {char *items[] = {"boat", "car", "truck", "train"};int index = GetUntrustedOffset();printf("You selected %s\n", items[index-1]);}int main() {
...
char *result = strstr(destBuf, "Replace Me");
int idx = result - destBuf;
strcpy(&destBuf[idx], srcBuf);
...}Detection Methods
- Fuzzing High — Fuzz testing (fuzzing) is a powerful technique for generating large numbers of diverse inputs - either randomly or algorithmically - and dynamically invoking the code with those inputs. Even with random inputs, it is often capable of generating unexpected results such as crashes, memory corruption,
- Automated Dynamic Analysis Moderate — Use tools that are integrated during compilation to insert runtime error-checking mechanisms related to memory safety errors, such as AddressSanitizer (ASan) for C/C++ [REF-1518].
Real-World CVE Examples
| CVE ID | Description |
|---|---|
| CVE-2002-2227 | Unchecked length of SSLv2 challenge value leads to buffer underflow. |
| CVE-2007-4580 | Buffer underflow from a small size value with a large buffer (length parameter inconsistency, CWE-130) |
| CVE-2007-1584 | Buffer underflow from an all-whitespace string, which causes a counter to be decremented before the buffer while looking for a non-whitespace character. |
| CVE-2007-0886 | Buffer underflow resultant from encoded data that triggers an integer overflow. |
| CVE-2006-6171 | Product sets an incorrect buffer size limit, leading to "off-by-two" buffer underflow. |
| CVE-2006-4024 | Negative value is used in a memcpy() operation, leading to buffer underflow. |
| CVE-2004-2620 | Buffer underflow due to mishandled special characters |
Related Weaknesses
Taxonomy Mappings
- CERT C Secure Coding: ARR30-C — Do not form or use out-of-bounds pointers or array subscripts
Frequently Asked Questions
What is CWE-786?
CWE-786 (Access of Memory Location Before Start of Buffer) is a software weakness identified by MITRE's Common Weakness Enumeration. It is classified as a Base-level weakness. The product reads or writes to a buffer using an index or pointer that references a memory location prior to the beginning of the buffer.
How can CWE-786 be exploited?
Attackers can exploit CWE-786 (Access of Memory Location Before Start of Buffer) to read memory. This weakness is typically introduced during the Implementation phase of software development.
How do I prevent CWE-786?
Follow secure coding practices, conduct code reviews, and use automated security testing tools (SAST/DAST) to detect this weakness early in the development lifecycle.
What is the severity of CWE-786?
CWE-786 is classified as a Base-level weakness (Medium abstraction). It has been observed in 7 real-world CVEs.