
Эксплойт proof-of-concept для CVE-2025-51495 — целочисленное переполнение в функции mg_ws_cb веб-сокета Mongoose, приводящее к выходу за границы памяти и потенциальному удалённому выполнению кода.
Я хотел бы сообщить об уязвимости безопасности, обнаруженной в последнем выпуске Mongoose (v7.17). Проблема находится в модуле WebSocket, а именно в функции mg_ws_cb, отвечающей за обработку входящих WebSocket-кадров.
Функция подвержена целочисленному переполнению, которое при определенных специально сформированных входных данных может привести к выходу за границы памяти. Это состояние потенциально может быть использовано удаленным злоумышленником для повреждения памяти или аварийного завершения приложения.
Поскольку разные производители реализуют бизнес-логику WebSocket по-разному, эта уязвимость потенциально может привести к удаленному выполнению кода.
Подробности:
Корневая уязвимость заключается в функции mg_ws_cb:
Специально сформированный WebSocket-пакет, отправленный клиентом, может установить ofs=0 в этой точке, что вызовет целочисленное переполнение при вычислении ofs-1, в результате чего значение станет намного больше длины recv.buf.
В последующих функциях обработки WebSocket этот buf может использоваться, и поскольку его длина больше фактической, это может привести к доступу за границы или аварийному завершению программы.
Триггер уязвимости:
Для демонстрации я выбрал существующий пример websocket-server в проекте. Я не вносил никаких изменений в код, кроме добавления проверок ASAN при компиляции.
При запуске программы и отправке определенного websocket-пакета это напрямую вызывает аварийное завершение.
poc:
В качестве клиента я также выбрал существующий в проекте пример "websocket-client" и изменил только два параметра в функции fn файла main.c для отправки запроса.
Запуск измененной программы приведет к аварийному завершению сервера.