Эксперты по кибербезопасности обнаружили три критические уязвимости в механизме выполнения Lua-скриптов популярной системы управления базами данных Redis версии 7.4.5. Уязвимости позволяют злоумышленникам выполнять произвольный код и повышать привилегии на атакуемых системах. Уже опубликовано доказательство концепции эксплуатации этих недостатков безопасности.
Детали уязвимостей
Проблемы были выявлены в ходе планового аудита безопасности Redis 7.4.5. Первая уязвимость, получившая идентификатор CVE-2025-49844, представляет собой использование памяти после освобождения в парсере Lua. При обработке скриптов механизм выделяет объект TString без защиты в стеке, что позволяет сборщику мусора преждевременно освободить этот объект. Злоумышленник может использовать эту особенность для перезаписи памяти и выполнения произвольных команд.
Вторая уязвимость CVE-2025-46817 связана с переполнением целочисленного типа в функции unpack(). Путем передачи экстремальных значений индексов атакующий может повредить стек Lua и перехватить управление выполнением программы. Третья проблема CVE-2025-46818 позволяет повышать привилегии через модификацию метатаблиц. Метатаблицы основных типов данных, включая строки и числа, остаются изменяемыми, что позволяет внедрять вредоносный код, выполняемый в контексте других пользователей.
Технический анализ показывает, что проблема использования после освобождения возникает в строке 387 файла deps/lua/src/lparser.c. Исходный код парсера вызывает luaS_new(L, name) без помещения результата в стек Lua, оставляя объект незащищенным. В исправленной версии используется последовательность setsvalue2s(L, L->top, tname) и incr_top(L) для обеспечения защиты строки перед парсингом.
Уязвимость переполнения целочисленного типа в deps/lua/src/lbaselib.c связана с некорректным вычислением количества элементов по формуле n = e - i + 1, которая вызывает переполнение при очень большом значении e. Эта ошибка приводит к записи за границами стека. Что касается проблемы метатаблиц, файлы src/script_lua.c и src/eval.c не содержали проверок для предотвращения записи в метатаблицы базовых типов, что позволяло осуществлять несанкционированное внедрение кода.
Все три уязвимости получили максимальные оценки по шкале CVSS 3.1 - 9.8 баллов, что подчеркивает их критическую severity. Для эксплуатации каждой из них необходимо наличие доступа к команде EVAL, что делает системы, разрешающие выполнение непроверенных скриптов, особенно уязвимыми.
Исследователи опубликовали полное доказательство концепции на языке Python, тестирующее все три уязвимости на работающем сервере Redis. Например, тест для уязвимости использования после освобождения создает нагрузку на память Lua для принудительного запуска сборщика мусора во время парсинга. Тест переполнения в функции unpack() использует скрипты вида return {unpack({1,2,3}, -2, 2147483647)} для выявления ошибок, а проверка защиты метатаблиц подтверждается попытками модификации nil-метатаблицы.
1 2 3 4 5 6 7 | # Step 1: Create memory pressure for i in range(50): huge_script = "local t={}; " + ";".join([f"t[{j}]=string.rep('X',10000)" for j in range(50)]) + "; return 'ok'" client.eval(huge_script, 0) # Step 2: Trigger GC during parse client.eval("collectgarbage('collect'); return 'gc'", 0) |
Организациям рекомендуется немедленно обновить Redis до версии 7.4.6 или более поздней, где уже включены все необходимые исправления. Патчи включают защиту стека в парсере, проверки границ в функции unpack() и применение режима "только для чтения" к базовым метатаблицам. Применение этих обновлений закрывает поверхность атаки и восстанавливает изоляцию скриптов.
Эксперты также рекомендуют осуществлять непрерывный мониторинг необычной активности, связанной с командой EVAL, и устанавливать строгий контроль доступа для снижения рисков. Регулярный аудит систем, использующих Redis, и своевременное применение обновлений безопасности становятся критически важными мерами в свете обнаруженных уязвимостей. Особенное внимание следует уделить системам, где Redis используется для обработки непроверенных пользовательских данных или в многопользовательской среде.
Обнаруженные уязвимости демонстрируют важность тщательного тестирования компонентов выполнения скриптов в системах управления базами данных. Разработчикам Redis удалось оперативно отреагировать на угрозу и выпустить исправления, однако реальная защита зависит от своевременного применения обновлений конечными пользователями.
Ссылки
- https://redrays.io/blog/poc-for-cve-2025-49844-cve-2025-46817-and-cve-2025-46818-critical-lua-engine-vulnerabilities/
- https://www.cve.org/CVERecord?id=CVE-2025-49844
- https://www.cve.org/CVERecord?id=CVE-2025-46817
- https://www.cve.org/CVERecord?id=CVE-2025-46818
- https://github.com/redis/redis/security/advisories/GHSA-4789-qfc9-5f9q
- https://github.com/redis/redis/commit/d5728cb5795c966c5b5b1e0f0ac576a7e69af539
- https://github.com/redis/redis/security/advisories/GHSA-m8fj-85cg-7vhp
- https://github.com/redis/redis/commit/fc9abc775e308374f667fdf3e723ef4b7eb0e3ca
- https://github.com/redis/redis/security/advisories/GHSA-qrv7-wcrx-q5jp
- https://github.com/redis/redis/commit/45eac0262028c771b6f5307372814b75f49f7a9e
- https://github.com/redis/redis/releases/tag/8.2.2