CERT C++: FIO32-C

Не выполнять операции на устройствах, которые подходят только для файлов

Описание

Определение правила

Не выполнять операции на устройствах, которые подходят только для файлов.[1]

Реализация Polyspace

Эта проверка проверяет на неподходящую операцию ввода-вывода на файлах устройства.

Примеры

расширить все

Проблема

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

  • fopen()

  • fopen_s()

  • freopen()

  • remove()

  • rename()

  • CreateFile()

  • CreateFileA()

  • CreateFileW()

  • _wfopen()

  • _wfopen_s()

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

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

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

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

Риск

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

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

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

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

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

Пример - Использование fopen() Без проверки file_name
#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 */
} 

Проверяйте информацию

Группа: 07. Входной выход (FIO)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОН И/ИЛИ ЕГО ИНЖЕНЕРНОГО ИНСТИТУТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ НА БАЗИСЕ «КАК ЕСТЬ». УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБОГО ВОПРОСА, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЮ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ КОММЕРЧЕСКОЙ ВЫГОДЫ, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Это программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллон или его Институтом программной инженерии.