CERT C++: FIO32-C

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

Описание

Управляйте определением

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

Реализация Polyspace

Это средство проверки проверяет на операцию Inappropriate I/O на файлах устройств.

Примеры

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

Проблема

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

  • fopen()

  • fopen_s()

  • freopen()

  • remove()

  • rename()

  • CreateFile()

  • CreateFileA()

  • CreateFileW()

  • _wfopen()

  • _wfopen_s()

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

Несоответствующая операция I/O на файлах устройств не повышает дефект когда:

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

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

Риск

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

Фиксация

Прежде чем вы выполните операцию I/O на файле:

  • Используйте 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 состояние состязания, которое может позволить атакующему изменять файл после того, как вы будете проверять его, но перед вызовом 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 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

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