Description
The product does not terminate or incorrectly terminates a string or array with a null character or equivalent terminator.
Null termination errors frequently occur in two different ways. An off-by-one error could cause a null to be written out of bounds, leading to an overflow. Or, a program could use a strncpy() function call incorrectly, which prevents a null terminator from being added at all. Other scenarios are possible.
Potential Impact
Confidentiality, Integrity, Availability
Read Memory, Execute Unauthorized Code or Commands
Confidentiality, Integrity, Availability
DoS: Crash, Exit, or Restart, Read Memory, DoS: Resource Consumption (CPU), DoS: Resource Consumption (Memory)
Integrity, Availability
Modify Memory, DoS: Crash, Exit, or Restart
Integrity, Confidentiality, Availability, Access Control, Other
Alter Execution Logic, Execute Unauthorized Code or Commands
Demonstrative Examples
#define MAXLEN 1024...char *pathbuf[MAXLEN];...read(cfgfile,inputbuf,MAXLEN); //does not null terminatestrcpy(pathbuf,inputbuf); //requires null terminated input...char buf[MAXPATH];...readlink(pathname, buf, MAXPATH);int length = strlen(buf);...#include <stdio.h>#include <string.h>
int main() {
char longString[] = "String signifying nothing";char shortString[16];
strncpy(shortString, longString, 16);printf("The last character in shortString is: %c (%1$x)\n", shortString[15]);return (0);
}Mitigations & Prevention
Use a language that is not susceptible to these issues. However, be careful of null byte interaction errors (CWE-626) with lower-level constructs that may be written in a language that is susceptible.
Ensure that all string functions used are understood fully as to how they append null characters. Also, be wary of off-by-one errors when appending nulls to the end of strings.
If performance constraints permit, special code can be added that validates null-termination of string buffers, this is a rather naive and error-prone solution.
Switch to bounded string manipulation functions. Inspect buffer lengths involved in the buffer overrun trace reported with the defect.
Add code that fills buffers with nulls (however, the length of buffers still needs to be inspected, to ensure that the non null-terminated string is not written at the physical end of the buffer).
Detection Methods
- 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
Real-World CVE Examples
| CVE ID | Description |
|---|---|
| CVE-2000-0312 | Attacker does not null-terminate argv[] when invoking another program. |
| CVE-2003-0777 | Interrupted step causes resultant lack of null termination. |
| CVE-2004-1072 | Fault causes resultant lack of null termination, leading to buffer expansion. |
| CVE-2001-1389 | Multiple vulnerabilities related to improper null termination. |
| CVE-2003-0143 | Product does not null terminate a message buffer after snprintf-like call, leading to overflow. |
| 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). |
Related Weaknesses
Taxonomy Mappings
- PLOVER: — Improper Null Termination
- 7 Pernicious Kingdoms: — String Termination Error
- CLASP: — Miscalculated null termination
- OWASP Top Ten 2004: A9 — Denial of Service
- CERT C Secure Coding: POS30-C — Use the readlink() function properly
- CERT C Secure Coding: STR03-C — Do not inadvertently truncate a null-terminated byte string
- CERT C Secure Coding: STR32-C — Do not pass a non-null-terminated character sequence to a library function that expects a string
- Software Fault Patterns: SFP11 — Improper Null Termination
Frequently Asked Questions
What is CWE-170?
CWE-170 (Improper Null Termination) is a software weakness identified by MITRE's Common Weakness Enumeration. It is classified as a Base-level weakness. The product does not terminate or incorrectly terminates a string or array with a null character or equivalent terminator.
How can CWE-170 be exploited?
Attackers can exploit CWE-170 (Improper Null Termination) to read memory, execute unauthorized code or commands. This weakness is typically introduced during the Implementation phase of software development.
How do I prevent CWE-170?
Key mitigations include: Use a language that is not susceptible to these issues. However, be careful of null byte interaction errors (CWE-626) with lower-level constructs that may be written in a language that is susceptible.
What is the severity of CWE-170?
CWE-170 is classified as a Base-level weakness (Medium abstraction). It has been observed in 6 real-world CVEs.