Vulnerable path manipulation

Параметр пути с /../, /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