Use of externally controlled environment variable

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

Описание

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

Риск

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

Фиксация

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

Примеры

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

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

void taintedenvvariable(char* path)
{
    putenv(path); 
}

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

Коррекция — санирует путь

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

#define _XOPEN_SOURCE
#define _GNU_SOURCE
#define SIZE128 128
#include "stdlib.h"
#include "string.h"

/* Function to sanitize a string */
int sanitize_str(char* str, size_t n) {
    int res = 0;

    if (str && n > 0 && n < SIZE128) {
        /* string is not NULL, with size between 1 and max    */
        str[n-1] = '\0';  /* Add a null char at end of string */
        /* Tainted pointer detected above, used as "firewall" */
        res = 1;
    }
    return res;
}

void taintedenvvariable(char* path, size_t n)
{
    if (sanitize_str(path, n)) 
    {
        unsigned int n2 = strlen("PATH=")+strnlen(path, n);
        char *env_path = (char *)malloc(n2+1);
        if (env_path)
        {
            strcpy(env_path, "PATH=");
            strncat(env_path, path, n2);
            putenv(env_path);
        }
    }
}

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

Группа: испорченные данные
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: TAINTED_ENV_VARIABLE
Удар: носитель
ID CWE: 15

Введенный в R2015b