exponenta event banner

Использование автоматической переменной в качестве аргумента функции putenv-family

аргумент функции putenv-family недоступен за пределами ее области действия

Описание

Этот дефект возникает, когда аргумент putenvФункция -family является локальной переменной с автоматической длительностью.

Риск

Функция putenv(char *string) вставляет указатель на предоставленный аргумент в массив среды вместо создания копии аргумента. Если аргумент является автоматической переменной, его память может быть перезаписана после функции, содержащей putenv() возврат вызова. Последующий вызов getenv() из другой функции возвращает адрес переменной вне области действия, которая не может быть дереферифицирована юридически. Эта переменная вне области действия может привести к тому, что переменные среды приобретут непредвиденные значения, перестанут отвечать программе или допустят уязвимости при выполнении произвольного кода.

Зафиксировать

Использовать setenv()/unsetenv() для установки и отмены настройки переменных среды. В качестве альтернативы можно использовать 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 */
    }
}

Информация о результатах

Группа: Статическая память
Язык: C | C++
По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода
Синтаксис командной строки: PUTENV_AUTO_VAR
Воздействие: Высокое
CWE ID: 562, 686, 825
Представлен в R2017b