exponenta event banner

Доступ к файлам между проверкой и использованием (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++
По умолчанию: Откл.
Синтаксис командной строки: TOCTOU
Воздействие: среднее
ИДЕНТИФИКАТОР CWE: 367
Представлен в R2015b