Description
The product reads or writes to a buffer using an index or pointer that references a memory location after the end of the buffer.
This typically occurs when a pointer or its index is incremented to a position after the buffer; or when pointer arithmetic results in a position after the buffer.
Potential Impact
Confidentiality
Read Memory
Integrity, Availability
Modify Memory, DoS: Crash, Exit, or Restart
Integrity
Modify Memory, Execute Unauthorized Code or Commands
Demonstrative Examples
void host_lookup(char *user_supplied_addr){
struct hostent *hp;in_addr_t *addr;char hostname[64];in_addr_t inet_addr(const char *cp);
/*routine that ensures user_supplied_addr is in the right format for conversion */
validate_addr_form(user_supplied_addr);addr = inet_addr(user_supplied_addr);hp = gethostbyaddr( addr, sizeof(struct in_addr), AF_INET);strcpy(hostname, hp->h_name);
}int returnChunkSize(void *) {
/* if chunk info is valid, return the size of usable memory,
* else, return -1 to indicate an error
*/
...
}int main() {...memcpy(destBuf, srcBuf, (returnChunkSize(destBuf)-1));...}char * copy_input(char *user_supplied_string){
int i, dst_index;char *dst_buf = (char*)malloc(4*sizeof(char) * MAX_SIZE);if ( MAX_SIZE <= strlen(user_supplied_string) ){die("user string too long, die evil hacker!");}dst_index = 0;for ( i = 0; i < strlen(user_supplied_string); i++ ){
if( '&' == user_supplied_string[i] ){dst_buf[dst_index++] = '&';dst_buf[dst_index++] = 'a';dst_buf[dst_index++] = 'm';dst_buf[dst_index++] = 'p';dst_buf[dst_index++] = ';';}else if ('<' == user_supplied_string[i] ){
/* encode to < */
}else dst_buf[dst_index++] = user_supplied_string[i];
}return dst_buf;
}int processMessageFromSocket(int socket) {
int success;
char buffer[BUFFER_SIZE];char message[MESSAGE_SIZE];
// get message from socket and store into buffer
//Ignoring possibliity that buffer > BUFFER_SIZE
if (getMessage(socket, buffer, BUFFER_SIZE) > 0) {
// place contents of the buffer into message structure
ExMessage *msg = recastBuffer(buffer);
// copy message body into string for processing
int index;for (index = 0; index < msg->msgLength; index++) {message[index] = msg->msgBody[index];}message[index] = '\0';
// process message
success = processMessage(message);
}return success;
}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 Static Analysis High — 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 sea
- 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-2009-2550 | Classic stack-based buffer overflow in media player using a long entry in a playlist |
| CVE-2009-2403 | Heap-based buffer overflow in media player using a long entry in a playlist |
| CVE-2009-0689 | large precision value in a format string triggers overflow |
| CVE-2009-0558 | attacker-controlled array index leads to code execution |
| CVE-2008-4113 | OS kernel trusts userland-supplied length value, allowing reading of sensitive information |
| CVE-2007-4268 | Chain: integer signedness error (CWE-195) passes signed comparison, leading to heap overflow (CWE-122) |
Related Weaknesses
Taxonomy Mappings
- OMG ASCRM: ASCRM-CWE-788 —
Frequently Asked Questions
What is CWE-788?
CWE-788 (Access of Memory Location After End 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 after the end of the buffer.
How can CWE-788 be exploited?
Attackers can exploit CWE-788 (Access of Memory Location After End of Buffer) to read memory. This weakness is typically introduced during the Implementation phase of software development.
How do I prevent CWE-788?
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-788?
CWE-788 is classified as a Base-level weakness (Medium abstraction). It has been observed in 6 real-world CVEs.