Use of externally controlled environment variable

Значение переменного окружения из небезопасного источника

Описание

Этот дефект возникает, когда функции, которые добавляют или изменяют переменные окружения, такие как putenv и setenvполучите новые значения переменных окружения из небезопасных источников. Чтобы считать все входы за пределами периметра анализа тока небезопасными, используйте -consider-analysis-perimeter-as-trust-boundary.

Риск

Если переменная окружения испорчена, атакующий может управлять вашими системными настройками. Этот контроль может нарушить работу приложения или службы потенциально вредоносными способами.

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

Перед использованием нового переменного окружения проверьте ее значение, чтобы избежать предоставления управления внешним пользователям.

Примеры

расширить все

#define _XOPEN_SOURCE
#define _GNU_SOURCE
#include "stdlib.h"

void taintedenvvariable(void)
{
    char* path = getenv("APP_PATH");
    putenv(path); 
}

В этом примере putenv изменяет переменную окружения. Путь path не был проверен, чтобы убедиться, что это намеченный путь.

Коррекция - Санирование пути

Одна из возможных коррекций - санировать путь, проверяя, что он соответствует тому, что вы ожидаете.

#define _POSIX_C_SOURCE
#include <stdlib.h>
#include <string.h>

/* Function to sanitize a path */
const char * sanitize_path(const char* str) {
	/* secure white list of paths */
	static const char *const authorized_paths[] = {
		"/bin",
		"/usr/bin"
	};
	if (str != NULL) {
		for (int i = 0; i < sizeof(authorized_paths) / sizeof(authorized_paths[0]); i++)
		if (strcmp(authorized_paths[i], str) == 0) {
			return authorized_paths[i];
		}
	}
	return NULL;
}

void taintedenvvariable(void)
{
	const char* path = getenv("APP_PATH");
	path = sanitize_path(path);
	if (path != NULL) {
		if (setenv("PATH", path, /* overwrite = */1) != 0) {
			/* fatal error */
			exit(1);
		}
	}
} 

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

Группа: испорченные данные
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: TAINTED_ENV_VARIABLE
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 15
Введенный в R2015b