Inappropriate I/O operation on device files

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

Описание

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

  • fopen()

  • fopen_s()

  • freopen()

  • remove()

  • rename()

  • CreateFile()

  • CreateFileA()

  • CreateFileW()

  • _wfopen()

  • _wfopen_s()

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

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

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

  • Вы используете функцию сравнения строк, чтобы сравнить имя файла со списком имен файлов устройств.

Риск

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

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

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

  • Использование 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 race условие, которое может позволить атакующему изменить файл после того, как вы проверите его, но перед вызовом 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++
По умолчанию: Off
Синтаксис командной строки : INAPPROPRIATE_IO_ON_DEVICE
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 67
Введенный в R2018b