Use of non-secure temporary file

Временное имя файла не защищено

Описание

Этот дефект возникает, когда вы используете временные файловые стандартные программы, которые не являются безопасными.

Риск

Если атакующий угадает имя файла, сгенерированное стандартной временной стандартной программой, атакующий может:

  • Вызвать условие гонки, когда вы генерируете имя файла.

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

  • Создайте символьную ссылку на файл, в котором хранятся конфиденциальные данные. Когда ваша программа записывает во временный файл, конфиденциальные данные удаляются.

Зафиксировать

Чтобы создать временные файлы, используйте более безопасную стандартную стандартную программу создания файлов, такую как mkstemp от POSIX.1-2001.

Кроме того, при создании временных файлов с стандартными программами, которые разрешают флаги, такие как mkostemp, используйте флаг исключения O_EXCL чтобы избежать гоночных условий.

Примеры

расширить все

#define _BSD_SOURCE
#define _XOPEN_SOURCE 
#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int test_temp()
{
    char tpl[] = "abcXXXXXX";
    char suff_tpl[] = "abcXXXXXXsuff";
    char *filename = NULL;
    int fd;
    
    filename = tempnam("/var/tmp", "foo_");
    
    if (filename != NULL)
    {
        printf("generated tmp name (%s) in (%s:%s:%s)\n", 
               filename, getenv("TMPDIR") ? getenv("TMPDIR") : "$TMPDIR",
               "/var/tmp", P_tmpdir);
        
        fd = open(filename, O_CREAT, S_IRWXU|S_IRUSR);
        if (fd != -1)
        {
            close(fd);
            unlink(filename);
            return 1;
        }
    }
    return 0;
}

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

Коррекция - Добавить O_EXCL Флаг

Одной из возможных коррекций является добавление O_EXCL флаг при открытии временного файла.

#define _BSD_SOURCE
#define _XOPEN_SOURCE 
#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int test_temp()
{
    char tpl[] = "abcXXXXXX";
    char suff_tpl[] = "abcXXXXXXsuff";
    char *filename = NULL;
    int fd;
    
    filename = tempnam("/var/tmp", "foo_");
    
    if (filename != NULL)
    {
        printf("generated tmp name (%s) in (%s:%s:%s)\n", 
               filename, getenv("TMPDIR") ? getenv("TMPDIR") : "$TMPDIR",
               "/var/tmp", P_tmpdir);
        
        fd = open(filename, O_CREAT|O_EXCL, S_IRWXU|S_IRUSR);
        if (fd != -1)
        {
            close(fd);
            unlink(filename);
            return 1;
        }
    }
    return 0;
}

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

Группа: Безопасность
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: NON_SECURE_TEMP_FILE
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 377, 922
Введенный в R2015b