Описание
Использование автоматической переменной как putenv
- аргумент функции семейства происходит когда аргумент putenv
- функция семейства является локальной переменной с автоматической длительностью.
Риск
Функциональный putenv(char *string)
вставляет указатель на его переданный аргумент в массив среды, вместо того, чтобы делать копию аргумента. Если аргумент является автоматической переменной, ее память может быть перезаписана после функции, содержащей putenv()
вызовите возвращается. Последующий вызов getenv()
от другой функции возвращает адрес переменной out-of-scope, которая не может быть разыменована по закону. Эта переменная out-of-scope может заставить переменные окружения брать неожиданные значения, заставлять программу прекращать отвечать или позволять произвольные уязвимости выполнения кода.
Фиксация
Используйте setenv()
/unsetenv()
установить и сбросить переменные окружения. В качестве альтернативы используйте putenv
- аргументы функции семейства с динамически выделенной памятью, или, если ваше приложение не имеет никаких требований повторной входимости, аргументов со статической длительностью. Например, одно выполнение потока без рекурсии или прерываний не требует повторной входимости. Это не может быть названо (повторно введенное) во время своего выполнения.
Пример - автоматическая переменная в качестве аргумента putenv()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE1024 1024
void func(int var)
{
char env[SIZE1024];
int retval = sprintf(env, "TEST=%s", var ? "1" : "0");
if (retval <= 0) {
/* Handle error */
}
/* Environment variable TEST is set using putenv().
The argument passed to putenv is an automatic variable. */
retval = putenv(env);
if (retval != 0) {
/* Handle error */
}
}
В этом примере, sprintf()
хранит символьную строку TEST=var
в env
. Значение переменной окружения TEST
затем установлен в var
при помощи putenv()
. Поскольку env
автоматическая переменная, значение TEST
может измениться однажды func()
возвращается.
Коррекция — использует static
Переменная для аргумента putenv()
Объявите env
как переменная статической длительности. Ячейка памяти env
не перезаписывается на время программы, даже после func()
возвращается.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE1024 1024
void func(int var)
{
/* static duration variable */
static char env[SIZE1024];
int retval = sprintf(env,"TEST=%s", var ? "1" : "0");
if (retval <= 0) {
/* Handle error */
}
/* Environment variable TEST is set using putenv() */
retval=putenv(env);
if (retval != 0) {
/* Handle error */
}
}
Коррекция — использует setenv()
устанавливать значение переменной окружения
Устанавливать значение TEST
к var
, используйте setenv()
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE1024 1024
void func(int var)
{
/* Environment variable TEST is set using setenv() */
int retval = setenv("TEST", var ? "1" : "0", 1);
if (retval != 0) {
/* Handle error */
}
}