Архивированные файлы проверяются на наличие 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-бомб и других угроз, связанных с загрузкой файлов.
 
Это требование помогает сохранить систему в рабочем состоянии, защищая от атак, направленных на перегрузку системы при помощи вредоносных архивов.