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
Удар: высоко
ID CWE: 377, 922
Введенный в R2015b