Перейти к содержанию

Отправленные пользователем метаданные файла не используются напрямую системой

Описание

Это требование подразумевает, что метаданные, переданные пользователем вместе с загружаемым файлом (например, имя файла, тип файла, автор, дата создания и т.д.), не должны использоваться приложением напрямую без дополнительной проверки или фильтрации. Злоумышленники могут манипулировать этими метаданными для внедрения вредоносного контента или обхода проверок безопасности.

Почему это важно

  1. Защита от внедрения вредоносного кода: Метаданные могут содержать потенциально опасную информацию, которую злоумышленники могут использовать для атак, например внедрение скриптов.
  2. Обход проверки файлов: Пользователь может попытаться изменить тип файла в метаданных, чтобы загрузить файл с запрещённым расширением (например, изображение с расширением .exe).
  3. Безопасность серверных процессов: Метаданные могут быть использованы для манипуляции поведением системы, что может привести к утечке данных или другим атакам.
  4. Нарушение целостности данных: Некорректное использование метаданных может повлиять на внутренние процессы системы и искажать данные, используемые для работы приложения.

Способы реализации с примерами

1. Не доверять метаданным от пользователя: При загрузке файлов приложение должно игнорировать или проверять метаданные, предоставленные пользователем, такие как имя файла, тип файла и другие атрибуты.

Пример (PHP):

// Игнорируем имя файла, предоставленное пользователем, и генерируем уникальное
$newFileName = uniqid() . '.' . pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

// Сохраняем файл под новым именем
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $newFileName);

2. Проверка метаданных файлов: Если метаданные нужны, они должны быть валидированы на сервере перед использованием.

Пример проверки типа файла (Python + Flask):

from werkzeug.utils import secure_filename

# Безопасное извлечение имени файла и его валидация
filename = secure_filename(file.filename)

# Дополнительная проверка допустимых типов файлов
if not allowed_file(filename):
    return "File type is not allowed", 400

3. Генерация и управление метаданными на стороне сервера: Метаданные файла, такие как имя, дата создания или атрибуты, должны генерироваться сервером и не зависеть от данных, предоставленных пользователем.

Пример генерации даты создания файла:

$fileCreationDate = date("Y-m-d H:i:s");

4. Проверка метаданных изображения: Например, EXIF-данные изображений могут быть изменены злоумышленниками, поэтому они должны проверяться.

$exif = exif_read_data($_FILES['file']['tmp_name']);
if ($exif === false) {
    echo 'No EXIF data found.';
} else {
    // Выполняем фильтрацию или очищаем данные
}

Примеры уязвимого кода

// Пример уязвимого кода, который напрямую использует имя файла, предоставленное пользователем
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);

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

Причины, к которым может привести несоблюдение требования

  1. Внедрение вредоносного кода: Использование имени файла или типа файла без проверки может позволить злоумышленнику загрузить скрипт или другой вредоносный файл и выполнить его на сервере.
  2. Обход проверок безопасности: Манипулирование метаданными может позволить пользователю загрузить файлы, которые в противном случае были бы заблокированы, например, через изменение расширения файла.
  3. Нарушение работы системы: Неправильные или поддельные метаданные могут вызвать сбой в работе приложения, когда система ожидает определенные значения, а получает поддельные данные.
  4. Проблемы с обработкой файлов: Злоумышленники могут подделать информацию о типе или размере файла, что приведет к неправильной обработке или загрузке неподдерживаемых файлов.

Рекомендации

  • Игнорируйте метаданные, предоставленные пользователем: Не используйте имя файла, тип файла или другие данные, присланные пользователем, без предварительной проверки или замены их значениями, сгенерированными на сервере.
  • Валидируйте метаданные: Если необходимо использовать предоставленные пользователем метаданные, обязательно валидируйте их на сервере, чтобы убедиться в их корректности и безопасности.
  • Используйте безопасные методы: Для обработки метаданных используйте функции, которые позволяют избежать потенциальных уязвимостей, таких как secure_filename или фильтрация символов.
  • Проверяйте типы файлов: Никогда не полагайтесь на типы файлов, указанные в метаданных. Вместо этого проверяйте содержимое файла на основе его сигнатуры или mime-типа на стороне сервера.

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