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

Архивированные файлы проверяются на наличие zip-бомб

Описание

Это требование направлено на предотвращение загрузки архивов, содержащих так называемые zip-бомбы — архивы, которые занимают минимальный объем на диске, но при распаковке могут занимать огромное количество места в памяти и на диске, что приводит к перегрузке системы. Zip-бомбы используются злоумышленниками для атаки на серверы, вызывая исчерпание ресурсов и отказ в обслуживании.

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

  1. Предотвращение атак DoS: Zip-бомбы могут быстро заполнить все доступное дисковое пространство или память, что приводит к отказу в обслуживании (Denial of Service, DoS) и недоступности сервера.
  2. Экономия ресурсов: Защита от zip-бомб помогает избежать загрузки вредоносных архивов, которые при распаковке могут занять гораздо больше места, чем предполагалось исходя из их исходного размера.
  3. Стабильность системы: Проверка архивов на наличие 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-бомба, то распаковка может привести к исчерпанию ресурсов сервера.

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

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

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

  • Ограничивайте максимальный допустимый размер распакованных данных архивов.
  • Используйте инструменты для анализа архивов перед их распаковкой.
  • Проверяйте файлы на наличие zip-бомб на стороне сервера и API.
  • Мониторьте использование ресурсов на сервере для предотвращения атак типа zip-бомб и других угроз, связанных с загрузкой файлов.

Это требование помогает сохранить систему в рабочем состоянии, защищая от атак, направленных на перегрузку системы при помощи вредоносных архивов.