Use of externally controlled environment variable

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

Описание

Этот дефект происходит, когда функции, которые добавляют или изменяют переменные окружения, такие как putenv и setenv, получите новые значения переменной окружения из незащищенных источников.

Риск

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

Фиксация

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

Примеры

развернуть все

#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
Удар: носитель
ID CWE: 15
Введенный в R2015b