
Script de diagnóstico y remediación para cinco CVEs de Redis, que proporciona escaneo, mitigación basada en ACL y guía de endurecimiento de configuración para vulnerabilidades de RCE autenticadas.
Fecha de publicación: 2026-05-08 Autor: TonyCao ([email protected]) Fuente: Redis Security Advisory
El 05/05/2026, Redis Ltd. publicó un security advisory sobre 5 vulnerabilidades de seguridad críticas que afectan a todas las versiones de Redis OSS/CE. Todos los CVE pueden conducir a Remote Code Execution (RCE) si se explotan con éxito.
| # | Código CVE | CVSS | Nivel | Tipo de fallo | Condición de explotación |
|---|---|---|---|---|---|
| 1 | CVE-2026-23479 | 7.7 | HIGH | Use-After-Free | Autenticado, con permiso para ejecutar comandos de bloqueo |
| 2 | CVE-2026-25243 | 7.7 | HIGH | Invalid Memory Access | Autenticado, con permiso para ejecutar RESTORE |
| 3 | CVE-2026-25588 | 7.7 | HIGH | Invalid Memory Access | Autenticado, con permiso RESTORE + módulo RedisTimeSeries |
| 4 | CVE-2026-25589 | 7.7 | HIGH | Invalid Memory Access | Autenticado, con permiso RESTORE + módulo RedisBloom |
| 5 | CVE-2026-23631 | 6.1 | MEDIUM | Use-After-Free | Autenticado, réplica con replica-read-only = disabled |
Punto común: Todos los CVE requieren que el atacante esté autenticado (authenticated) en la instancia de Redis. CVE-2026-23631 solo afecta a réplicas con la configuración
replica-read-only disabled.
| Línea de versión | Versión parcheada (mínima) |
|---|---|
| 6.2.x | 6.2.22 |
| 7.2.x | 7.2.14 |
| 7.4.x | 7.4.9 |
| 8.2.x | 8.2.6 |
| 8.4.x | 8.4.3 |
| 8.6.x | 8.6.3 |
| Módulo | Versión mínima |
|---|---|
| RedisTimeSeries | 1.12.14 / 1.10.24 / 1.8.23 |
| RedisBloom | 2.8.20 / 2.6.28 / 2.4.23 |
| Versión | Parche |
|---|---|
| 8.0.6 | 8.0.10-64 |
| 7.22.2 | 7.22.2-79 |
| 7.8.6 | 7.8.6-253 |
| 7.4.6 | 7.4.6-279 |
| 7.2.4 | 7.2.4-153 |
Todas las implementaciones de Redis Cloud fueron parcheadas automáticamente en el momento de la publicación del advisory.
| Atributo | Valor |
|---|---|
| Título | Use-After-Free en Unblock Client Flow |
| CVSS 4.0 | 7.7 (HIGH) |
| CWE | CWE-416 (Use After Free) |
| Vector | AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| Condición | Atacante autenticado, con permiso para ejecutar comandos de bloqueo |
| Alcance | Todos los Redis OSS/CE, Redis Software <= 8.0.6 |
Cuando un cliente está bloqueado (blocked) — por ejemplo, esperando en BLPOP — y es expulsado durante la re-ejecución del comando bloqueado, la función processCommandAndResetClient puede devolver un error. El código actual no maneja correctamente este caso, lo que provoca que un puntero haga referencia a una región de memoria ya liberada (use-after-free). El atacante puede explotar el UAF para ejecutar código de forma remota (RCE).
unblock client, processCommandAndResetClientredis-server ejecuta comandos no identificadosBLPOP, BRPOP, BRPOPLPUSH, BLMOVE, BLMPOP, BZPOPMIN, BZPOPMAX, BZMPOP, WAIT, WAITAOF, XREAD, XREADGROUP
#### Método de mitigación (sin actualizar)
**Opción 1 — Bloquear mediante ACL (recomendado):**```bash
# Chặn toàn bộ nhóm lệnh blocking
redis-cli ACL SETUSER default -@blocking
# Hoặc chặn từng lệnh cụ thể
redis-cli ACL SETUSER default -BLPOP -BRPOP -BRPOPLPUSH -BLMOVE -BLMPOP \
-BZPOPMIN -BZPOPMAX -BZMPOP \
-WAIT -WAITAOF \
-XREAD -XREADGROUP
# Lưu ACL
redis-cli ACL SAVE
Método 2 — Deshabilitar mediante rename-command (requiere reiniciar Redis):```bash
rename-command BLPOP "" rename-command BRPOP "" rename-command BRPOPLPUSH "" rename-command BLMOVE "" rename-command BLMPOP "" rename-command BZPOPMIN "" rename-command BZPOPMAX "" rename-command BZMPOP "" rename-command WAIT "" rename-command WAITAOF "" rename-command XREAD "" rename-command XREADGROUP ""
**Método 3 — Activar el modo protegido y limitar las conexiones:**```bash
redis-cli CONFIG SET protected-mode yes
# Trong redis.conf:
protected-mode yes
bind 127.0.0.1
| Atributo | Valor |
|---|---|
| Título | Acceso a memoria no válido en el comando RESTORE |
| CVSS 4.0 | 7.7 (ALTO) |
| CWE | CWE-20 (Validación de entrada incorrecta) + CWE-122 (Desbordamiento de búfer en el montón) |
| Vector | AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| Condición | Atacante autenticado, con permiso para ejecutar RESTORE |
| Alcance | Todos los Redis OSS/CE, Redis Software <= 8.0.6 |
La vulnerabilidad incluye 2 sub-problemas:
Un atacante autenticado envía un payload RESTORE diseñado especialmente para explotar los errores anteriores, lo que puede conducir a RCE en el contexto del proceso redis-server.
Método 1 — Bloquear RESTORE mediante ACL (recomendado):```bash
redis-cli ACL SETUSER default -restore
redis-cli ACL SETUSER default -@dangerous
redis-cli ACL SAVE
**Método 2 — Deshabilitar RESTORE (requiere reiniciar Redis):**```bash
# Thêm vào redis.conf:
rename-command RESTORE ""
Método 3 — Crear una ACL de usuario específica para la aplicación:```bash
redis-cli ACL SETUSER app_user on >StrongPass123 ~*
+@read +@write
-@dangerous
-@admin
-@scripting
-@blocking
-restore
-debug
redis-cli ACL SAVE
---
### CVE-2026-25588
| Propiedad | Valor |
| ------------ | ----------------------------------------------------------------- |
| **Título** | Acceso de memoria no válido en RESTORE con el módulo RedisTimeSeries |
| **CVSS 4.0** | **7.7 (ALTO)** |
| **CWE** | CWE-20 + CWE-122 |
| **Vector** | `AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N` |
| **Condición**| Autenticado + permiso RESTORE + **módulo RedisTimeSeries cargado** |
| **Alcance** | Redis OSS/CE + módulo RedisTimeSeries |
#### Descripción técnica
Cuando el comando `RESTORE` se utiliza en una instancia con el **módulo RedisTimeSeries** cargado, un payload serializado diseñado especialmente puede desencadenar un acceso de memoria no válido durante el procesamiento de datos de series temporales. La vulnerabilidad reside en la forma en que el módulo RedisTimeSeries deserializa los datos del payload RESTORE.
#### Señales de detección
- Caída de Redis con un stack trace relacionado con el módulo RedisTimeSeries
- El módulo RedisTimeSeries está cargado (`MODULE LIST` muestra timeseries)
- Ejecución de comandos no deseada por parte de redis-server
#### Método de mitigación (sin actualizar)
**Opción 1 — Bloquear RESTORE mediante ACL:** (igual que CVE-2026-25243)```bash
redis-cli ACL SETUSER default -restore
redis-cli ACL SAVE
Método 2 — Eliminar el módulo RedisTimeSeries (si no es necesario):```bash redis-cli MODULE UNLOAD timeseries
Después, elimina la siguiente línea de `redis.conf`:```
loadmodule /path/to/redistimeseries.so
Método 3 — Solo actualizar el módulo (sin actualizar Redis):
Descargue la versión parcheada del módulo:
redis-cli MODULE UNLOAD timeseries redis-cli MODULE LOAD /path/to/new/redistimeseries.so
---
### CVE-2026-25589
| Atributo | Valor |
| ----------- | ------------------------------------------------------------------------------ |
| **Título** | Acceso a memoria no válido en RESTORE con el módulo RedisBloom |
| **CVSS 4.0**| **7.7 (ALTO)** |
| **CWE** | CWE-20 + CWE-122 + CWE-787 (Escritura fuera de límites) + CWE-190 (Desbordamiento de enteros) |
| **Vector** | `AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N` |
| **Condición**| Autenticado + permiso RESTORE + **módulo RedisBloom cargado** |
| **Alcance** | Redis OSS/CE + módulo RedisBloom |
#### Descripción técnica
La vulnerabilidad incluye múltiples sub-problemas en el módulo RedisBloom al procesar payloads RESTORE:
1. **Lectura/escritura fuera de límites** (Daniel Firer) — lectura/escritura fuera del rango de memoria asignada
2. **Desbordamiento de enteros, desbordamiento de búfer en heap y lectura/escritura fuera de límites** (Joseph Surin) — desbordamiento de enteros que conduce a desbordamiento de búfer en heap
Cuando el módulo RedisBloom está cargado, un atacante puede enviar un payload RESTORE diseñado especialmente para explotar los errores anteriores durante la deserialización de datos de filtros Bloom, filtros Cuckoo, Count-Min Sketch o Top-K.
#### Señales de detección
- Caída de Redis con stack trace relacionado con el módulo RedisBloom
- El módulo RedisBloom está cargado (`MODULE LIST` muestra bf/bloom)
- Datos en los filtros Bloom dañados o alterados de forma inusual
#### Métodos de mitigación (sin actualizar)
**Método 1 — Bloquear RESTORE mediante ACL:** (igual que CVE-2026-25243)```bash
redis-cli ACL SETUSER default -restore
redis-cli ACL SAVE
Opción 2 — Eliminar el módulo RedisBloom (si no es necesario):```bash redis-cli MODULE UNLOAD bf
Después, elimina la siguiente línea de `redis.conf`:```
loadmodule /path/to/redisbloom.so
Método 3 — Solo actualizar el módulo (sin actualizar Redis):
Descargue la versión parcheada del módulo:
---
### CVE-2026-23631
| Atributo | Valor |
| ------------- | --------------------------------------------------------------- |
| **Título** | Use-After-Free en Lua mediante sincronización maestro-réplica |
| **CVSS 4.0** | **6.1 (MEDIO)** |
| **CWE** | CWE-416 (Use After Free) |
| **Vector** | `AV:N/AC:H/AT:N/PR:L/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N` |
| **Condición** | Autenticado + **réplica** con `replica-read-only` = **deshabilitado** |
| **Alcance** | Todo Redis OSS/CE con scripting Lua, SOLO en réplicas |
| **Nombre en clave** | "DarkReplica" (Yoni Shiraz, Wiz Zeroday Cloud) |
#### Descripción técnica
Un atacante autenticado puede explotar el mecanismo de sincronización maestro-réplica para enviar scripts Lua especiales, desencadenando un use-after-free en el motor Lua de la réplica.
**Condición crítica:** El bug **solo afecta a las réplicas** configuradas con `replica-read-only disabled` (es decir, réplicas que pueden escribir). Esta NO es la configuración predeterminada: el valor por defecto de `replica-read-only` es `yes`.
Si la réplica está configurada en modo de solo lectura (predeterminado), la instancia **no se ve afectada**.
#### Señales de detección
- Caída de Redis en la réplica con un stack trace del motor Lua
- Configuración `replica-read-only` = `no` en la réplica
- Ejecución de comandos no identificados en la réplica
- Conexiones de red no autorizadas hacia la réplica
#### Métodos de mitigación (sin actualizar)
**Opción 1 — Habilitar replica-read-only (recomendado, es el valor predeterminado):**```bash
# Runtime
redis-cli CONFIG SET replica-read-only yes
# Trong redis.conf:
replica-read-only yes
Método 2 — Bloquear scripting de Lua mediante ACL:```bash redis-cli ACL SETUSER default -@scripting redis-cli ACL SETUSER default -eval -evalsha -script -function -fcall -fcall_ro redis-cli ACL SAVE
**Método 3 — Deshabilitar comandos Lua (requiere reiniciar Redis):**```bash
# Thêm vào redis.conf:
rename-command EVAL ""
rename-command EVALSHA ""
rename-command SCRIPT ""
rename-command FUNCTION ""
rename-command FCALL ""
rename-command FCALL_RO ""
--scan → diagnóstico, verifica todos los CVE--fix-... → aplica la medida de corrección para un CVE específico```
$ ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh
→ hiển thị banner + HELP + thoát### Requisitos del sistema
- **Sistema operativo:** Linux (Ubuntu, Debian, CentOS, RHEL, ...)
- **Herramienta:** `redis-cli` (normalmente incluida en el paquete `redis-tools` o `redis`)
- **Permisos:** Permiso de lectura/escritura del archivo `redis.conf` (para corregir)
- **Conexión:** Red hacia la instancia de Redis que se va a verificar
### Instalación de redis-cli (si aún no está disponible)```bash
# Ubuntu/Debian
sudo apt update && sudo apt install -y redis-tools
# CentOS/RHEL 7
sudo yum install -y redis
# CentOS/RHEL 8+/Fedora
sudo dnf install -y redis
# Hoặc từ source
wget https://download.redis.io/releases/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable && make redis-cli
sudo cp src/redis-cli /usr/local/bin/
chmod +x CVE-2026-25589-25588-25243-23631-23479-REDIS.sh
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --help
#### 2. Escaneo completo de CVE (diagnóstico)```bash
# Local Redis
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan
# Redis từ xa
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-H 192.168.1.100 -p 6379 -a "your_password"
# Với ACL user
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-H 10.0.0.50 -p 6380 -u admin -a "admin_password"
# Qua Unix socket
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-s /var/run/redis/redis-server.sock
# Kèm xuất báo cáo
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-o redis_cve_report_$(date +%Y%m%d).txt
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-cve-23479 ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-cve-25243 -H 10.0.0.1 -a mypassword ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-cve-25588 ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-cve-25589 ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-cve-23631 -c /etc/redis/redis.conf
#### 4. Corrección rápida por grupo (recomendado)```bash
# Chan RESTORE → bao ve 3/5 CVE (25243 + 25588 + 25589)
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-restore
# Chan blocking commands → bao ve CVE-2026-23479
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-blocking
# Chan Lua + bat replica-read-only → bao ve CVE-2026-23631
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-lua
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-all
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-all
-c /etc/redis/redis.conf
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-all --no-backup
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-all
-H 10.0.0.1 -p 6379 -a mypassword
### Tabla de parámetros completa
#### Parámetros de acción (ACTION) — obligatorios
| Parámetro | Función | Número de CVE protegidos |
| ---------------- | ------------------------------------------- | ---------------------------- |
| *(sin parámetro)*| Muestra las instrucciones de uso | — |
| `--scan` | Escaneo de diagnóstico de los 5 CVE | — |
| `--fix-all` | Corrige todos los CVE | **5/5** |
| `--fix-restore` | **[Rápido]** Solo bloquea el comando RESTORE| **3/5** (25243, 25588, 25589)|
| `--fix-blocking` | **[Rápido]** Solo bloquea comandos bloqueantes | **1/5** (23479) |
| `--fix-lua` | **[Rápido]** Bloquea Lua + activa replica-read-only | **1/5** (23631) |
| `--fix-cve-23479`| Corrige CVE-2026-23479 | 1/5 |
| `--fix-cve-25243`| Corrige CVE-2026-25243 | 1/5 |
| `--fix-cve-25588`| Corrige CVE-2026-25588 | 1/5 |
| `--fix-cve-25589`| Corrige CVE-2026-25589 | 1/5 |
| `--fix-cve-23631`| Corrige CVE-2026-23631 | 1/5 |
#### Parámetros de conexión
| Parámetro | Descripción | Valor predeterminado |
| -------------------- | ------------------------ | -------------------- |
| `-H, --host HOST` | Dirección del host Redis | `127.0.0.1` |
| `-p, --port PORT` | Puerto de Redis | `6379` |
| `-a, --pass PASS` | Contraseña de Redis | *(vacío)* |
| `-u, --user USER` | Nombre de usuario ACL | `default` |
| `-s, --socket PATH` | Ruta del socket Unix | *(vacío)* |
#### Parámetros adicionales
| Parámetro | Descripción | Valor predeterminado |
| -------------------- | ----------------------------------------- | -------------------------- |
| `-h, --help` | Muestra la ayuda | — |
| `-c, --config FILE` | Ruta de redis.conf | `/etc/redis/redis.conf` |
| `-o, --output FILE` | Escribe el informe en un archivo (solo con `--scan`) | *(vacío)* |
| `--redis-cli PATH` | Ruta del binario redis-cli | `redis-cli` (desde PATH) |
| `--no-backup` | No hacer copia de seguridad de la config antes de modificar | `false` |
### Códigos de salida (Exit Codes)
| Código | Significado |
| ------ | ------------------------------------------------------ |
| `0` | Éxito — no se detectaron CVE o la corrección finalizó |
| `1` | Error: no se encontró redis-cli o no se pudo conectar |
| `2` | `--scan` detectó al menos 1 CVE — se requiere corrección |
### Resultado de salida al escanear (`--scan`)```
╔══════════════════════════════════════════════════════════════════════╗
║ REDIS CVE SCANNER & MITIGATION TOOL ║
╚══════════════════════════════════════════════════════════════════════╝
[*] THONG TIN REDIS INSTANCE
Host:Port : 127.0.0.1:6379
Version : 7.2.5
Mode : standalone
Role : master
Modules : timeseries bf
═══════════════════════════════════════════════════════════════════════
[1/5] CVE-2026-23479 - Use-after-free trong Unblock Client Flow
CVSS 7.7 (HIGH) | RCE
═══════════════════════════════════════════════════════════════════════
[✗] CO KHA NANG BI ANH HUONG - Redis 7.2.5 (can >= 7.2.14)
... (CVE 2-5 tuong tu)
╔══════════════════════════════════════════════════════════════════════╗
║ TOM TAT KET QUA ║
╚══════════════════════════════════════════════════════════════════════╝
[✗] CVE-2026-23479 - VULNERABLE
[✗] CVE-2026-25243 - VULNERABLE
[✗] CVE-2026-25588 - VULNERABLE
[✗] CVE-2026-25589 - VULNERABLE
[✓] CVE-2026-23631 - OK
Ket qua: 1 PASS / 4 VULNERABLE
═══════════════════════════════════════════════════════════════════════
[!] Phat hien 4 CVE. Su dung cac tuy chon --fix-... de khac phuc.
VD: ./script.sh --fix-restore # Chan RESTORE (3 CVE)
VD: ./script.sh --fix-blocking # Chan blocking (1 CVE)
VD: ./script.sh --fix-lua # Chan Lua (1 CVE)
VD: ./script.sh --fix-all # Khac phuc toan bo
═══════════════════════════════════════════════════════════════════════
--fix-restore)```╔══════════════════════════════════════════════════════════════════════╗ ║ REDIS CVE SCANNER & MITIGATION TOOL ║ ╚══════════════════════════════════════════════════════════════════════╝
[*] THONG TIN REDIS INSTANCE Host:Port : 127.0.0.1:6379 Version : 7.2.5 ...
╔══════════════════════════════════════════════════════════════════════╗ ║ FIX NHANH: Chan RESTORE (CVE-2026-25243 + 25588 + 25589) ║ ╚══════════════════════════════════════════════════════════════════════╝ Bao ve 3/5 CVE chi voi 1 lenh chan RESTORE
[+] Da backup redis.conf toi: /etc/redis/redis.conf.cve-backup-20260508_120000 [*] Chan RESTORE qua ACL (khong can restart) => ACL SETUSER default -restore ... OK => ACL SAVE ... OK
[*] rename-command RESTORE "" (can restart) => Vo hieu hoa: rename-command RESTORE "" [!] CAN RESTART REDIS de rename-command co hieu luc
[✓] Da chan RESTORE. Cac CVE duoc bao ve:
---
## MÉTODOS GENERALES DE MITIGACIÓN
### Método 1: ACL (Redis >= 6.0) — RECOMENDADO
Este es el método **más seguro y flexible**, no requiere reiniciar Redis.```bash
# Tao ACL user an toan cho ung dung
redis-cli ACL SETUSER app_user on >StrongPassword123 ~* \
+@read \ # Quyen doc du lieu
+@write \ # Quyen ghi du lieu
-@dangerous \ # CHAN tat ca lenh nguy hiem (gồm RESTORE)
-@admin \ # CHAN lenh quan tri
-@scripting \ # CHAN Lua scripting
-@blocking \ # CHAN blocking commands
-@keyspace \ # CHAN keyspace notifications
-@pubsub # CHAN pub/sub (neu khong dung)
# Vo hieu hoa default user
redis-cli ACL SETUSER default off
# Luu ACL vinh vien
redis-cli ACL SAVE
Agrega las siguientes líneas a redis.conf:```conf
rename-command RESTORE ""
rename-command BLPOP "" rename-command BRPOP "" rename-command BRPOPLPUSH "" rename-command BLMOVE "" rename-command BLMPOP "" rename-command BZPOPMIN "" rename-command BZPOPMAX "" rename-command BZMPOP "" rename-command XREAD "" rename-command XREADGROUP ""
rename-command EVAL "" rename-command EVALSHA "" rename-command SCRIPT "" rename-command FUNCTION "" rename-command FCALL "" rename-command FCALL_RO ""
Después reinicia Redis:```bash
sudo systemctl restart redis-server
# hoặc
sudo service redis-server restart
protected-mode yes bind 127.0.0.1 192.168.1.10 # Chi lang nghe IP tin cay
iptables -A INPUT -p tcp --dport 6379 -s 127.0.0.1 -j ACCEPT iptables -A INPUT -p tcp --dport 6379 -s 10.0.0.0/8 -j ACCEPT iptables -A INPUT -p tcp --dport 6379 -j DROP
iptables-save > /etc/iptables/rules.v4
### Método 4: Ejecutar Redis con privilegios mínimos```bash
# Tao user redis khong co shell
sudo useradd -r -s /bin/false redis
# Chown thu muc Redis
sudo chown -R redis:redis /var/lib/redis
sudo chown -R redis:redis /etc/redis
# Chay Redis duoi user redis
sudo -u redis redis-server /etc/redis/redis.conf
redis-cli MODULE LIST
redis-cli MODULE UNLOAD timeseries # CVE-2026-25588 redis-cli MODULE UNLOAD bf # CVE-2026-25589
---
## EVALUACIÓN DE RIESGOS — SISTEMA REDIS INTERNO / SENTINEL
Esta sección está destinada a clústeres de **Redis Sentinel** o Redis independiente que se ejecutan en una red interna, protegidos por firewall (Fortinet, iptables, etc.) y **sin conexión directa a Internet**.
### Resumen
| Nivel de protección existente | ¿Mitiga el riesgo? | ¿Se necesita una actualización? |
| --------------------------------------- | -------------------------------------------------------------- | ------------------------------------------------------ |
| Sin acceso a Internet | **Sí** — elimina a los atacantes externos | No es urgente |
| Fortinet Firewall (con IPS/DPI) | **Sí** — filtra IP de origen, el IPS puede detectar payloads anómalos | No es urgente |
| iptables (IP de origen limitadas) | **Sí** — solo las IP permitidas pueden conectarse al puerto de Redis | No es urgente |
| **Combinación de las 3 medidas anteriores** | **Reduce la probabilidad de explotación a un nivel muy bajo** | **No es urgente, pero se debe tener un plan** |
### Punto clave: ¿Por qué el firewall no es suficiente?
Las 5 CVE tienen algo en común: el atacante debe **ya estar autenticado** con Redis (PR:L — Privilegios Requeridos: Bajo en el vector CVSS). El firewall bloquea conexiones desde IP no permitidas, pero **no protege** contra las siguientes amenazas:
| Amenaza | Probabilidad de ocurrencia | Consecuencias si se explota |
| ------------------------------------------------------------------------------------------------------------------- | ------------------------------- | --------------------------------------------------------------------------------- |
| **Empleado interno malintencionado** — con acceso a la red interna + conocimiento de la contraseña de Redis | Baja pero no se puede descartar | **RCE** en el servidor Redis, escalada de privilegios, robo de datos |
| **Máquina interna comprometida (Movimiento Lateral)** — el atacante compromete cualquier máquina de la red y desde allí ataca Redis | Media | Todos los datos de Redis son robados/modificados/eliminados; el atacante puede instalar una puerta trasera |
| **Error de configuración del firewall** — apertura accidental del puerto de Redis hacia el exterior por un cambio de reglas incorrecto | Baja | Equivalente a exponerlo directamente a Internet |
| **Cadena de suministro / Terceros** — socios o proveedores con conexión VPN a la red interna | Baja | RCE, exfiltración de datos |
| **Vulnerabilidad en el propio firewall/red** — el atacante evade el firewall a través de otra vulnerabilidad | Muy baja | Todo el sistema interno se ve afectado |
### Análisis de riesgo cuantitativo```
Rủi ro = Xác suất khai thác × Hậu quả
Với firewall + air-gap:
= (RẤT THẤP: 0.5% - 2%/năm) × (NGHIÊM TRỌNG: RCE toàn hệ thống, mất toàn bộ dữ liệu)
= RỦI RO TRUNG BÌNH — vẫn đáng quan tâm
Cụm Redis Sentinel có thêm rủi ro riêng:
| Vector tấn công Sentinel | Mô tả | CVE liên quan |
|---|---|---|
| Chiếm quyền Sentinel — attacker chiếm Sentinel node, từ đó failover sang replica độc hại | Sentinel giao tiếp qua port riêng (thường 26379), nếu không được bảo vệ riêng | CVE-2026-23631 (nếu replica có replica-read-only no) |
| Replica promotion — replica bị chiếm được promote thành master | Dữ liệu toàn cụm bị thay đổi | Toàn bộ CVE RESTORE (25243, 25588, 25589) |
| Đồng bộ master-replica — attacker chặn luồng sync | Dữ liệu bị đánh cắp trong quá trình sync | CVE-2026-23631 |
| Ưu tiên | Hành động | Thời gian thực hiện | Cần downtime? |
|---|---|---|---|
| P0 — Ngay | Chạy script kiểm tra tất cả node (master + replica + sentinel): ./CVE-...sh -H <ip> -p <port> -a <pass> | 2-5 phút / node | Không |
| P0 — Ngay | Kiểm tra replica-read-only yes trên tất cả replica: redis-cli CONFIG GET replica-read-only | 1 phút / node | Không |
| P1 — Trong tuần | Chặn RESTORE qua ACL (không cần restart): redis-cli ACL SETUSER default -restore; redis-cli ACL SAVE | 2 phút / node | Không |
| P1 — Trong tuần | Chặn @blocking commands qua ACL (CVE-2026-23479) | 2 phút / node | Không |
| P1 — Trong tuần | Chặn @scripting commands qua ACL nếu không dùng Lua (CVE-2026-23631) | 2 phút / node | Không |
| P2 — Maintenance window tới | Thêm rename-command RESTORE "", rename-command EVAL "", ... vào redis.conf | 10 phút (có restart) | Có (restart Redis) |
| P2 — Maintenance window tới | Nâng cấp Redis lên phiên bản đã vá (6.2.22, 7.2.14, 7.4.9, 8.2.6, 8.4.3, 8.6.3) | 30-60 phút / cụm | Có (restart toàn cụm) |
redis-cli -h <node_ip> -p 6379 -a ACL SETUSER app_user on >StrongPass123 ~*
+@read +@write
-@dangerous -@admin -@scripting -@blocking
-restore -debug
redis-cli -h <node_ip> -p 6379 -a ACL SETUSER default off
redis-cli -h <node_ip> -p 6379 -a ACL SAVE
redis-cli -h <node_ip> -p 6379 -a --user app_user --pass StrongPass123 PING
Để cài đặt công cụ, hãy làm theo các bước sau:
git clone https://github.com/example/security-tool.git
cd security-tool
pip install -r requirements.txt
python setup.py install
Sau khi cài đặt, bạn cần cấu hình công cụ bằng cách chỉnh sửa tệp config.yaml:
# Cấu hình mạng
network:
interface: eth0
capture_buffer_size: 65536
# Cấu hình phát hiện
detection:
threshold: 0.85
model_path: /path/to/model.pkl
# Cấu hình cảnh báo
alerts:
email:
enabled: true
smtp_server: smtp.example.com
recipients:
- [email protected]
Để bắt đầu giám sát, hãy chạy lệnh sau:
python main.py --config config.yaml
Bạn có thể sử dụng các tùy chọn dòng lệnh sau:
--config: Đường dẫn đến tệp cấu hình (mặc định: config.yaml)--verbose: Bật đầu ra chi tiết--daemon: Chạy ở chế độ nềnChúng tôi hoan nghênh các đóng góp từ cộng đồng! Vui lòng đọc HƯỚNG DẪN ĐÓNG GÓP trước khi gửi yêu cầu kéo.
Dự án này được cấp phép theo Giấy phép MIT - xem tệp LICENSE để biết chi tiết.
# ============================================
# Chay tren TUNG node Sentinel (port 26379)
# ============================================
# Sentinel thuong khong can RESTORE/EVAL — chan toan bo lenh nguy hiem
redis-cli -h <sentinel_ip> -p 26379 -a <sentinel_pass> ACL SETUSER default \
-@dangerous -@admin -@scripting -@blocking -restore
redis-cli -h <sentinel_ip> -p 26379 -a <sentinel_pass> ACL SAVE
```
### Flujo de decisión: ¿Es necesario actualizar de inmediato?```
Hệ thống Redis của bạn có public-facing không?
├── CÓ → NÂNG CẤP NGAY hoặc áp dụng workaround TRONG 24H
└── KHÔNG (nội bộ / air-gapped)
├── Có dùng Lua scripting (EVAL/EVALSHA)?
│ ├── CÓ → CVE-2026-23631: Kiểm tra replica-read-only, chặn @scripting qua ACL
│ └── KHÔNG → Rủi ro thấp hơn
├── Có dùng RedisTimeSeries hoặc RedisBloom module?
│ ├── CÓ → CVE-2026-25588/25589: Chặn RESTORE qua ACL, nâng cấp module
│ └── KHÔNG → Không bị ảnh hưởng bởi 25588/25589
├── Có dùng blocking commands (BLPOP, XREAD, ...)?
│ ├── CÓ → CVE-2026-23479: Chặn @blocking qua ACL hoặc rename-command
│ └── KHÔNG → Chặn @blocking để an toàn (không ảnh hưởng)
└── KẾT LUẬN:
├── Áp dụng ACL workaround NGAY TRONG TUẦN (không downtime)
└── Lên kế hoạch nâng cấp TRONG MAINTENANCE WINDOW TIẾP THEO
```
### Conclusión
> **Firewall + aislamiento de red reducen la probabilidad de explotación a un nivel muy bajo, pero la consecuencia si se explota sigue siendo RCE en todo el sistema.** Con un costo de mitigación casi nulo (agregar unas líneas de ACL sin necesidad de reiniciar), aplicar la medida de protección es una decisión favorable en términos de gestión de riesgos. **No hay necesidad de entrar en pánico y actualizar de inmediato**, pero **se recomienda aplicar el workaround de ACL esta semana** y programar la actualización en la próxima ventana de mantenimiento.
---
## REFERENCIA DE ACL
### Grupos de comandos (command categories) importantes
| Grupo | Descripción | Impacto CVE |
| ------------- | ------------------------------------------------------------------------------------ | -------------------------- |
| `@dangerous` | Comandos peligrosos (incluye RESTORE, FLUSHDB, FLUSHALL, KEYS, SHUTDOWN, DEBUG, CONFIG) | CVE-2026-25243, 25588, 25589 |
| `@blocking` | Comandos de bloqueo (BLPOP, BRPOP, BZPOPMIN, XREAD, WAIT, ...) | CVE-2026-23479 |
| `@scripting` | Scripting Lua (EVAL, EVALSHA, SCRIPT, FUNCTION, FCALL) | CVE-2026-23631 |
| `@admin` | Comandos de administración (CONFIG, ACL, CLIENT, CLUSTER, MONITOR, SHUTDOWN, ...) | Protección general |
| `@keyspace` | Comandos relacionados con keyspace (KEYS, SCAN, FLUSHDB, FLUSHALL, ...) | Protección general |
| `@read` | Comandos de lectura de datos (GET, HGET, LRANGE, SMEMBERS, ZRANGE, ...) | Seguro |
| `@write` | Comandos de escritura de datos (SET, HSET, LPUSH, SADD, ZADD, ...) | Seguro |
### Ejemplo de configuración ACL completa```bash
# 1. Tao admin user (day du quyen)
redis-cli ACL SETUSER admin on >AdminPass123 ~* +@all
# 2. Tao app user (quyen gioi han)
redis-cli ACL SETUSER app on >AppPass123 ~* \
+@read \
+@write \
-@dangerous \
-@admin \
-@scripting \
-@blocking \
-restore \
-debug
# 3. Tao readonly user (chi doc)
redis-cli ACL SETUSER reader on >ReaderPass123 ~* \
+@read \
-@dangerous \
-@admin \
-@scripting
# 4. Vo hieu hoa default user
redis-cli ACL SETUSER default off
# 5. Luu ACL
redis-cli ACL SAVE
# 6. Kiem tra ACL
redis-cli ACL LIST
```
### Verificación efectiva de ACL```bash
# Liet ke tat ca ACL rules
redis-cli ACL LIST
# Kiem tra quyen cua mot user
redis-cli ACL GETUSER app
# Kiem tra user hien tai
redis-cli ACL WHOAMI
# Xem log vi pham ACL
redis-cli ACL LOG
```
---
## PROCESO DE PRUEBAS PERIÓDICAS
### 1. Prueba única (ad-hoc)```bash
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-H <redis_host> -p <port> -a <password> \
-o report_$(date +%Y%m%d_%H%M%S).txt
```
### 2. Verificación masiva de múltiples instancias de Redis
Cree el archivo `redis_hosts.txt`:```
# Format: host:port:password:user
10.0.0.1:6379:pass1:default
10.0.0.2:6379:pass2:default
10.0.0.3:6380:pass3:admin
```
Script de verificación masiva:```bash
#!/bin/bash
# File: batch_check.sh
BATCH_RESULT="batch_result_$(date +%Y%m%d_%H%M%S).txt"
while IFS=':' read -r host port pass user; do
[[ "$host" =~ ^#.* ]] && continue # Bo qua comment
[[ -z "$host" ]] && continue # Bo qua dong trong
echo "============================================" | tee -a "$BATCH_RESULT"
echo "Kiem tra: $host:$port" | tee -a "$BATCH_RESULT"
echo "============================================" | tee -a "$BATCH_RESULT"
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-H "$host" -p "${port:-6379}" \
-a "${pass:-}" -u "${user:-default}" \
2>&1 | tee -a "$BATCH_RESULT"
echo "" | tee -a "$BATCH_RESULT"
done < redis_hosts.txt
echo "Bao cao tong hop: $BATCH_RESULT"
```
### 3. Integración en cron (verificación diaria)```bash
# Them vao crontab (chay hang ngay luc 7:00 AM)
0 7 * * * /opt/scripts/CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-H 127.0.0.1 -p 6379 -a mypassword \
-o /var/log/redis/cve_report_$(date +\%Y\%m\%d).txt \
> /dev/null 2>&1
```
### 4. Integración en el pipeline de CI/CD```yaml
# GitLab CI example
redis-security-scan:
stage: security
image: redis:7-alpine
script:
- chmod +x CVE-2026-25589-25588-25243-23631-23479-REDIS.sh
- ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-H $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS \
-o cve_report.txt
artifacts:
paths:
- cve_report.txt
when: always
allow_failure: true
```
---
## PREGUNTAS FRECUENTES (FAQ)
### P: ¿Necesito reiniciar Redis después de aplicar `--fix-...`?
**R:** Sí, para los cambios de `rename-command` — solo surten efecto después de reiniciar Redis. Los cambios mediante `CONFIG SET` (como `protected-mode`, `replica-read-only`) surten efecto de inmediato. Los cambios mediante `ACL SETUSER` + `ACL SAVE` surten efecto de inmediato, **sin necesidad de reiniciar**. Si solo se usa ACL (`--fix-restore`, `--fix-blocking`, `--fix-lua`), no necesita reiniciar. El script siempre aplica simultáneamente tanto ACL (en tiempo de ejecución) como rename-command (requiere reinicio) para una protección en múltiples capas.
### P: ¿Bloquear RESTORE afecta el funcionamiento normal?
**R:** El comando `RESTORE` normalmente solo se usa en los siguientes casos:
- Recuperación de datos desde una copia de seguridad
- Migración de datos entre instancias
- Sincronización de datos personalizada
Si su aplicación no usa RESTORE, bloquear este comando es seguro. Si lo usa, cree un usuario ACL separado con permiso de RESTORE y úselo solo con fines administrativos.
### P: Estoy usando Redis < 6.0, ACL no está disponible. ¿Qué hago?
**R:** Con Redis < 6.0, solo puede usar `rename-command` para deshabilitar comandos. Los pasos:
1. Agregue `rename-command RESTORE ""` a redis.conf
2. Agregue los comandos `rename-command` para los comandos de bloqueo
3. Active `protected-mode yes`
4. Configure `requirepass` con una contraseña segura
5. Limite las conexiones mediante el firewall
6. Reinicie Redis
### P: ¿Cómo saber si los módulos RedisTimeSeries/RedisBloom están cargados?
**R:** Ejecute el comando:```bash
redis-cli MODULE LIST
```
La salida mostrará la lista de módulos cargados con su versión. Si no ves `timeseries` o `bf`, el módulo no está cargado.
### P: ¿`--fix-all` / `--fix-restore` / `--fix-...` son seguros para producción?
**R:** Los comandos fix realizan cambios seguros:
- Se hace backup de redis.conf antes de modificar (salvo que se use `--no-backup`)
- **ACL** (`-restore`, `-@blocking`, `-@scripting`): tienen efecto inmediato, sin downtime, fáciles de revertir
- **rename-command**: requiere reiniciar Redis para que tenga efecto
- **CONFIG SET**: en runtime, se pierde al reiniciar si no se ha escrito en redis.conf
Recomendación: Para producción, prioriza usar `--fix-restore`, `--fix-blocking`, `--fix-lua` primero (solo ACL, sin necesidad de reiniciar). Luego programa una ventana de mantenimiento para reiniciar con `rename-command`.
### P: ¿Cómo deshacer (rollback) los cambios de `--fix-...`?
**R:**
1. Si se hizo backup: copia el archivo de backup sobre redis.conf y luego reinicia Redis
2. Si se usó `CONFIG SET`: reiniciar Redis restaurará la configuración desde el archivo
3. Si se usó `ACL SETUSER`: usa `ACL SETUSER <user> +<cmd>` para restaurar los permisos
### P: ¿Debería actualizar Redis?
**R:** **Sí, si es posible.** Actualizar a una versión parcheada es la solución más definitiva. Este script está pensado para los casos en los que:
- No se puede actualizar de inmediato por restricciones de la aplicación
- Se necesita tiempo para probar la nueva versión
- Se necesita una medida de protección temporal mientras se espera la ventana de mantenimiento
### P: Redis corre internamente, sin acceso a Internet, con firewall de protección — ¿es necesario actualizar?
**R:** **No es necesario actualizar con urgencia**, pero **se recomienda aplicar el workaround y tener un plan de actualización** porque:
- El firewall solo reduce la **probabilidad** de ser atacado, no elimina por completo el riesgo
- Un atacante desde dentro de la red interna (empleado malintencionado, máquina comprometida, movimiento lateral) aún puede explotar la vulnerabilidad
- La consecuencia si se explota es **RCE en todo el sistema** — el nivel de gravedad más alto
- **El coste del workaround es muy bajo**: añadir ACL `-restore -@blocking -@scripting` toma 2 minutos, sin downtime
**Hoja de ruta recomendada:**
1. **Esta semana:** Aplicar el workaround de ACL (sin downtime)
2. **Próxima ventana de mantenimiento:** Actualizar Redis + añadir `rename-command`
Ver detalles en [Evaluación de riesgos — Sistema Redis interno / Sentinel](#evaluación-de-riesgos--sistema-redis-interno--sentinel).
---
## REFERENCIAS
- [Aviso de seguridad oficial de Redis](https://redis.io/blog/security-advisory-cve202623479-cve202625243-cve-2026-25588-cve202625589-cve-2026-23631/)
- [GitHub Advisory — CVE-2026-25243 (RESTORE RCE)](https://github.com/redis/redis/security/advisories/GHSA-c8h9-259x-jff4)
- [GitHub Advisory — CVE-2026-23631 (Lua UAF)](https://github.com/redis/redis/security/advisories/GHSA-8ghh-qpmp-7826)
- [Documentación de ACL de Redis](https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/)
- [Documentación de rename-command de Redis](https://redis.io/docs/latest/operate/oss_and_stack/management/security/#disable-specific-commands)
- [NVD — CVE-2026-25243](https://nvd.nist.gov/vuln/detail/CVE-2026-25243)
- [NVD — CVE-2026-25588](https://nvd.nist.gov/vuln/detail/CVE-2026-25588)
- [OpenCVE — CVE-2026-23479](https://app.opencve.io/cve/CVE-2026-23479)
- [Tenable — CVE-2026-23631](https://www.tenable.com/cve/CVE-2026-23631)
---
> **Aviso legal:** Este documento se ha elaborado basándose en información pública del aviso de seguridad de Redis y fuentes de NVD. El usuario es responsable de verificar y confirmar las medidas de mitigación adecuadas para su entorno antes de aplicarlas.