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

Compare with Current View Page History

« Previous Version 26 Next »

The POSIX function putenv() is used to set environment variable values. The putenv() function does not create a copy of the string supplied to it as a parameter, rather it inserts a pointer to the string into the environment array. If an automatic variable is supplied as a parameter to putenv(), the memory allocated for that variable may be overwritten when the containing function returns and stack memory is recycled. This behavior is noted in the Open Group Base Specifications Issue 6 [[Open Group 04]]:

A potential error is to call putenv() with an automatic variable as the argument, then return from the calling function while string is still part of the environment.

Non-Compliant Code Example

In this example derived from Dowd, an automatic variable is used to modify the environment via a call to putenv(). When that environment variable is retrieved, it may have a value that is different than the value supplied to putenv(). Note that this example also violates rule DCL30-C. Do not refer to an object outside of its lifetime.

int func(char *var) {
  char env[1024];
  
  if (snprintf(env, sizeof(env),"ENV=%s", var) < 0) {
    /* Handle Error */
  }
  
  putenv(env);

  return 0;
}

Compliant Solution

To make this example compliant env should not be declared as an automatic variable.

static char *env= "VAR=1";
putenv(env);

Risk Assessment

Using an automatic variable as an argument to putenv() may cause that variable to take on an unintended value. Depending on how and when that variable is used, this can cause unexpected program behavior, or possibly allow an attacker to run arbitrary code.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

ENV80-C

3 (high)

1 (unlikely)

1 (high)

P3

L3

Examples of vulnerabilities resulting from the violation of this rule can be found on the CERT website.

References

[[Open Group 04]] The putenv() function
[[ISO/IEC 9899-1999]] Section 6.2.4, "Storage durations of objects," and Section 7.20.3, "Memory management functions"
[[DCL30-C. Do not refer to an object outside of its lifetime]]

  • No labels