Драйвер psqlODBC даёт приложениям доступ к базе PostgreSQL через ODBC. Так называют стандартный интерфейс доступа к базам данных. Новый выпуск закрывает ряд уязвимостей. Сервер может повредить память клиента, а пользователь базы - выполнить чужой SQL.
Драйвер слишком доверяет ответам сервера
Основная причина большинства этих уязвимостей - доверие к данным сервера. Драйвер берёт оттуда длины, счётчики и имена столбцов. Сверки с размером буфера нет. Из-за этого подделанный сервер управляет поведением клиента. Публично уязвимости раскрыли 2 ноября 2026 года.
Часть уязвимостей связана с чтением данных. При этом драйвер копирует ответ сервера в буфер приложения по длине из ответа. Размер буфера не проверяется, поэтому лишние байты уходят за границу. Несколько таких уязвимостей получили 7.5 по шкале CVSS, общей системе оценки уязвимостей. Атака идёт по сети, но в части случаев нужно участие пользователя.
Где драйвер доверяет чужим данным
Ещё одна уязвимость есть в функции SQLSpecialColumns. Она подставляет имена таблицы и схемы в служебный запрос без экранирования. В результате вызывающий код может выполнить произвольный SQL с правами соединения. Уязвимость затрагивает версии с 17.00.0006 по 18.00.0005 включительно. Ей присвоен номер CVE-2026-120062.
Похожая уязвимость есть в запросах обновляемых курсоров. Драйвер берёт у сервера имя столбца с автоинкрементом и вставляет его в кавычках. Двойные кавычки внутри имени он не удваивает. Поэтому пользователь базы, способный создать таблицу, влияет на то, какие строки изменят или удалят запросы драйвера. Здесь тоже заявлена SQL-инъекция под номером CVE-2026-120065.
Кроме того, драйвер доверяет счётчикам от сервера. Имя столбца попадает в шаблон форматирования, и служебные символы заставляют драйвер читать чужую память. В других местах не проверяются номер столбца, счётчик ключей и длина служебной вставки в запрос. Разбор таких вставок к тому же переполняет стек. Срабатывает это, когда приложение передаёт драйверу SQL-текст из недоверенного источника.
Ещё одна уязвимость касается файлов журнала. На Unix-подобных системах драйвер создаёт их в общем каталоге с правами по умолчанию. Обычно такие права разрешают чтение всем. При открытии драйвер идёт по символической ссылке. Поэтому локальный пользователь может прочитать чужие запросы или дописать данные в выбранный им файл.
Что меняется после установки патча
Все перечисленные уязвимости закрыты в psqlODBC 18.00.0006, который вышел 2 ноября 2026 года. Теперь драйвер сверяет длину копируемых данных с размером буфера. При этом имена таблиц и столбцов экранируются, а счётчики и номера проверяются по диапазону. Журналы видит только владелец. Переход по символическим ссылкам запрещён.
Драйвер поставляется отдельно от сервера базы. Поэтому обновление ядра PostgreSQL эти уязвимости не закрывает. Проверить нужно саму библиотеку на клиентских машинах.
В тот же релиз вошли правки без номеров CVE. Описанного пути атаки у них нет. При этом часть из них касается отложенных данных в дескрипторах и пустых ответов каталога. Эти изменения уменьшают число сбоев. Известной атаки за ними не стоит.
Пока патч не установлен, риск можно снизить. Подключайтесь только к серверам, подлинность которых подтверждена проверкой сертификата. Обновляемые курсоры отключите в параметрах подключения, если приложение их не использует.
Отладку в рабочей среде выключите. Журнал обмена с сервером тоже держите выключенным. Если журнал всё же нужен, отведите для него каталог, доступный только пользователю приложения. SQL-текст из ненадёжных источников в драйвер лучше не передавать.
Тем не менее сведений об эксплуатации этих уязвимостей в реальных атаках нет. Их раскрыли публично в один день с выпуском исправлений. Затронуты все сборки драйвера до 18.00.0006. Администраторам стоит сверить версию драйвера на рабочих станциях и серверах приложений. Старые сборки остаются уязвимыми, пока их не заменят.
Ссылки
- https://github.com/postgresql-interfaces/psqlodbc/blob/main/Changelog.md
- https://www.cve.org/CVERecord?id=CVE-2026-120057
- https://www.cve.org/CVERecord?id=CVE-2026-120058
- https://www.cve.org/CVERecord?id=CVE-2026-120059
- https://www.cve.org/CVERecord?id=CVE-2026-120060
- https://www.cve.org/CVERecord?id=CVE-2026-120061
- https://www.cve.org/CVERecord?id=CVE-2026-120062
- https://www.cve.org/CVERecord?id=CVE-2026-120063
- https://www.cve.org/CVERecord?id=CVE-2026-120064
- https://www.cve.org/CVERecord?id=CVE-2026-120065
- https://www.cve.org/CVERecord?id=CVE-2026-120066
- https://www.cve.org/CVERecord?id=CVE-2026-120067