You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 52 Next »

There are two basic approaches for managing null-terminated byte strings in C programs: the first is to maintain strings in statically allocated arrays; the second is to dynamically allocate memory as required. Each approach has advantages and disadvantages. However, it generally makes sense to select a single approach to managing strings and apply it consistently across a project. Otherwise, the decision is left to individual programmers who are likely to make different, inconsistent choices.

Statically allocated strings assume a fixed size character array, meaning that it is impossible to add data after the buffer is filled. Because the static approach discards excess data, actual program data can be lost. Consequently, the resulting string must be fully validated.

Dynamically allocated buffers dynamically resize as additional memory is required. Dynamic approaches scale better and do not discard excess data. The major disadvantage is that if inputs are not limited they can exhaust memory on a machine consequently be used in denial-of-service attacks.

Dynamic allocation is often disallowed in safety critical systems. For example, the MISRA standard requires that "Dynamic heap memory allocation shall not be used" [[MISRA 04]]. Some safety critical systems can take advantage of dynamic memory allocation during initialization, but not during operations. For example, avionics software may dynamically allocate memory while initializing the aircraft, but not during flight.

There are a number of existing libraries available for managing string data; the library selected depends on the approach adopted for managing null-terminated byte strings. The functions defined by C99 Section 7.21, "String handling <string.h>" [[ISO/IEC 9899:1999]] are primarily intended for managing statically allocated strings. However, these functions are problematic because many of them are insufficiently bounded. Consequently, this standard recommends use of the ISO/IEC TR 24731-1 [[ISO/IEC TR 24731-1:2007]] functions for use with statically allocated arrays (see [STR07-A. Use TR 24731 for remediation of existing string manipulation code]). These functions provide bounds-checking interfaces to protect against buffer overflows and other runtime constraint violations.

ISO/IEC PDTR 24731-2 (in progress) offers another approach, supplying functions that allocate enough memory for their results [[ISO/IEC PDTR 24731-2]]. ISO/IEC PDTR 24731-2 provides an API that dynamically allocates the results of string functions as needed. Almost all of the APIs in this TR are also in a current International Standard. For example, PDTR 24731-2 includes POSIX functions such as strdup() [[ISO/IEC 9945:2003]] as well as functions from the Linux Standard Base Core Specification such as asprintf() [[ISO/IEC 23360-1:2006]].

Another library that uses dynamic allocation is the CERT managed string library. The managed string library described in [[Burch 06]] was developed in response to the need for a string library that can improve the quality and security of newly developed C language programs while eliminating obstacles to widespread adoption and possible standardization. The managed string library eliminates the possibility of unbounded copies, null-termination errors, and truncation by ensuring there is always adequate space available for the resulting string (including the terminating null character). The primary advantage of the CERT managed string library, is that the source code is freely available so that the library can be adopted and customized as required by an organization.

Risk Assessment

Failing to adopt a consistent plan for managing strings within an application can lead to inconsistent decisions which may make it difficult to ensure system properties, such as adhering to safety requirements.

Recommendation

Severity

Likelihood

Remediation Cost

Priority

Level

STR01-A

low

unlikely

high

P1

L3

Related Vulnerabilities

Search for vulnerabilities resulting from the violation of this rule on the CERT website.

References

[[Burch 06]]
[[CERT 06c]]
[[ISO/IEC 9945:2003]]
[[ISO/IEC 9899:1999]] Section 7.21, "String handling <string.h>"
[[ISO/IEC 23360-1:2006]]
[[ISO/IEC TR 24731-1:2007]]
[[ISO/IEC PDTR 24731-2]]
[[MISRA 04]] Rule 20.4
[[Seacord 05a]] Chapter 2, "Strings"


      07. Characters and Strings (STR)       STR02-A. Sanitize data passed to complex subsystems

  • No labels