Драйвер psqlODBC, официальный ODBC-драйвер (компонент, через который приложения обращаются к базе данных) для PostgreSQL, хранит счётчик привязанных параметров в 16-битном поле со знаком. Число 32768 в такое поле не помещается и превращается в отрицательное значение. Следующий параметр заставляет драйвер записать около 2,5 мегабайта нулей в область памяти перед массивом привязок. Приложение либо аварийно завершается, либо продолжает работу с повреждённой памятью. Через этот драйвер к PostgreSQL подключаются отчётные системы, скрипты загрузки и аналитические панели. Проблема получила идентификатор CVE-2026-109448 и рейтинг 5.9 по CVSS 3.1, то есть среднюю степень опасности. Затронуты версии с 08.01.0102 по 18.00.0004 включительно.
Уязвимость CVE-2026-109448 в драйвере psqlODBC
Риск возникает там, где приложение само решает, сколько параметров привязать к одному запросу. Типичный пример - длинный перечень значений, который приходит из внешнего источника и подставляется в условие выборки. Если количество значений определяет злоумышленник, ему достаточно перевалить за предел в 32767. Тогда драйвер выходит за нижнюю границу выделенного участка памяти и затирает его. Классификация относит проблему сразу к двум категориям: переполнение целого числа и запись за нижней границей буфера.
Атака возможна по сети, сложность эксплуатации высокая, участие пользователя не требуется. Всё зависит от того, доверяет ли приложение внешним данным в подсчёте параметров. Ограничений по операционной системе в описании уязвимости нет, поэтому под удар попадают и Windows-сборки, и варианты для Unix. Отказ в обслуживании затрагивает клиентскую сторону: панели аналитики, интеграционные модули, генераторы отчётов, скрипты выгрузки. Для бизнеса это обернётся недоступностью сервиса и потерей несохранённых данных. Утечки сведений или подмены содержимого базы тут нет: по вектору CVSS страдает только доступность. Ошибку нашёл и описал Ричард Кюстерс. Сведений о реальных атаках с использованием этой ошибки в описании нет.
Исправление в версии 18.00.0005
Версия 18.00.0005 закрывает проблему. Функция привязки параметров теперь отклоняет номера выше 32767. Совместимость не страдает: стандарт ODBC не умеет работать с большим количеством параметров, потому что его счётчики тоже 16-битные. Ни один прежний выпуск не выполнял запрос с более чем 32767 параметрами, так что приложения, которые работали раньше, продолжат работать. Подробности приведены в рекомендательном документе GHSA-cmfx-rm3r-p2jr.
Вместе с уязвимостью разработчики закрыли две ошибки. Запросы, подготовленные на сервере с 1000 параметрами и более, могли завершаться отказом: начиная с тысячного параметра драйвер обрезал имя типа данных под фиксированный буфер, и PostgreSQL получал искажённое имя. Ещё одна правка касается параметров типа bytea при доступе через провайдер OLE DB для ODBC (MSDASQL): с версии 18.00.0003 они отказывали с сообщением о неверном типе. Windows-сборки теперь собирают с OpenSSL 3.5.9.
Обновление и обходные меры
Установщики и модули слияния для установщиков под x86, x64 и ARM64 лежат на сайте загрузок PostgreSQL и на странице релиза в GitHub. Если обновление приходится откладывать, ограничьте число параметров, которое приложение строит из внешних данных. Длинный перечень значений передавайте одним параметром-массивом. Сервис, собирающий такие запросы, изолируйте и урежьте его права на уровне СУБД. Отдельно проверьте места в коде, где список значений для условия выборки собирается напрямую из данных, пришедших от пользователя.
Подсчёт размеров и границ остаётся слабым местом драйверов доступа к базам данных. Ошибка в одном поле вроде 16-битного счётчика превращается в порчу памяти и отказ в обслуживании. Обновление до 18.00.0005 снимает проблему, но приложение, которое позволяет внешним данным задавать число параметров, остаётся в зоне риска независимо от версии драйвера.
Ссылки
- https://www.cve.org/CVERecord?id=CVE-2026-109448
- https://www.postgresql.org/about/news/psqlodbc-18000005-released-with-security-fix-for-cve-2026-109448-3404/