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
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 22, 23, 36
Введенный в R2015b