
Функциональный эксплойт DoS для CVE-2021-32675 в Redis, использующий заголовки строк большого размера для провоцирования исчерпания памяти. Включает инструкции по использованию и среду тестирования на основе Docker.
Этот репозиторий содержит рабочий эксплойт для CVE-2021-32675 — уязвимости класса «отказ в обслуживании» (DoS) в Redis. Дефект позволяет неаутентифицированным удалённым злоумышленникам вызывать массовое предварительное выделение памяти на сервере Redis, отправляя заголовки bulk-строк завышенного размера без предоставления данных аргументов, что приводит к исчерпанию памяти и сбою службы.
CVE-2021-32675 — это уязвимость в обработке буфера запросов Redis. При разборе входящих команд в протоколе RESP (REdis Serialization Protocol) Redis считывает объявленную длину аргумента bulk-строки ($<length>\r\n) и немедленно предварительно выделяет в памяти буфер SDS (Simple Dynamic String) для приёма полезной нагрузки — ещё до чтения каких-либо байтов аргумента.
Поскольку это предварительное выделение происходит до получения полезной нагрузки аргумента, неаутентифицированный клиент может объявить максимально допустимый размер bulk-строки (по умолчанию proto-max-bulk-len составляет 512 МБ) и удерживать соединение открытым неограниченно долго, не передавая фактические данные. Redis сохраняет предварительно выделенную память для каждого активного соединения, создавая коэффициент усиления примерно 32 000 000× (~16 байт сетевого трафика приводят к резервированию 512 МБ памяти).
Открытие нескольких одновременных соединений с использованием этой техники, основанной только на заголовках, быстро исчерпывает доступную память сервера, что приводит к:
maxmemoryOOM command not allowed).Уязвимость затрагивает версии Redis до:
Экземпляры Redis, работающие без аутентификации (requirepass не настроен) или с proto-max-bulk-len по умолчанию (512 МБ), уязвимы к этому эксплойту. Исправленные версии применяют строгий лимит буфера протокола в 16 КБ для неаутентифицированных клиентов до начала предварительного выделения памяти.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Python 3.8+
Уязвимый экземпляр Redis (версии до 6.2.6 / 6.0.16 или экземпляры без аутентификации)
python3 exploit.py --host <IP> --port <PORT> [options]
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
--host | str | Обязательный | Имя хоста или IP-адрес целевого Redis |
--port | int | 6379 | Номер порта |
--connections | int | 10 | Количество открываемых вредоносных соединений |
--size | int | 512 | Объявляемый размер буфера bulk-строки в МБ |
--hold | int | 5 | Секунды удержания соединений открытыми перед очисткой |
--password, --auth | str | None | Пароль для аутентификации Redis (при необходимости) |
python3 exploit.py --host 127.0.0.1 --port 6379 --connections 10 --size 512 --hold 5
Вы можете запустить локальную тестовую лабораторию, используя прилагаемую конфигурацию Docker Compose:
# Запуск уязвимого Redis (порт 6380) и защищённого Redis (порт 6381)
docker compose -f conf/docker-compose.yml up -d
# Тест против уязвимого экземпляра
python3 exploit.py --host 127.0.0.1 --port 6380 --connections 10 --size 512
# Тест против защищённого экземпляра
python3 exploit.py --host 127.0.0.1 --port 6381 --password "L4bS3cur3!2024" --connections 10 --size 512
# Остановка контейнеров
docker compose -f conf/docker-compose.yml down
Эта Proof of Concept предоставлена исключительно в образовательных, исследовательских целях и для проверки безопасности. Автор не несёт ответственности за любое неправомерное использование, ущерб или несанкционированное тестирование систем без явного разрешения.