
Script de diagnóstico e remediação para cinco CVEs do Redis, fornecendo varredura, mitigação baseada em ACL e orientação de endurecimento de configuração para vulnerabilidades de RCE autenticado.
Data de publicação: 2026-05-08 Autor: TonyCao ([email protected]) Fonte: Redis Security Advisory
Em 05/05/2026, a Redis Ltd. publicou um security advisory sobre 5 vulnerabilidades de segurança graves que afetam todas as versões do Redis OSS/CE. Todas as CVEs podem levar a Remote Code Execution (RCE) se forem exploradas com sucesso.
| # | Código CVE | CVSS | Nível | Tipo de falha | Condição de exploração |
|---|---|---|---|---|---|
| 1 | CVE-2026-23479 | 7.7 | ALTO | Use-After-Free | Autenticado, com permissão para executar comandos de bloqueio |
| 2 | CVE-2026-25243 | 7.7 | ALTO | Invalid Memory Access | Autenticado, com permissão para executar RESTORE |
| 3 | CVE-2026-25588 | 7.7 | ALTO | Invalid Memory Access | Autenticado, com permissão de RESTORE + módulo RedisTimeSeries |
| 4 | CVE-2026-25589 | 7.7 | ALTO | Invalid Memory Access | Autenticado, com permissão de RESTORE + módulo RedisBloom |
| 5 | CVE-2026-23631 | 6.1 | MÉDIO | Use-After-Free | Autenticado, réplica com replica-read-only = desabilitado |
Ponto em comum: Todas as CVEs exigem que o atacante esteja autenticado na instância Redis. A CVE-2026-23631 afeta apenas réplicas com a configuração
replica-read-only disabled.
| Linha de versão | Versão corrigida (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 | Versão mínima |
|---|---|
| RedisTimeSeries | 1.12.14 / 1.10.24 / 1.8.23 |
| RedisBloom | 2.8.20 / 2.6.28 / 2.4.23 |
| Versão | Patch |
|---|---|
| 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 as implantações do Redis Cloud foram automaticamente corrigidas no momento da publicação do advisory.
| Atributo | Valor |
|---|---|
| Título | Use-After-Free no Unblock Client Flow |
| CVSS 4.0 | 7.7 (ALTO) |
| CWE | CWE-416 (Use After Free) |
| Vetor | AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| Condição | Atacante autenticado, com permissão para executar comandos de bloqueio |
| Escopo | Todos os Redis OSS/CE, Redis Software <= 8.0.6 |
Quando um cliente está bloqueado — por exemplo, aguardando em BLPOP — e é removido durante a reexecução do comando bloqueado, a função processCommandAndResetClient pode retornar um erro. O código atual não trata corretamente esse caso, resultando em um ponteiro que referencia memória já liberada (use-after-free). O atacante pode explorar o UAF para executar código remotamente (RCE).
unblock client, processCommandAndResetClientredis-server executa comandos não identificadosBLPOP, BRPOP, BRPOPLPUSH, BLMOVE, BLMPOP, BZPOPMIN, BZPOPMAX, BZMPOP, WAIT, WAITAOF, XREAD, XREADGROUP
#### Método de correção (sem atualização)
**Opção 1 — Bloquear via 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 — Desativar via rename-command (requer reiniciar o 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 — Ativar o protected-mode e limitar conexões:**```bash
redis-cli CONFIG SET protected-mode yes
# Trong redis.conf:
protected-mode yes
bind 127.0.0.1
| Atributo | Valor |
|---|---|
| Título | Acesso Inválido à Memória no Comando RESTORE |
| CVSS 4.0 | 7.7 (ALTO) |
| CWE | CWE-20 (Validação de Entrada Incorreta) + CWE-122 (Estouro de Buffer no Heap) |
| Vetor | AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| Condição | Atacante autenticado, com permissão para executar RESTORE |
| Escopo | Todos os Redis OSS/CE, Redis Software <= 8.0.6 |
A vulnerabilidade envolve 2 subproblemas:
Um atacante autenticado envia um payload RESTORE projetado especificamente para explorar os erros acima, o que pode levar a RCE no contexto do processo redis-server.
Método 1 — Bloquear RESTORE via ACL (recomendado):```bash
redis-cli ACL SETUSER default -restore
redis-cli ACL SETUSER default -@dangerous
redis-cli ACL SAVE
**Método 2 — Desativar RESTORE (requer reiniciar o Redis):**```bash
# Thêm vào redis.conf:
rename-command RESTORE ""
Método 3 — Criar um ACL de usuário separado para o aplicativo:```bash
redis-cli ACL SETUSER app_user on >StrongPass123 ~*
+@read +@write
-@dangerous
-@admin
-@scripting
-@blocking
-restore
-debug
redis-cli ACL SAVE
---
### CVE-2026-25588
| Propriedade | Valor |
| -------------- | ----------------------------------------------------------------- |
| **Título** | Acesso Inválido à Memória em RESTORE com o Módulo RedisTimeSeries |
| **CVSS 4.0** | **7.7 (ALTO)** |
| **CWE** | CWE-20 + CWE-122 |
| **Vetor** | `AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N` |
| **Condição** | Autenticado + permissão RESTORE + **módulo RedisTimeSeries carregado** |
| **Escopo** | Redis OSS/CE + módulo RedisTimeSeries |
#### Descrição técnica
Quando o comando `RESTORE` é usado em uma instância com o **módulo RedisTimeSeries** carregado, um payload serializado especialmente criado pode acionar acesso inválido à memória durante o processamento de dados de séries temporais. A vulnerabilidade está na forma como o módulo RedisTimeSeries desserializa dados do payload RESTORE.
#### Sinais de identificação
- Crash do Redis com stack trace relacionado ao módulo RedisTimeSeries
- Módulo RedisTimeSeries carregado (`MODULE LIST` exibe timeseries)
- Execução de comandos não intencionais pelo redis-server
#### Método de mitigação (sem atualização)
**Método 1 — Bloquear RESTORE via ACL:** (igual ao CVE-2026-25243)```bash
redis-cli ACL SETUSER default -restore
redis-cli ACL SAVE
Método 2 — Remover o módulo RedisTimeSeries (se não for necessário):```bash redis-cli MODULE UNLOAD timeseries
Depois, remova a seguinte linha do `redis.conf`:```
loadmodule /path/to/redistimeseries.so
Cách 3 — Apenas atualizar o módulo (sem atualizar o Redis):
Baixe a versão corrigida do módulo:
redis-cli MODULE UNLOAD timeseries redis-cli MODULE LOAD /path/to/new/redistimeseries.so
---
### CVE-2026-25589
| Atributo | Valor |
| ----------- | ---------------------------------------------------------------------------- |
| **Título** | Acesso Inválido à Memória em RESTORE com o Módulo RedisBloom |
| **CVSS 4.0**| **7.7 (ALTO)** |
| **CWE** | CWE-20 + CWE-122 + CWE-787 (Escrita Fora dos Limites) + CWE-190 (Estouro de Inteiro) |
| **Vetor** | `AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N` |
| **Condição**| Autenticado + permissão RESTORE + **módulo RedisBloom carregado** |
| **Escopo** | Redis OSS/CE + módulo RedisBloom |
#### Descrição Técnica
A vulnerabilidade abrange vários sub-problemas no módulo RedisBloom ao processar payloads RESTORE:
1. **Leitura/escrita fora dos limites** (Daniel Firer) — leitura/escrita fora da memória alocada
2. **Estouro de inteiro, estouro de buffer no heap e leitura/escrita fora dos limites** (Joseph Surin) — estouro de inteiro que leva a estouro de buffer no heap
Quando o módulo RedisBloom é carregado, um atacante pode enviar um payload RESTORE especialmente elaborado para explorar os erros acima durante a desserialização de dados de Bloom filter, Cuckoo filter, Count-Min Sketch ou Top-K.
#### Sinais de Detecção
- Crash do Redis com stack trace relacionado ao módulo RedisBloom
- Módulo RedisBloom carregado (`MODULE LIST` exibe bf/bloom)
- Dados nos Bloom filters corrompidos ou alterados de forma anormal
#### Métodos de Mitigação (sem atualização)
**Método 1 — Bloquear RESTORE via ACL:** (igual ao CVE-2026-25243)```bash
redis-cli ACL SETUSER default -restore
redis-cli ACL SAVE
Método 2 — Remover o módulo RedisBloom (se não for necessário):```bash redis-cli MODULE UNLOAD bf
Depois, remova a seguinte linha do `redis.conf`:```
loadmodule /path/to/redisbloom.so
Cách 3 — Chỉ nâng cấp module (không nâng cấp Redis):
Tải phiên bản module đã vá:
---
### CVE-2026-23631
| Atributo | Valor |
| ------------- | --------------------------------------------------------------- |
| **Título** | Lua Use-After-Free via Sincronização Master-Replica |
| **CVSS 4.0** | **6.1 (MÉDIO)** |
| **CWE** | CWE-416 (Use After Free) |
| **Vetor** | `AV:N/AC:H/AT:N/PR:L/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N` |
| **Condição** | Autenticado + **replica** com `replica-read-only` = **desabilitado** |
| **Escopo** | Todos os Redis OSS/CE com scripting Lua, SOMENTE na replica |
| **Nome de código** | "DarkReplica" (Yoni Shiraz, Wiz Zeroday Cloud) |
#### Descrição técnica
Um atacante autenticado pode explorar o mecanismo de sincronização master-replica para enviar scripts Lua especiais, acionando um use-after-free no motor Lua na replica.
**Condição crítica:** O bug **afeta apenas a replica** configurada com `replica-read-only disabled` (ou seja, a replica pode gravar). Esta NÃO é a configuração padrão — o padrão de `replica-read-only` = `yes`.
Se a replica estiver configurada em modo somente leitura (padrão), a instância **não é afetada**.
#### Sinais de identificação
- Crash do Redis na replica com stack trace do motor Lua
- Configuração `replica-read-only` = `no` na replica
- Execução de comandos não autorizados na replica
- Conexões de rede não permitidas à replica
#### Métodos de mitigação (sem atualização)
**Método 1 — Ativar replica-read-only (recomendado, este é o padrão):**```bash
# Runtime
redis-cli CONFIG SET replica-read-only yes
# Trong redis.conf:
replica-read-only yes
Método 2 — Bloquear scripting Lua via 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 — Desativar comandos Lua (requer reiniciar o 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ção de todos os CVEs--fix-... → aplica a medida corretiva para o CVE específico```
$ ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh
→ hiển thị banner + HELP + thoát### Requisitos do sistema
- **Sistema operacional:** Linux (Ubuntu, Debian, CentOS, RHEL, ...)
- **Ferramenta:** `redis-cli` (geralmente incluída no pacote `redis-tools` ou `redis`)
- **Permissões:** Permissão de leitura/gravação do arquivo `redis.conf` (para correção)
- **Conexão:** Rede até a instância Redis a ser verificada
### Instalação do redis-cli (se ainda não estiver disponível)```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. Varredura de verificação completa de CVEs (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. Correção rápida em 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
### Tabela de parâmetros completa
#### Parâmetros de ação (ACTION) — obrigatórios
| Parâmetro | Função | Nº de CVEs protegidos |
| ----------------- | -------------------------------------------- | ------------------------------ |
| *(sem parâmetro)* | Exibe o guia de uso | — |
| `--scan` | Varredura de diagnóstico de todos os 5 CVEs | — |
| `--fix-all` | Corrige todos os CVEs | **5/5** |
| `--fix-restore` | **[Rápido]** Apenas bloqueia o comando RESTORE | **3/5** (25243, 25588, 25589) |
| `--fix-blocking` | **[Rápido]** Apenas bloqueia comandos de bloqueio | **1/5** (23479) |
| `--fix-lua` | **[Rápido]** Bloqueia Lua + ativa 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 conexão
| Parâmetro | Descrição | Padrão |
| --------------------- | ------------------------ | ------------ |
| `-H, --host HOST` | Endereço do host Redis | `127.0.0.1` |
| `-p, --port PORT` | Porta do Redis | `6379` |
| `-a, --pass PASS` | Senha do Redis | *(vazio)* |
| `-u, --user USER` | Nome de usuário ACL | `default` |
| `-s, --socket PATH` | Caminho do Unix socket | *(vazio)* |
#### Parâmetros adicionais
| Parâmetro | Descrição | Padrão |
| --------------------- | ------------------------------------------- | ------------------------ |
| `-h, --help` | Exibe a ajuda | — |
| `-c, --config FILE` | Caminho do redis.conf | `/etc/redis/redis.conf` |
| `-o, --output FILE` | Grava o relatório em arquivo (apenas com `--scan`) | *(vazio)* |
| `--redis-cli PATH` | Caminho do binário redis-cli | `redis-cli` (do PATH) |
| `--no-backup` | Não faz backup da config antes de alterar | `false` |
### Códigos de saída (Exit Codes)
| Código | Significado |
| ------ | -------------------------------------------------------- |
| `0` | Sucesso — nenhum CVE detectado ou correção concluída |
| `1` | Erro: redis-cli não encontrado ou não foi possível conectar |
| `2` | `--scan` detectou pelo menos 1 CVE — correção necessária |
### Saída da varredura (`--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 GERAIS DE MITIGAÇÃO
### Método 1: ACL (Redis >= 6.0) — RECOMENDADO
Este é o método **mais seguro e flexível**, sem necessidade de reiniciar o 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
Adicione as seguintes linhas ao 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 ""
Depois, reinicie o 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: Executar o Redis com privilégios 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
---
## AVALIAÇÃO DE RISCO — SISTEMA REDIS INTERNO / SENTINEL
Esta seção é destinada a clusters **Redis Sentinel** ou Redis standalone executados em rede interna, protegidos por firewall (Fortinet, iptables, etc.) e **sem conexão direta com a Internet**.
### Resumo
| Nível de proteção existente | Redução de risco? | Precisa de atualização? |
| ------------------------------------- | ------------------------------------------------------------- | ----------------------------------------------- |
| Sem acesso à Internet | **Sim** — elimina atacantes externos | Não é urgente |
| Fortinet Firewall (com IPS/DPI) | **Sim** — filtra IP de origem, IPS pode detectar payloads anômalos | Não é urgente |
| iptables (limitação de IP de origem) | **Sim** — apenas IPs autorizados podem conectar à porta Redis | Não é urgente |
| **Combinação das 3 medidas acima** | **Reduz a probabilidade de exploração a um nível muito baixo** | **Não é urgente, mas é recomendável ter um plano** |
### Ponto-chave: Por que o firewall não é suficiente?
Todas as 5 CVEs têm algo em comum: o atacante precisa **já estar autenticado** no Redis (PR:L — Privilégios Necessários: Baixo no vetor CVSS). O firewall bloqueia conexões de IPs não autorizados, mas **não protege** contra as seguintes ameaças:
| Ameaça | Probabilidade de ocorrência | Consequência se explorada |
| ----------------------------------------------------------------------------------------------------------------- | -------------------------------- | ------------------------------------------------------------------------------- |
| **Funcionário interno malicioso** — com acesso à rede interna + conhecimento da senha do Redis | Baixa, mas não pode ser descartada | **RCE** no servidor Redis, escalonamento de privilégios, roubo de dados |
| **Máquina interna comprometida (Movimento Lateral)** — atacante invade qualquer máquina da rede e, a partir dela, ataca o Redis | Média | Todos os dados do Redis são roubados/alterados/excluídos; o atacante pode instalar backdoor |
| **Erro de configuração do firewall** — abertura acidental da porta Redis para o exterior devido a alteração incorreta de regras | Baixa | Equivalente a exposição direta à Internet |
| **Supply Chain / Terceiros** — parceiros, fornecedores com conexão VPN à rede interna | Baixa | RCE, exfiltração de dados |
| **Vulnerabilidade no próprio firewall/rede** — atacante contorna o firewall por meio de outra vulnerabilidade | Muito baixa | Todo o sistema interno é afetado |
### Análise quantitativa de risco```
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
O cluster Redis Sentinel adiciona riscos próprios:
| Vetor de ataque Sentinel | Descrição | CVEs relacionadas |
|---|---|---|
| Comprometimento do Sentinel — atacante compromete o nó Sentinel e, a partir dele, faz failover para uma réplica maliciosa | O Sentinel se comunica por porta própria (geralmente 26379); se não for protegida separadamente | CVE-2026-23631 (se a réplica tiver replica-read-only no) |
| Promoção de réplica — réplica comprometida é promovida a master | Dados de todo o cluster são alterados | Todas as CVEs RESTORE (25243, 25588, 25589) |
| Sincronização master-réplica — atacante intercepta o fluxo de sync | Dados são roubados durante o processo de sync | CVE-2026-23631 |
| Prioridade | Ação | Tempo de execução | Requer downtime? |
|---|---|---|---|
| P0 — Imediato | Executar script de verificação em todos os nós (master + réplica + sentinel): ./CVE-...sh -H <ip> -p <port> -a <pass> | 2-5 min / nó | Não |
| P0 — Imediato | Verificar replica-read-only yes em todas as réplicas: redis-cli CONFIG GET replica-read-only | 1 min / nó | Não |
| P1 — Nesta semana | Bloquear RESTORE via ACL (sem reiniciar): redis-cli ACL SETUSER default -restore; redis-cli ACL SAVE | 2 min / nó | Não |
| P1 — Nesta semana | Bloquear comandos @blocking via ACL (CVE-2026-23479) | 2 min / nó | Não |
| P1 — Nesta semana | Bloquear comandos @scripting via ACL se não usar Lua (CVE-2026-23631) | 2 min / nó | Não |
| P2 — Próxima janela de manutenção | Adicionar rename-command RESTORE "", rename-command EVAL "", ... ao redis.conf | 10 min (com restart) | Sim (restart do Redis) |
| P2 — Próxima janela de manutenção | Atualizar o Redis para versão corrigida (6.2.22, 7.2.14, 7.4.9, 8.2.6, 8.4.3, 8.6.3) | 30-60 min / cluster | Sim (restart de todo o cluster) |
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
Tôi không thể dịch nội dung này vì không có văn bản nguồn nào được cung cấp trong phần INPUT. Vui lòng cung cấp nội dung Markdown cần dịch.```bash
# ============================================
# 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
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
### Conclusão
> **Firewall + isolamento de rede reduzem a probabilidade de exploração a um nível muito baixo, mas a consequência se for explorado ainda é RCE em todo o sistema.** Com um custo de mitigação quase zero (adicionar algumas linhas de ACL sem necessidade de restart), aplicar a medida de proteção é uma decisão vantajosa em termos de gestão de risco. **Não é necessário pânico com upgrade urgente**, mas **é recomendável aplicar o workaround de ACL ainda esta semana** e agendar o upgrade na próxima janela de manutenção.
---
## REFERÊNCIA DE ACL
### Grupos de comandos (command categories) importantes
| Grupo | Descrição | Impacto CVE |
| ------------- | ---------------------------------------------------------------------------------- | -------------------------- |
| `@dangerous` | Comandos perigosos (incluindo RESTORE, FLUSHDB, FLUSHALL, KEYS, SHUTDOWN, DEBUG, CONFIG) | CVE-2026-25243, 25588, 25589 |
| `@blocking` | Comandos de bloqueio (BLPOP, BRPOP, BZPOPMIN, XREAD, WAIT, ...) | CVE-2026-23479 |
| `@scripting` | Scripting Lua (EVAL, EVALSHA, SCRIPT, FUNCTION, FCALL) | CVE-2026-23631 |
| `@admin` | Comandos administrativos (CONFIG, ACL, CLIENT, CLUSTER, MONITOR, SHUTDOWN, ...) | Proteção geral |
| `@keyspace` | Comandos relacionados ao keyspace (KEYS, SCAN, FLUSHDB, FLUSHALL, ...) | Proteção geral |
| `@read` | Comandos de leitura de dados (GET, HGET, LRANGE, SMEMBERS, ZRANGE, ...) | Seguro |
| `@write` | Comandos de escrita de dados (SET, HSET, LPUSH, SADD, ZADD, ...) | Seguro |
### Exemplo de configuração 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
redis-cli ACL LIST
redis-cli ACL GETUSER app
redis-cli ACL WHOAMI
redis-cli ACL LOG
---
## PROCESSO DE TESTE PERIÓDICO
### 1. Teste único (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
Crie o arquivo redis_hosts.txt:```
10.0.0.1:6379:pass1:default 10.0.0.2:6379:pass2:default 10.0.0.3:6380:pass3:admin
Script de verificação em lote:```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"
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. Integração no 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
--fix-...?R: Sim, para alterações de rename-command — elas só têm efeito após reiniciar o Redis. Alterações via CONFIG SET (como protected-mode, replica-read-only) têm efeito imediato. Alterações via ACL SETUSER + ACL SAVE têm efeito imediato, sem necessidade de reiniciar. Se você usar apenas ACL (--fix-restore, --fix-blocking, --fix-lua), não precisa reiniciar. O script sempre aplica simultaneamente ACL (runtime) e rename-command (requer reinício) para proteção em várias camadas.
R: O comando RESTORE normalmente é usado apenas nos seguintes casos:
Se sua aplicação não usa RESTORE, bloquear esse comando é seguro. Se usar, crie um usuário ACL separado com permissão de RESTORE e use-o apenas para fins administrativos.
R: Com Redis < 6.0, você só pode usar rename-command para desabilitar comandos. Os passos:
rename-command RESTORE "" ao redis.confrename-command para comandos de bloqueioprotected-mode yesrequirepass com uma senha forteR: Execute o comando:```bash redis-cli MODULE LIST
A saída exibirá a lista de módulos carregados com a versão. Se `timeseries` ou `bf` não aparecerem, o módulo não está carregado.
### P: `--fix-all` / `--fix-restore` / `--fix-...` é seguro para produção?
**R:** Os comandos de correção realizam alterações seguras:
- Backup do redis.conf antes de modificar (exceto ao usar `--no-backup`)
- **ACL** (`-restore`, `-@blocking`, `-@scripting`): tem efeito imediato, sem downtime, fácil de reverter
- **rename-command**: requer reiniciar o Redis para ter efeito
- **CONFIG SET**: em tempo de execução, é perdido ao reiniciar se não for gravado no redis.conf
Recomendação: Para produção, priorize usar `--fix-restore`, `--fix-blocking`, `--fix-lua` primeiro (apenas ACL, sem necessidade de reiniciar). Depois, agende uma janela de manutenção para reiniciar com `rename-command`.
### P: Como reverter (rollback) as alterações de `--fix-...`?
**R:**
1. Se houver backup: copie o arquivo de backup sobrescrevendo o redis.conf e reinicie o Redis
2. Se usou `CONFIG SET`: reiniciar o Redis restaurará a configuração a partir do arquivo
3. Se usou `ACL SETUSER`: use `ACL SETUSER <user> +<cmd>` para restaurar as permissões
### P: Devo atualizar o Redis?
**R:** **Sim, se possível.** Atualizar para a versão corrigida é a solução mais definitiva. Este script é para os casos em que:
- Não é possível atualizar imediatamente devido a restrições da aplicação
- É necessário tempo para testar a nova versão
- É necessária uma medida de proteção temporária enquanto se aguarda a janela de manutenção
### P: O Redis roda internamente, sem acesso à Internet, com firewall protegendo — é necessário atualizar?
**R:** **Não é necessário atualizar com urgência**, mas **é recomendável aplicar o workaround e ter um plano de atualização** porque:
- O firewall apenas reduz a **probabilidade** de ataque, não elimina completamente o risco
- Um atacante de dentro da rede interna (funcionário mal-intencionado, máquina comprometida, movimento lateral) ainda pode explorar
- A consequência se for explorado é **RCE em todo o sistema** — o nível de gravidade mais alto
- **O custo do workaround é muito baixo**: adicionar ACL `-restore -@blocking -@scripting` leva 2 minutos, sem downtime
**Roteiro recomendado:**
1. **Esta semana:** Aplicar o workaround de ACL (sem downtime)
2. **Próxima janela de manutenção:** Atualizar o Redis + adicionar `rename-command`
Veja detalhes em [Avaliação de risco — Sistema Redis interno / Sentinel](#avaliação-de-risco--sistema-redis-interno--sentinel).
---
## REFERÊNCIAS
- [Advisory de Segurança oficial do 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)
- [Documentação de ACL do Redis](https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/)
- [Documentação de rename-command do 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 foi elaborado com base em informações públicas do advisory de segurança do Redis e fontes NVD. O usuário é responsável por verificar e confirmar as medidas de correção adequadas ao seu ambiente antes de aplicá-las.