exponenta event banner

Управление уязвимыми путями

Аргумент пути с /../, /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++
По умолчанию: Откл.
Синтаксис командной строки: PATH_TRAVERSAL
Воздействие: Низкий
CWE ID: 22, 23, 36
Представлен в R2015b