CVE-2026-17351
pgAdmin 4: обход транзакции только для чтения в AI Assistant из-за расхождения лексеров sqlparse/PostgreSQL (неполное исправление для CVE-2026-12045)
- Опубликовано
- 31 июл. 2026 г.
- Обновлено
- 1 авг. 2026 г.
- Назначение CNA
- PostgreSQL
- Наблюдены доказательства
- 8 авг. 2026 г.
Первичный CVSS
nvd · CVSS 4.0
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:XНизкий · следующие 30 дней
- Процентиль
- 34,6 %
- Дата модели
- 21 сент. 2026 г.
EPSS – это статистическая оценка, а не достоверность или мера воздействия. Объедините это с CVSS, статусом KEV, воздействием и вашей средой.
Резюме
Исправление для CVE-2026-12045 в pgAdmin 4 9.16 требовало, чтобы запрос, предоставленный LLM и переданный в инструмент execute_sql_query AI-ассистента, разбирался через sqlparse ровно как один оператор, не относящийся к управлению транзакциями, перед его выполнением внутри обёртки BEGIN TRANSACTION READ ONLY. Лексический анализ строковых литералов в sqlparse может расходиться с собственным парсером PostgreSQL: при standard_conforming_strings = on (значение по умолчанию в PostgreSQL начиная с 9.1) обратная косая черта непосредственно перед кавычкой является обычным символом для PostgreSQL, но sqlparse трактует её как экранирование кавычки. Поэтому такая нагрузка, как SELECT '\';COMMIT;CREATE TABLE pwn(x int);SELECT 1 --', разбирается валидатором sqlparse как один оператор SELECT, тогда как PostgreSQL выполняет её как четыре оператора: протащенный COMMIT завершает обёртывающую транзакцию только для чтения, а завершающий ROLLBACK становится no-op. Это повторно вводит тот же обход записи/RCE, который CVE-2026-12045 должна была закрыть, и он достижим через ту же косвенную доставку с помощью инъекции в промпт (злоумышленник размещает нагрузку в любом объекте, который AI-ассистент может прочитать; LLM выдаёт её как вызов инструмента). Первоначальный кандидат исправления выполнял запрос с помощью psycopg execute(..., prepare=True), намереваясь заставить собственный этап Parse в PostgreSQL (протокол расширенных запросов) отклонять многооператорный текст независимо от классификации sqlparse. Этот кандидат исправления не работает в представленном виде: PrepareManager в psycopg3 молча игнорирует аргумент prepare, когда prepare_threshold соединения равен None, что является значением по умолчанию pgAdmin для каждого серверного соединения (поле «Prepare threshold» для сервера пусто, если администратор явно не задал его) — psycopg3 откатывается к простому протоколу запросов, тому же пути, допускающему многооператорность, который использует обход, поэтому кандидат исправления ничего не закрывает ни в одной реальной конфигурации по умолчанию. Исправленное решение устанавливает conn.prepare_threshold = 0 непосредственно на выделенном одноразовом соединении только для чтения, которое открывает инструмент AI-ассистента, структурно принудительно включая протокол расширенных запросов независимо от какой-либо конфигурации на уровне сервера. Проверено на работающем экземпляре PostgreSQL 18: нагрузка успешно выполняется при поведении prepare_threshold=None (по умолчанию) и отклоняется с сообщением «cannot insert multiple commands into a prepared statement», как только на этом соединении установлено prepare_threshold=0. Эта проблема затрагивает pgAdmin 4: с 9.13 до 9.17.
Ответственное использование
Используйте информацию об уязвимостях только в тех системах, которыми вы владеете или имеете право тестировать. Kitploit ссылается на метаданные общедоступных исследований и не хранит код эксплойта или вредоносные полезные данные.