CWE-170: Improper Null Termination
The product does not terminate or incorrectly terminates a string or array with a null character or equivalent terminator.
Last updated
Overview
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.
Real-world CVEs
43 recorded CVEs are caused by CWE-170 (Improper Null Termination). The highest-severity and most recent are shown first. 9 new CWE-170 CVEs have been recorded so far in 2026 (5 in 2025).
- CVE-2021-1418Critical · CVSS 9.9 · EPSS 57th2021-03-24
- CVE-2021-1417Critical · CVSS 9.9 · EPSS 57th2021-03-24
- CVE-2021-1411Critical · CVSS 9.9 · EPSS 69th2021-03-24
- CVE-2021-1471Critical · CVSS 9.9 · EPSS 68th2021-03-24
- CVE-2021-1469Critical · CVSS 9.9 · EPSS 60th2021-03-24
- CVE-2026-8721
Crypt::OpenSSL::PKCS12 versions through 1.94 for Perl truncates passwords with embedded NULLs
Critical · CVSS 9.8 · EPSS 36th2026-05-17 - CVE-2026-42010
Gnutls: gnutls: authentication bypass via nul character in username
Critical · CVSS 9.8 · EPSS 60th2026-05-07 - CVE-2025-67790Critical · CVSS 9.8 · EPSS 20th2025-12-17
- CVE-2021-31886Critical · CVSS 9.8 · EPSS 86th2021-11-09
- CVE-2021-31884Critical · CVSS 9.8 · EPSS 70th2021-11-09
- CVE-2021-22931Critical · CVSS 9.8 · EPSS 97th2021-08-16
- CVE-2019-8275Critical · CVSS 9.8 · EPSS 89th2019-03-09
Showing 12 of 43 recorded CWE-170 CVEs. Track new ones as they are published and get AI-written analysis and fixes.
Monitor CWE-170 vulnerabilitiesCommon consequences
What can happen when CWE-170 is exploited.
Read Memory, Execute Unauthorized Code or Commands
Affects: Confidentiality, Integrity, Availability
The case of an omitted null character is the most dangerous of the possible issues. This will almost certainly result in information disclosure, and possibly a buffer overflow condition, which may be exploited to execute arbitrary code.
DoS: Crash, Exit, or Restart, Read Memory, DoS: Resource Consumption (CPU), DoS: Resource Consumption (Memory)
Affects: Confidentiality, Integrity, Availability
If a null character is omitted from a string, then most string-copying functions will read data until they locate a null character, even outside of the intended boundaries of the string. This could: cause a crash due to a segmentation fault cause sensitive adjacent memory to be copied and sent to an outsider trigger a buffer overflow when the copy is being written to a fixed-size buffer.
Modify Memory, DoS: Crash, Exit, or Restart
Affects: Integrity, Availability
Misplaced null characters may result in any number of security problems. The biggest issue is a subset of buffer overflow, and write-what-where conditions, where data corruption occurs from the writing of a null character over valid data, or even instructions. A randomly placed null character may put the system into an undefined state, and therefore make it prone to crashing. A misplaced null character may corrupt other data in memory.
Alter Execution Logic, Execute Unauthorized Code or Commands
Affects: Integrity, Confidentiality, Availability, Access Control, Other
Should the null character corrupt the process flow, or affect a flag controlling access, it may lead to logical errors which allow for the execution of arbitrary code.
How it happens
When it is introduced
Typically introduced during these phases of the software lifecycle.
Applies to
Languages
How to prevent it
Practical mitigations for CWE-170, grouped by where in the lifecycle they apply.
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).
How to detect it
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.)
Effectiveness: High
Code examples
Illustrative examples from MITRE showing how the weakness appears in code.
The following code reads from cfgfile and copies the input into inputbuf using strcpy(). The code mistakenly assumes that inputbuf will always contain a NULL terminator.
Vulnerable example
#define MAXLEN 1024The code above will behave correctly if the data read from cfgfile is null terminated on disk as expected. But if an attacker is able to modify this input so that it does not contain the expected NULL character, the call to strcpy() will continue copying from memory until it encounters an arbitrary NULL character. This will likely overflow the destination buffer and, if the attacker can control the contents of memory immediately following inputbuf, can leave the application susceptible to a buffer overflow attack.
In the following code, readlink() expands the name of a symbolic link stored in pathname and puts the absolute path into buf. The length of the resulting value is then calculated using strlen().
Vulnerable example
char buf[MAXPATH];The code above will not always behave correctly as readlink() does not append a NULL byte to buf. Readlink() will stop copying characters once the maximum size of buf has been reached to avoid overflowing the buffer, this will leave the value buf not NULL terminated. In this situation, strlen() will continue traversing memory until it encounters an arbitrary NULL character further on down the stack, resulting in a length value that is much larger than the size of string. Readlink() does return the number of bytes copied, but when this return value is the same as stated buf size (in this case MAXPATH), it is impossible to know whether the pathname is precisely that many bytes long, or whether readlink() has truncated the name to avoid overrunning the buffer. In testing, vulnerabilities like this one might not be caught because the unused contents of buf and the memory immediately following it may be NULL, thereby causing strlen() to appear as if it is behaving correctly.
While the following example is not exploitable, it provides a good example of how nulls can be omitted or misplaced, even when "safe" functions are used:
Vulnerable example
#include <stdio.h>The above code gives the following output: "The last character in shortString is: n (6e)". So, the shortString array does not end in a NULL character, even though the "safe" string function strncpy() was used. The reason is that strncpy() does not impliciitly add a NULL character at the end of the string when the source is equal in length or longer than the provided size.
Illustrative examples
Real CVEs that MITRE cites as examples of this weakness.
- 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).
Terminology & mappings
Mapped taxonomies
- PLOVER: Improper Null Termination
- 7 Pernicious Kingdoms: String Termination Error
- CLASP: Miscalculated null termination
- OWASP Top Ten 2004: Denial of Service (A9) — CWE More Specific fit
- CERT C Secure Coding: Use the readlink() function properly (POS30-C) — CWE More Abstract fit
- CERT C Secure Coding: Do not inadvertently truncate a null-terminated byte string (STR03-C)
- CERT C Secure Coding: Do not pass a non-null-terminated character sequence to a library function that expects a string (STR32-C) — Exact fit
- Software Fault Patterns: Improper Null Termination (SFP11)
Frequently asked questions
Common questions about CWE-170.
- What is CWE-170?
- The product does not terminate or incorrectly terminates a string or array with a null character or equivalent terminator.
- What CVEs are caused by CWE-170?
- 43 recorded CVEs are attributed to CWE-170, including CVE-2021-1418, CVE-2021-1417, CVE-2021-1411.
- Is CWE-170 part of the OWASP Top 10?
- CWE-170 maps to OWASP Top Ten 2004: Denial of Service (A9) in the OWASP security taxonomy.
- How do you prevent CWE-170?
- 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.
- How is CWE-170 detected?
- 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.)
- What are the consequences of CWE-170?
- Exploiting CWE-170 can lead to: Read Memory, Execute Unauthorized Code or Commands, DoS: Crash, Exit, or Restart, DoS: Resource Consumption (CPU), DoS: Resource Consumption (Memory), Modify Memory.
- Is CWE-170 actively exploited?
- 43 recorded CVEs are caused by CWE-170; none are currently in CISA's KEV catalog of actively exploited flaws.
References
- MITRE CWE definition (CWE-170) (opens in a new tab)
- CWE-170 vulnerabilities on NVD (opens in a new tab)
- Learn: What is a CWE?
Weakness data is sourced from the MITRE CWE catalog (v4.20). CVE associations are aggregated and kept current by RadicalNotion.AI.
Stay ahead of CWE-170
Get alerted the moment a new CWE-170 vulnerability affects your stack, with AI-written analysis, severity context, and remediation guidance.