Доступ к файлу между временем проверки и использованием (TOCTOU)

Файл или папка могут изменить состояние из-за гонки доступа

Описание

Доступ к файлу между временем проверки и использованием (TOCTOU) обнаруживает проблемы состояния состязания между проверкой существования файла или папки, и использованием файла или папки.

Риск

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

Фиксация

Перед использованием файла не проверяйте его состояние. Вместо этого используйте файл и проверяйте результаты позже.

Примеры

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

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

extern void print_tofile(FILE* f);

void toctou(char * log_path) {
    if (access(log_path, W_OK)==0) {
        FILE* f = fopen(log_path, "w");
        if (f) {
            print_tofile(f);
            fclose(f);
        }
    }
}

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

Исправление — открытый затем проверяет

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

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

extern void print_tofile(FILE* f);

void toctou(char * log_path) {
    int fd = open(log_path, O_WRONLY);
    if (fd!=-1) {
        FILE *f = fdopen(fd, "w");
        if (f) {
            print_tofile(f);
            fclose(f);
        }
    }
}

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

Группа: безопасность
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: TOCTOU
Влияние: носитель
ID CWE: 367

Введенный в R2015b