exponenta event banner

CERT C: FIO32-C правил

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

Описание

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

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

Внедрение Polyspace

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

Примеры

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

Проблема

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

  • fopen()

  • fopen_s()

  • freopen()

  • remove()

  • rename()

  • CreateFile()

  • CreateFileA()

  • CreateFileW()

  • _wfopen()

  • _wfopen_s()

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

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

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

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

Риск

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

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

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

  • Использовать 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 */
} 

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

Группа: Правило 09. Входной выход (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 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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