Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Wiki Markup
This non-compliant code example is based on the managed string library developed by CERT \[[Burch 06|AA. C References#Seacord 06]\].  In this non-compliant example, the managed string type is defined in the include file {{"string_m.h"}} as follows:

Code Block
bgColor#FFCCCC
struct string_mx {
    size_t size;
    size_t maxsize;
    unsigned char strtype;
    char *cstr;
};

typedef struct string_mx *string_m;

The implementation of the string_m type is fully visible to the user of the data type , after including the "string_m.h" file. Programmers are consequently more likely to directly manipulate the fields within the structure, violating the software engineering principles of information hiding and data encapsulation and increases increasing the probability of developing incorrect or non-portable code.

...

This compliant solution reimplements the string_m type as a private type, hiding the implementation of the data type from the user of the managed string library. This can be accomplished the following manner. The To accomplish this, the developer of the private data type creates two include files: an external "string_m.h" include file that is included by the user of the data type and an internal file that is only included in files that implement the managed string abstract data eypetype.

In the external "string_m.h" the string_m type is declared as a pointer to a struct string_mx, which in turn is declared as an incomplete type.

Code Block
bgColor#ccccff
struct string_mx;
typedef struct string_mx *string_m;

In the "private" compilation unit internal include file struct string_mx is fully defined, but non-not visible to a user of the APIdata abstraction.

Code Block
bgColor#ccccff
struct string_mx {
    size_t size;
    size_t maxsize;
    unsigned char strtype;
    char *cstr;
};

#include Modules that implement the abstract data type include both the external and internal definitions, while users of the data abstraction include only the external "string_m.h" file. This allows the implementation of the string_m to remain private.

Risk Assessment

String handling functions defined in C99 Section 7.21 and elsewhere are susceptible to common programming errors that can lead to serious, exploitable vulnerabilities. Managed strings, when used properly, can eliminate many of these errors--particularly in new developmentThe use of abstract data types, while not essential to secure programming, can significantly reduce the number of defects and vulnerabilities introduced in code, particularly during on-going maintenance.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

STR01-A

1 (low)

1 (unlikely)

1 (high)

P1

L3

...