Addition of Data Structure Sentinel

Incomplete Base
Structure: Simple
Description

This vulnerability occurs when a program unintentionally adds or modifies a special marker, known as a sentinel, within a data structure, leading to critical logic errors.

Extended Description

Data structures often use sentinel values as internal markers to define their boundaries or format. Common examples include the null terminator ('\0') at the end of a string or a special node marking the end of a linked list. These sentinels are control mechanisms for the program itself, not regular data. If an attacker or a logic flaw can inject or alter these markers, the program's fundamental understanding of its own data breaks down. To prevent this, you must rigorously validate all external inputs and implement strict bounds checking to ensure sentinel values are never written into data fields where they don't belong. Treat sentinels as reserved, protected control characters that your data processing logic must explicitly guard against, separating the trusted internal structure of your data from untrusted, user-supplied content.

Common Consequences 1
Scope: Integrity

Impact: Modify Application Data

Generally this error will cause the data structure to not work properly by truncating the data.

Potential Mitigations 4
Phase: ImplementationArchitecture and Design
Encapsulate the user from interacting with data sentinels. Validate user input to verify that sentinels are not present.
Phase: Implementation
Proper error checking can reduce the risk of inadvertently introducing sentinel values into data. For example, if a parsing function fails or encounters an error, it might return a value that is the same as the sentinel.
Phase: Architecture and Design
Use an abstraction library to abstract away risky APIs. This is not a complete solution.
Phase: Operation
Use OS-level preventative functionality. This is not a complete solution.
Demonstrative Examples 1
The following example assigns some character values to a list of characters and prints them each individually, and then as a string. The third character value is intended to be an integer taken from user input and converted to an int.

Code Example:

Bad
C
c
The first print statement will print each character separated by a space. However, if a NULL byte is read from stdin by fgetc, then it will return 0. When foo is printed as a string, the 0 at character foo[2] will act as a NULL terminator and foo[3] will never be printed.
References 1
The CLASP Application Security Process
Secure Software, Inc.
2005
ID: REF-18
Likelihood of Exploit

High

Applicable Platforms
Languages:
C : UndeterminedC++ : Undetermined
Modes of Introduction
Implementation
Taxonomy Mapping
  • CLASP
  • CERT C Secure Coding
  • CERT C Secure Coding