exponenta event banner

Неподходящая операция ввода-вывода для файлов устройств

Операция может привести к уязвимостям безопасности или сбою системы

Описание

Этот дефект возникает, если не проверить, ссылается ли параметр имени файла на файл устройства, прежде чем передать его следующим функциям:

  • fopen()

  • fopen_s()

  • freopen()

  • remove()

  • rename()

  • CreateFile()

  • CreateFileA()

  • CreateFileW()

  • _wfopen()

  • _wfopen_s()

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

Неподходящая операция ввода-вывода в файлах устройств не приводит к возникновению дефекта в следующих случаях:

  • Вы используете stat или lstat-family для проверки параметра имени файла перед вызовом ранее перечисленных функций.

  • Функция сравнения строк используется для сравнения имени файла со списком имен файлов устройств.

Риск

Операции, подходящие только для обычных файлов, но выполняемые с файлами устройств, могут привести к атакам типа «отказ в обслуживании», другим уязвимостям безопасности или сбоям системы.

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

Перед выполнением операции ввода-вывода для файла:

  • Использовать stat(), lstat()или эквивалентная функция для проверки того, ссылается ли параметр имени файла на обычный файл.

  • Используйте функцию сравнения строк для сравнения имени файла со списком имен файлов устройств.

Примеры

развернуть все

#include <stdio.h>
#include <string.h>

#define SIZE1024 1024

FILE* func()
{

    FILE* f;
    const char file_name[SIZE1024] = "./tmp/file";
    
    if ((f = fopen(file_name, "w")) == NULL) {
        /*handle error */
    };
    /*operate on file */
}

В этом примере: func() работает с файлом file_name не проверяя, является ли файл обычным. Если file_name является файлом устройства, попытки доступа к нему могут привести к системному сбою.

Исправление - Проверка файла с помощью lstat() Перед вызовом fopen()

Одной из возможных корректировок является использование lstat() и S_ISREG для проверки того, является ли файл обычным файлом. Это решение содержит TOCTOU условие гонки, которое может позволить злоумышленнику изменить файл после проверки, но до вызова fopen (). Чтобы предотвратить эту уязвимость, убедитесь, чтоfile_name относится к файлу в безопасной папке.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>

#define SIZE1024 1024

FILE* func()
{

    FILE* f;
    const char file_name[SIZE1024] = "./tmp/file";
    struct stat orig_st;
    if ((lstat(file_name, &orig_st) != 0) ||
        (!S_ISREG(orig_st.st_mode))) {
        exit(0);
    }
    if ((f = fopen(file_name, "w")) == NULL) {
        /*handle error */
    };
    /*operate on file */
} 

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

Группа: Безопасность
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: INAPPROPRIATE_IO_ON_DEVICE
Воздействие: среднее
ИДЕНТИФИКАТОР CWE : 67
Представлен в R2018b