...
| Code Block | ||
|---|---|---|
| ||
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> extern char **environ; /* These arrays are both nullNULL-terminated. */ static char *spc_restricted_environ[ ] = { "IFS= \t\n", 0, /* leave room for PATH=... */ 0 }; static char *spc_preserve_environ[ ] = { "TZ", 0 }; char **spc_sanitize_environment(int preservec, char const char **preservev) { int i; char **new_environ, *path, *ptr; char const char *value, *var; size_t path_size, arr_size = 1, arr_ptr = 0, len, new_size = 0; if ((path_size = confstr(_CS_PATH, NULL, 0)) > 0) { path = (char *)malloc(path_size + sizeof("PATH=") - 1); if (path == NULL) { /* handle error */ } strcpy(path, "PATH="); if (confstr(_CS_PATH, path + sizeof("PATH=") - 1, path_size) > 0) { spc_restricted_environ[1] = path; } else { free(path); path = NULL; } } for (i = 0; (var = spc_restricted_environ[i]) != 0; i++) { new_size += strlen(var) + 1; arr_size++; } for (i = 0; (var = spc_preserve_environ[i]) != 0; i++) { if ((value = getenv(var)) == NULL) continue; new_size += strlen(var) + strlen(value) + 2; /* include the '=' */ arr_size++; } if (preservec && preservev) { for (i = 0; i < preservec && (var = preservev[i]) != 0; i++) { if ((value = getenv(var)) == NULL) continue; new_size += strlen(var) + strlen(value) + 2; /* include the '=' */ arr_size++; } } new_size += (arr_size * sizeof(char *)); if ((new_environ = (char **)malloc(new_size)) == NULL) abort( ); new_environ[arr_size - 1] = 0; ptr = (char *)new_environ + (arr_size * sizeof(char *)); for (i = 0; (var = spc_restricted_environ[i]) != 0; i++) { new_environ[arr_ptr++] = ptr; len = strlen(var); memcpy(ptr, var, len + 1); ptr += len + 1; } for (i = 0; (var = spc_preserve_environ[i]) != 0; i++) { if ((value = getenv(var)) == NULL) continue; new_environ[arr_ptr++] = ptr; len = strlen(var); memcpy(ptr, var, len); *(ptr + len + 1) = '='; memcpy(ptr + len + 2, value, strlen(value) + 1); ptr += len + strlen(value) + 2; /* include the '=' */ } if (preservec && preservev) { for (i = 0; i < preservec && (var = preservev[i]) != 0; i++) { if ((value = getenv(var)) == NULL) continue; new_environ[arr_ptr++] = ptr; len = strlen(var); memcpy(ptr, var, len); *(ptr + len + 1) = '='; memcpy(ptr + len + 2, value, strlen(value) + 1); ptr += len + strlen(value) + 2; /* include the '=' */ } } /* the new environment can now be used as the envp argument to execle or execve */ return new_environ; } |
...
| Code Block | ||
|---|---|---|
| ||
char * search_command; /* provided by the user, looks like 'grep -e...' */ system( search_command); |
...
| Code Block | ||
|---|---|---|
| ||
#include <string.h> /* ... */ char * search_command; /* provided by the user, looks like 'grep -e...' */ if (strlen( search_command) < strlen("xgrep")) { /* handle too-short-command error */ } { /* Make sure command is actually a grep variant * by ensuring command starts with "grep" or "*grep" */ char * location = strstr( search_command, "grep"); if (location != search_command && location != search_command+1) { /* handle not-a-grep-command error */ } } { /* Eliminate bad chars */ static char bad_chars[] = "$|&>;`\n"; if (strcspn(cp, bad_chars) != strlen(cp)) { /* handle naughty-chars-in-command error */ } } /* Sanitize current environment here ... */ if (system( search_command) != 0) { /* handle system error */ } |
...
Recommendation | Severity | Likelihood | Remediation Cost | Priority | Level |
|---|---|---|---|---|---|
ENV03-A | 2 ( medium ) 2 ( | probable ) | 2 ( medium ) | P8 | L2 |
Related Vulnerabilities
...