psqlODBC - драйвер, через который приложения работают с PostgreSQL по протоколу ODBC. Внутренняя проверка его исходного кода выявила две уязвимости. Обе ведут к повреждению памяти в процессе клиента. Первая срабатывает при чтении столбцов типа large object, вторая - при разборе escape-последовательностей в тексте запроса. Исправление уже вышло.
Два способа испортить память клиента
Общее у обеих уязвимостей одно: драйвер доверяет длине, которую ему сообщили, и пишет в буфер больше, чем тот вмещает. Различаются источники данных и условия атаки. В первом случае данные приходят от сервера, во втором - из текста SQL, который приложение передало драйверу.
Чтение large object
Large object - механизм PostgreSQL для данных, которые не помещаются в обычную строку таблицы. Когда приложение читает такой столбец, сервер присылает ответ вместе с длиной данных. Драйвер берёт эту длину и копирует ответ в буфер приложения, не сверяя её с размером буфера. Отсюда переполнение.
Ответ контролирует не клиент. Сервер, которому текущие настройки SSL не дают доверять, или посредник между клиентом и сервером может прислать больше байт, чем вмещает буфер. Лишние байты ложатся в соседнюю память процесса, и выбирает их злоумышленник. Достаточно одного чтения столбца large object: ни учётных данных, ни подготовки на стороне клиента не нужно.
Уязвимость получила высокий уровень опасности, оценка CVSS - 7,5 из 10. Атака идёт по сети, сложность высокая, привилегии не требуются, участие пользователя нужно. Последствия затрагивают конфиденциальность, целостность и доступность - по всем трём оценка высокая. Идентификатор - CVE-2026-120057, уведомление GHSA-qhmr-5339-q33r.
В версии 18.00.0006 копирование ограничили размером буфера вызывающей стороны, а ответы фиксированного размера, которые короче ожидаемого, драйвер теперь отклоняет. Пока обновление не установлено, обходная мера одна: не читать столбцы large object с серверов без полной проверки сертификата (sslmode=verify-full) либо требовать шифрование GSSAPI.
Разбор escape-последовательностей
Escape-последовательности ODBC - части текста SQL в фигурных скобках: вызов функции, дата, время, отметка времени, escape-подстановка. Разбирает эти конструкции сам драйвер, ещё до отправки запроса на сервер. Парсер записывает смещения аргументов вызова функции в массив фиксированного размера на стеке, на 16 элементов. Границу он не проверяет, а сам массив не обнуляет.
Escape с большим числом аргументов переполняет стек. Обращение к аргументу, которого не передали, копирует в текст запроса произвольные байты. Копирование тела даты, времени, отметки времени или escape-подстановки пишет на один байт дальше 128-байтного буфера на стеке.
Условия здесь другие. Атака тоже идёт по сети, сложность высокая, но привилегии нужны низкие, а участие пользователя не требуется. Опасность в том, что приложение передаёт в драйвер недоверенный текст SQL: тогда повреждение памяти затрагивает его процесс. Оценка CVSS та же - 7,5 из 10. Идентификатор - CVE-2026-120061, уведомление GHSA-hfm6-qfx8-v4xq.
В 18.00.0006 массив смещений инициализируют и ограничивают по длине, а при копировании тела escape оставляют место под завершающий байт. До обновления не передавайте в драйвер SQL из недоверенных источников. Если это невозможно, отклоняйте текст с escape-последовательностями раньше, чем он дойдёт до драйвера.
Что известно об эксплуатации
CISA добавила обе записи в свой каталог дополнительных оценок Vulnrichment. По её шкале SSVC эксплуатация отмечена как отсутствующая, автоматизировать атаку нельзя. Публикация деталей не означает, что уязвимости уже применяют в реальных атаках: сведений о таких случаях нет.
Администратору достаточно одного действия - обновить драйвер до 18.00.0006 везде, где он установлен. psqlODBC ставится не на сервер PostgreSQL, а на клиентские машины и серверы приложений, поэтому круг обхода шире, чем кажется. Версию стоит сверить в списке источников данных ODBC на каждой такой системе.