The product reads data past the end, or before the beginning, of the intended buffer.

Resultant
When an out-of-bounds read occurs, typically the product has already made a separate mistake, such as modifying an index or performing pointer arithmetic that produces an out-of-bounds address.

Primary

OOB read
Shorthand for "Out of bounds" read

Implementation

Confidentiality
Read Memory
An attacker could get secret values such as cryptographic keys, PII, memory addresses, or other information that could be used in additional attacks.

Confidentiality
Bypass Protection Mechanism
Out-of-bounds memory could contain memory addresses or other information that can be used to bypass ASLR and other protection mechanisms in order to improve the reliability of exploiting a separate weakness for code execution.

Availability
DoS: Crash, Exit, or Restart
An attacker could cause a segmentation fault or crash by causing memory to be read outside of the bounds of the buffer. This is especially likely when the code reads a variable amount of data and assumes that a sentinel exists to stop the read operation, such as a NUL in a string.

Other
Varies by Context
The read operation could produce other undefined or unexpected results.

Fuzzing
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, or resource consumption. Fuzzing effectively produces repeatable test cases that clearly indicate bugs, which helps developers to diagnose the issues.
High

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.)
High

Automated Dynamic Analysis
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].
Moderate
Crafted inputs are necessary to
reach the code containing the error, such as generated
by fuzzers. Also, these tools may reduce performance,
and they only report the error condition - not the
original mistake that led to the
error.

Implementation
Input Validation

Assume all input is malicious. Use an "accept known good" input validation strategy, i.e., use a list of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does.
When performing input validation, consider all potentially relevant properties, including length, type of input, the full range of acceptable values, missing or extra inputs, syntax, consistency across related fields, and conformance to business rules. As an example of business rule logic, "boat" may be syntactically valid because it only contains alphanumeric characters, but it is not valid if the input is only expected to contain colors such as "red" or "blue."
Do not rely exclusively on looking for malicious or malformed inputs. This is likely to miss at least one undesirable input, especially if the code's environment changes. This can give attackers enough room to bypass the intended validation. However, denylists can be useful for detecting potential attacks or determining which inputs are so malformed that they should be rejected outright.
To reduce the likelihood of introducing an out-of-bounds read, ensure that you validate and ensure correct calculations for any length argument, buffer size calculation, or offset. Be especially careful of relying on a sentinel (i.e. special character such as NUL) in untrusted inputs.

Architecture and Design
Language Selection
Use a language that provides appropriate memory abstractions.

In the following code, the method retrieves a value from an array at a specific array index location that is given as an input parameter to the method

int getValueFromArray(int *array, int len, int index) {

int value;

// check that the array index is less than the maximum

// length of the array
if (index < len) {

// get the value at the specified index of the array
value = array[index];
}
// if array index is invalid then output error message

// and return value indicating error
else {printf("Value is: %d\n", array[index]);value = -1;}
return value;
}

However, this method only verifies that the given array index is less than the maximum length of the array but does not check for the minimum value (CWE-839). This will allow a negative value to be accepted as the input array index, which will result in reading data before the beginning of the buffer (CWE-127) and may allow access to sensitive memory. The input array index should be checked to verify that is within the maximum and minimum range required for the array (CWE-129). In this example the if statement should be modified to include a minimum range check, as shown below.

...

// check that the array index is within the correct

// range of values for the array
if (index >= 0 && index < len) {
...

In the following C/C++ example the method processMessageFromSocket() will get a message from a socket, placed into a buffer, and will parse the contents of the buffer into a structure that contains the message length and the message body. A for loop is used to copy the message body into a local character string which will be passed to another method for processing.

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;
}

However, the message length variable (msgLength) from the structure is used as the condition for ending the for loop without validating that msgLength accurately reflects the actual length of the message body (CWE-606). If msgLength indicates a length that is longer than the size of a message body (CWE-130), then this can result in a buffer over-read by reading past the end of the buffer (CWE-126).

CVE-2023-1018
The reference implementation code for a Trusted Platform Module does not implement length checks on data, allowing for an attacker to read 2 bytes past the end of a buffer.
https://www.cve.org/CVERecord?id=CVE-2023-1018

CVE-2020-11899
Out-of-bounds read in IP stack used in embedded systems, as exploited in the wild per CISA KEV.
https://www.cve.org/CVERecord?id=CVE-2020-11899

CVE-2014-0160
Chain: "Heartbleed" bug receives an inconsistent length parameter (CWE-130) enabling an out-of-bounds read (CWE-126), returning memory that could include private cryptographic keys and other sensitive data.
https://www.cve.org/CVERecord?id=CVE-2014-0160

CVE-2021-40985
HTML conversion package has a buffer under-read, allowing a crash
https://www.cve.org/CVERecord?id=CVE-2021-40985

CVE-2018-10887
Chain: unexpected sign extension (CWE-194) leads to integer overflow (CWE-190), causing an out-of-bounds read (CWE-125)
https://www.cve.org/CVERecord?id=CVE-2018-10887

CVE-2009-2523
Chain: product does not handle when an input string is not NULL terminated (CWE-170), leading to buffer over-read (CWE-125) or heap-based buffer overflow (CWE-122).
https://www.cve.org/CVERecord?id=CVE-2009-2523

CVE-2018-16069
Chain: series of floating-point precision errors
(CWE-1339) in a web browser rendering engine causes out-of-bounds read
(CWE-125), giving access to cross-origin data
https://www.cve.org/CVERecord?id=CVE-2018-16069

CVE-2004-0112
out-of-bounds read due to improper length check
https://www.cve.org/CVERecord?id=CVE-2004-0112

CVE-2004-0183
packet with large number of specified elements cause out-of-bounds read.
https://www.cve.org/CVERecord?id=CVE-2004-0183

CVE-2004-0221
packet with large number of specified elements cause out-of-bounds read.
https://www.cve.org/CVERecord?id=CVE-2004-0221

CVE-2004-0184
out-of-bounds read, resultant from integer underflow
https://www.cve.org/CVERecord?id=CVE-2004-0184

CVE-2004-1940
large length value causes out-of-bounds read
https://www.cve.org/CVERecord?id=CVE-2004-1940

CVE-2004-0421
malformed image causes out-of-bounds read
https://www.cve.org/CVERecord?id=CVE-2004-0421

CVE-2008-4113
OS kernel trusts userland-supplied length value, allowing reading of sensitive information
https://www.cve.org/CVERecord?id=CVE-2008-4113

Memory Management

Memory

Out-of-bounds Read

ARR30-C
Do not form or use out-of-bounds pointers or array subscripts
Imprecise

ARR38-C
Guarantee that library functions do not form invalid pointers
Imprecise

EXP39-C
Do not access a variable through a pointer of an incompatible type
Imprecise

STR31-C
Guarantee that storage for strings has sufficient space for character data and the null terminator
Imprecise

STR32-C
Do not pass a non-null-terminated character sequence to a library function that expects a string
CWE More Abstract

SFP8
Faulty Buffer Access

Allowed
This CWE entry is at the Base level of abstraction, which is a preferred level of abstraction for mapping to the root causes of vulnerabilities.
Carefully read both the name and description to ensure that this mapping is an appropriate fit. Do not try to 'force' a mapping to a lower-level Base/Variant simply to comply with this preferred level of abstraction.

PLOVER
2006-07-19
Draft 3
2006-07-19

CWE Content Team
MITRE
2008-09-08
updated Applicable_Platforms, Relationships, Taxonomy_Mappings, Weakness_Ordinalities

CWE Content Team
MITRE
2009-10-29
updated Description

CWE Content Team
MITRE
2010-09-27
updated Relationships

CWE Content Team
MITRE
2011-06-01
updated Common_Consequences

CWE Content Team
MITRE
2012-05-11
updated Demonstrative_Examples, References, Relationships

CWE Content Team
MITRE
2014-06-23
updated Related_Attack_Patterns

CWE Content Team
MITRE
2014-07-30
updated Relationships, Taxonomy_Mappings

CWE Content Team
MITRE
2015-12-07
updated Relationships

CWE Content Team
MITRE
2017-11-08
updated Causal_Nature, Observed_Examples, Taxonomy_Mappings

CWE Content Team
MITRE
2018-03-27
updated Description

CWE Content Team
MITRE
2019-01-03
updated Relationships

CWE Content Team
MITRE
2019-06-20
updated Description, Related_Attack_Patterns

CWE Content Team
MITRE
2019-09-19
updated Common_Consequences, Observed_Examples, Potential_Mitigations, References, Relationships

CWE Content Team
MITRE
2020-02-24
updated Potential_Mitigations, Relationships, Taxonomy_Mappings

CWE Content Team
MITRE
2020-06-25
updated Observed_Examples, Potential_Mitigations

CWE Content Team
MITRE
2020-08-20
updated Observed_Examples, Potential_Mitigations, Relationships

CWE Content Team
MITRE
2020-12-10
updated Related_Attack_Patterns, Relationships

CWE Content Team
MITRE
2021-07-20
updated Observed_Examples, Relationships

CWE Content Team
MITRE
2022-04-28
updated Research_Gaps

CWE Content Team
MITRE
2022-06-28
updated Observed_Examples, Relationships

CWE Content Team
MITRE
2022-10-13
updated Applicable_Platforms, Relationships, Taxonomy_Mappings

CWE Content Team
MITRE
2023-01-31
updated Description

CWE Content Team
MITRE
2023-04-27
updated Detection_Factors, References, Relationships

CWE Content Team
MITRE
2023-06-29
updated Mapping_Notes, Relationships

CWE Content Team
MITRE
2023-10-26
updated Observed_Examples

CWE Content Team
MITRE
2024-07-16
4.15
2024-07-16
updated Alternate_Terms, Common_Consequences, Description, Diagram, Weakness_Ordinalities

CWE Content Team
MITRE
2024-11-19
4.16
2024-11-19
updated Observed_Examples, Relationships

CWE Content Team
MITRE
2025-09-09
4.18
2025-09-09
updated Affected_Resources, Demonstrative_Examples, Functional_Areas

CWE Content Team
MITRE
2025-12-11
4.19
2025-12-11
updated Applicable_Platforms, Detection_Factors, References, Relationships

Abhi Balakrishnan
2024-02-29
4.15
2024-07-16
Provided diagram to improve CWE usability