File access between time of check and use (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
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 367
Введенный в R2015b