Отправленные пользователем метаданные файла не используются напрямую системой
Описание
Это требование подразумевает, что метаданные, переданные пользователем вместе с загружаемым файлом (например, имя файла, тип файла, автор, дата создания и т.д.), не должны использоваться приложением напрямую без дополнительной проверки или фильтрации. Злоумышленники могут манипулировать этими метаданными для внедрения вредоносного контента или обхода проверок безопасности.
Почему это важно
- Защита от внедрения вредоносного кода: Метаданные могут содержать потенциально опасную информацию, которую злоумышленники могут использовать для атак, например внедрение скриптов.
- Обход проверки файлов: Пользователь может попытаться изменить тип файла в метаданных, чтобы загрузить файл с запрещённым расширением (например, изображение с расширением .exe).
- Безопасность серверных процессов: Метаданные могут быть использованы для манипуляции поведением системы, что может привести к утечке данных или другим атакам.
- Нарушение целостности данных: Некорректное использование метаданных может повлиять на внутренние процессы системы и искажать данные, используемые для работы приложения.
Способы реализации с примерами
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']);
Проблема: Имя файла, предоставленное пользователем, может содержать вредоносные символы или расширение, что может привести к выполнению скриптов на сервере или загрузке опасных файлов.
Причины, к которым может привести несоблюдение требования
- Внедрение вредоносного кода: Использование имени файла или типа файла без проверки может позволить злоумышленнику загрузить скрипт или другой вредоносный файл и выполнить его на сервере.
- Обход проверок безопасности: Манипулирование метаданными может позволить пользователю загрузить файлы, которые в противном случае были бы заблокированы, например, через изменение расширения файла.
- Нарушение работы системы: Неправильные или поддельные метаданные могут вызвать сбой в работе приложения, когда система ожидает определенные значения, а получает поддельные данные.
- Проблемы с обработкой файлов: Злоумышленники могут подделать информацию о типе или размере файла, что приведет к неправильной обработке или загрузке неподдерживаемых файлов.
Рекомендации
- Игнорируйте метаданные, предоставленные пользователем: Не используйте имя файла, тип файла или другие данные, присланные пользователем, без предварительной проверки или замены их значениями, сгенерированными на сервере.
- Валидируйте метаданные: Если необходимо использовать предоставленные пользователем метаданные, обязательно валидируйте их на сервере, чтобы убедиться в их корректности и безопасности.
- Используйте безопасные методы: Для обработки метаданных используйте функции, которые позволяют избежать потенциальных уязвимостей, таких как
secure_filename
или фильтрация символов. - Проверяйте типы файлов: Никогда не полагайтесь на типы файлов, указанные в метаданных. Вместо этого проверяйте содержимое файла на основе его сигнатуры или mime-типа на стороне сервера.
Соблюдение этого требования помогает защитить сервер и приложение от множества атак, связанных с манипуляцией метаданными, и предотвращает выполнение непреднамеренных действий с файлами, загруженными пользователями.