Misuse of a FILE object

Использование копии объекта 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 не может указать на правильный поток.

Коррекция — копирует указатель объекта ФАЙЛА

Объявите 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