Архивированные файлы проверяются на наличие zip-бомб
Описание
Это требование направлено на предотвращение загрузки архивов, содержащих так называемые zip-бомбы — архивы, которые занимают минимальный объем на диске, но при распаковке могут занимать огромное количество места в памяти и на диске, что приводит к перегрузке системы. Zip-бомбы используются злоумышленниками для атаки на серверы, вызывая исчерпание ресурсов и отказ в обслуживании.
Почему это важно
- Предотвращение атак DoS: Zip-бомбы могут быстро заполнить все доступное дисковое пространство или память, что приводит к отказу в обслуживании (Denial of Service, DoS) и недоступности сервера.
- Экономия ресурсов: Защита от zip-бомб помогает избежать загрузки вредоносных архивов, которые при распаковке могут занять гораздо больше места, чем предполагалось исходя из их исходного размера.
- Стабильность системы: Проверка архивов на наличие zip-бомб сохраняет стабильность работы системы и предотвращает критические ошибки, связанные с нехваткой ресурсов.
Способы реализации с примерами
1. Проверка на уровне сервера: Сервер должен распаковывать архив в безопасном режиме и проверять его содержимое перед тем, как разрешить загрузку или сохранение.
Пример (Python):
import zipfile
import os
def is_zip_safe(file_path, max_decompressed_size=500*1024*1024):
with zipfile.ZipFile(file_path, 'r') as zip_ref:
total_size = 0
for file_info in zip_ref.infolist():
total_size += file_info.file_size
if total_size > max_decompressed_size:
return False
return True
file_path = 'example.zip'
if is_zip_safe(file_path):
print("ZIP is safe to extract")
else:
print("ZIP bomb detected!")
2. Ограничение на максимальный размер распакованных данных: При загрузке архива проверяйте общий размер файлов в архиве после распаковки и сравнивайте с допустимыми пределами.
Пример (PHP):
$maxDecompressedSize = 500 * 1024 * 1024; // 500 MB
$zip = new ZipArchive;
if ($zip->open('example.zip') === TRUE) {
$totalSize = 0;
for($i = 0; $i < $zip->numFiles; $i++) {
$stat = $zip->statIndex($i);
$totalSize += $stat['size'];
if ($totalSize > $maxDecompressedSize) {
echo 'Potential zip bomb detected';
break;
}
}
$zip->close();
} else {
echo 'Failed to open zip file';
}
3. Валидация на стороне API: Если приложение использует API для загрузки файлов, архивы также должны быть проверены на наличие zip-бомб.
Пример (Node.js):
const unzipper = require('unzipper');
const fs = require('fs');
const MAX_SIZE = 500 * 1024 * 1024; // 500 MB
function checkZipBomb(filePath) {
let totalSize = 0;
fs.createReadStream(filePath)
.pipe(unzipper.Parse())
.on('entry', function (entry) {
totalSize += entry.vars.uncompressedSize;
if (totalSize > MAX_SIZE) {
entry.autodrain();
console.log('Zip bomb detected');
} else {
entry.autodrain();
}
})
.on('close', function () {
console.log('Zip file processed');
});
}
checkZipBomb('example.zip');
Примеры уязвимого кода
// Пример уязвимого кода на PHP без проверки архива
$zip = new ZipArchive;
if ($zip->open($_FILES['file']['tmp_name']) === TRUE) {
$zip->extractTo('uploads/');
$zip->close();
echo 'File uploaded successfully';
} else {
echo 'Failed to open zip file';
}
Проблема: Код извлекает архив, не проверяя его содержимое и объем распакованных данных. Если это zip-бомба, то распаковка может привести к исчерпанию ресурсов сервера.
Причины, к которым может привести несоблюдение требования
- Отказ в обслуживании (DoS): Zip-бомбы могут вызывать исчерпание ресурсов, таких как память и дисковое пространство, что может привести к недоступности приложения или его краху.
- Системные сбои: При распаковке zip-бомбы сервер может выйти из строя из-за нехватки ресурсов, что приведет к сбоям и остановке других процессов.
- Злоупотребление загрузкой файлов: Без соответствующих проверок злоумышленники могут использовать zip-бомбы для атаки на сервер, затрудняя его обслуживание для других пользователей.
Рекомендации
- Ограничивайте максимальный допустимый размер распакованных данных архивов.
- Используйте инструменты для анализа архивов перед их распаковкой.
- Проверяйте файлы на наличие zip-бомб на стороне сервера и API.
- Мониторьте использование ресурсов на сервере для предотвращения атак типа zip-бомб и других угроз, связанных с загрузкой файлов.
Это требование помогает сохранить систему в рабочем состоянии, защищая от атак, направленных на перегрузку системы при помощи вредоносных архивов.