exponenta event banner

Неправильное использование объекта FILE

Использование копии объекта FILE

Описание

Этот дефект возникает в следующих случаях:

  • Удаление ссылки на объект FILE, включая косвенное удаление ссылки с помощью memcmp().

  • С помощью указателя можно изменить весь объект FILE или один из его компонентов.

  • Вы берете адрес объекта FILE, который не был возвращен при вызове fopen- функция семейства. Дефект не возникает, если макрос определяет указатель как адрес встроенного объекта FILE, например #define ptr (&__stdout).

Риск

В некоторых реализациях адрес указателя на объект FILE, используемый для управления потоком, является значимым. Указатель на копию объекта FILE интерпретируется иначе, чем указатель на исходный объект, и потенциально может привести к операциям с неправильным потоком. Поэтому использование копии объекта FILE может привести к тому, что программное обеспечение перестанет отвечать, что злоумышленник может использовать при атаках типа «отказ в обслуживании».

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

Не создавайте копию объекта FILE. Не используйте адрес объекта FILE, который не был возвращен при успешном вызове fopen- функция семейства.

Примеры

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

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

void fatal_error(void);

int func(void)
{
	/*'stdout' dereferenced and contents
        copied to 'my_stdout'. */
    FILE my_stdout = *stdout;  
	
	/* Address of 'my_stdout' may not point to correct stream. */
    if (fputs("Hello, World!\n", &my_stdout) == EOF)  
    {
        /* Handler error */
        fatal_error();
    }
    return 0;
}
        
      

В этом примере объект FILE stdout обнуляется, и его содержимое копируется в my_stdout. Содержание stdout может быть несущественным. fputs() затем вызывается с адресом my_stdout в качестве аргумента. Потому что нет вызова fopen() или была сделана аналогичная функция, адрес my_stdout может не указывать на правильный поток.

Исправление - копирование указателя объекта FILE

Объявить my_stdout указать на тот же адрес, что и stdout для обеспечения записи в правильный поток при вызове fputs().

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

void fatal_error(void);

int func(void)
{
	/* 'my_stdout' and 'stdout' point to the same object. */
    FILE *my_stdout = stdout;  
    if (fputs("Hello, World!\n", my_stdout) == EOF)
    {
        /* Handler error */
        fatal_error();
    }
    return 0;
} 

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

Группа: Программирование
Язык: C | C++
По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода
Синтаксис командной строки: FILE_OBJECT_MISUSE
Воздействие: Низкий
Представлен в R2017b