Уязвимая манипуляция с путями

Параметр пути с /../, /abs/path/ или другими небезопасными элементами

Описание

Уязвимая манипуляция с путями обнаруживает обходы относительного или абсолютного пути. Если обход пути содержит испорченный источник, или вы используете путь, чтобы открыться/создать файлы, Средство поиска Ошибки повышает дефект.

Риск

Элементы относительного пути, такие как ".." могут решить к местоположениям вне намеченной папки. Элементы абсолютного пути, такие как "/abs/path" могут также решить к местоположениям вне намеченной папки.

Атакующий может использовать эти типы элементов обхода пути, чтобы пересечь к остальной части файловой системы и получить доступ к другим файлам или папкам.

Фиксация

Избегайте уязвимых элементов обхода пути, таких как /../ и /abs/path/. Используйте зафиксированные имена файлов и местоположения по мере возможности.

Примеры

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

# include <stdio.h>
# include <string.h>
# include <wchar.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <unistd.h>
# include <stdlib.h>
# define BASEPATH "/tmp/"
# define FILENAME_MAX 512

static void Relative_Path_Traversal(void)
{
    char * data;
    char data_buf[FILENAME_MAX] = BASEPATH;
    char sub_buf[FILENAME_MAX];

    if (fgets(sub_buf, FILENAME_MAX, stdin) == NULL) exit (1);
    data = data_buf;
    strcat(data, sub_buf);

    FILE *file = NULL;
    file = fopen(data, "wb+"); 
    if (file != NULL) fclose(file);
}

int path_call(void){
    Relative_Path_Traversal();
}

Этот пример открывает файл от "/tmp/", но использует относительный путь для файла. Внешний пользователь может управлять этим относительным путем, когда fopen открывает файл.

Исправление — использование фиксированное имя файла

Одно возможное исправление должно использовать фиксированное имя файла вместо относительного пути. Этот пример использует file.txt.

# include <stdio.h>
# include <string.h>
# include <wchar.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <unistd.h>
# include <stdlib.h>
# define BASEPATH "/tmp/"
# define FILENAME_MAX 512

static void Relative_Path_Traversal(void)
{
    char * data;
    char data_buf[FILENAME_MAX] = BASEPATH;
    data = data_buf;

    /* FIX: Use a fixed file name */
    strcat(data, "file.txt");
    FILE *file = NULL;
    file = fopen(data, "wb+");  
    if (file != NULL) fclose(file);
}

int path_call(void){
    Relative_Path_Traversal();
}

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

Группа: безопасность
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: PATH_TRAVERSAL
Влияние: низко
ID CWE: 22, 23, 36

Введенный в R2015b