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

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

Описание

Использование незащищенного временного файла ищет временные стандартные программы файла, которые не безопасны.

Риск

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

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

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

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

Фиксация

Чтобы создать временные файлы, используйте более безопасную стандартную временную стандартную программу файла, такую как 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++
Значение по умолчанию: 'off'
Синтаксис командной строки: NON_SECURE_TEMP_FILE
Влияние: высоко
ID CWE: 377, 922

Введенный в R2015b