Use of automatic variable as putenv-family function argument

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

Описание

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

Риск

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

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

Использование 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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки : PUTENV_AUTO_VAR
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 562, 686, 825
Введенный в R2017b