exponenta event banner

Использование небезопасного временного файла

Временное созданное имя файла небезопасно

Описание

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

Риск

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

  • При создании имени файла возникает условие гонки.

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

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

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

Для создания временных файлов используйте более безопасную стандартную подпрограмму временных файлов, например 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;
}

В этом примере флаги поиска ошибок 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++
По умолчанию: Откл.
Синтаксис командной строки: NON_SECURE_TEMP_FILE
Воздействие: Высокое
CWE ID: 377, 922
Представлен в R2015b