2 147 483 647 + 1 символ до катастрофы. Во встроенной библиотеке libpq от PostgreSQL нашли уязвимость для удаленного отключения серверов

2 147 483 647 + 1 символ до катастрофы. Во встроенной библиотеке libpq от PostgreSQL нашли уязвимость для удаленного отключения серверов

Разработчики PostgreSQL выпустили экстренные обновления для версий 13-18.

image

В PostgreSQL обнаружена уязвимость в официальной клиентской библиотеке libpq. Проблема позволяет аварийно завершить работу приложения при обработке специально подготовленной строки. Исследователь Алексей Соловьев опубликовал подробный технический разбор проблемы. Уязвимость получила идентификатор CVE-2025-12818 и оценку 5,9 балла по шкале CVSS 3.0.

Источник проблемы находится в функции PQescapeInternal, которую вызывают две другие функции библиотеки: PQescapeLiteral и PQescapeIdentifier. Первая экранирует строковые значения перед включением в SQL-запрос, например в условиях WHERE или в списке VALUES. Вторая обрабатывает идентификаторы, то есть названия таблиц, колонок и схем, если запрос требует безопасного оформления таких имён.

При передаче строки длиной более 2 147 483 647 символов, состоящей из кавычек или обратных слешей, внутренний счётчик типа signed int переполняется и вместо максимального положительного значения переходит в отрицательный диапазон. Такое поведение называют целочисленным переполнением, или integer overflow. Из-за сбоя библиотека неверно вычисляет размер будущего буфера.

Дальше возникает уже практическая проблема. Вместо корректного объёма памяти libpq может выделить всего несколько байт, после чего начинает записывать в буфер строку огромной длины. Запись быстро выходит за пределы выделенной области, операционная система фиксирует недопустимое обращение к памяти, а процесс завершается с ошибкой сегментации. Для приложения такой сценарий означает мгновенный аварийный останов.

Опасность связана не только с самой библиотекой libpq, но и с тем, что через неё работают многие более высокоуровневые драйверы. Соловьёв отдельно показал, как уязвимость воспроизводится в PHP через встроенный драйвер pdo_pgsql. Достаточно передать в метод escapeIdentifier строку нужной длины, и процесс PHP аварийно завершается внутри PQescapeInternal. По той же причине проблема может затрагивать и другие языки программирования, если их PostgreSQL-драйверы используют libpq как базовый компонент.

Практический риск сводится к отказу в обслуживании. Если злоумышленник может передать приложению специально подготовленную длинную строку, приложение в уязвимой конфигурации можно предсказуемо обрушить. Речь не идёт о выполнении произвольного кода, но для серверных систем даже такой сценарий остаётся серьёзной проблемой, особенно при внешнем доступе к форме ввода или API.

Исправление появилось в репозитории PostgreSQL 10 ноября 2025 года, а через три дня разработчики выпустили официальное уведомление об уязвимости. Патч вошёл в версии 13.23, 14.20, 15.15, 16.11, 17.7 и 18.1. Администраторам, которые ещё не обновили СУБД и клиентские компоненты, стоит сделать это как можно скорее, особенно если приложения принимают пользовательский ввод и используют функции экранирования libpq без проверки длины строки.