Переполнение в fuzzystrmatch открывает путь к выполнению команд на сервере PostgreSQL

PostgreSQL

В открытом доступе появился эксплойт (код, использующий ошибку в защите). Он превращает сравнение строк на сервере PostgreSQL в запуск произвольных программ. Проблема получила идентификатор CVE-2026-15742. Она затрагивает расширение fuzzystrmatch, которое применяют для нечёткого сравнения текста. Уязвимы функции levenshtein() и levenshtein_less_equal(). Обе считают редакционное расстояние между двумя строками. Обновления требуются всем поддерживаемым веткам СУБД.

Уязвимость CVE-2026-15742 в расширении fuzzystrmatch

Функции принимают две строки и набор числовых параметров. Эти параметры задают стоимость вставки, удаления и замены одного символа. При определённом сочетании значений возникает целочисленное переполнение. Оно позволяет записать четыре байта по адресу за пределами выделенного буфера. Адрес и содержимое записи подбирают заранее. Поэтому результат повторяется от запуска к запуску, а не зависит от удачи.

Дальше цепочка ведёт к внутреннему кэшу прав доступа. Серверный процесс PostgreSQL хранит там сведения о текущей роли. Рядом лежит признак того, есть ли у роли права суперпользователя. Целевая запись меняет один байт в этом кэше. С этого момента сервер считает низкопривилегированную роль суперпользователем. Появившиеся полномочия открывают команду COPY ... PROGRAM. Она запускает программы операционной системы от имени сервисной учётной записи PostgreSQL.

Главное условие для атаки - учётная запись в базе. Права администратора СУБД злоумышленнику не нужны. Достаточно роли, которая может подключаться к базе и создавать объекты. Расширение fuzzystrmatch обычно ставит суперпользователь, но обращаются к нему обычные роли. Поэтому слабое звено - не только ядро СУБД, но и модули в её поставке.

Нечёткий поиск востребован там, где нужно сопоставлять похожие названия, адреса или опечатки в справочниках. Из-за этого модуль нередко включён в рабочих базах, о которых администраторы вспоминают редко. А вместе с ним в системе остаются и неисправленные функции.

Чем ограничен опубликованный эксплойт

Опубликованный код рассчитан на лабораторную среду, а не на атаку через сеть. Ему нужны права администратора операционной системы и доступ к отладчику. С его помощью автор подбирает адреса в памяти и проверяет цель записи. Без этого шага код не работает. Тестовая сборка - PostgreSQL 18.0 в одноразовом контейнере.

Такие ограничения снижают практический риск. Удалённая эксплуатация потребовала бы иного способа узнавать адреса в памяти. Пока публичный вариант подтверждает саму возможность записи за границы буфера. Для защиты важно другое. Примитив переполнения живёт в коде, который идёт в поставке вместе с СУБД.

Разработчики закрыли проблему в нескольких ветках. Исправления вошли в PostgreSQL 18.6, 17.11, 16.15, 15.19 и 14.24. Обновиться нужно тем, кто держит fuzzystrmatch. То же касается администраторов, которые разрешают обычным ролям создавать расширения. Наличие модуля проверяют запросом к системному каталогу. Полезно также сохранить в журнале следы обращений к функциям levenshtein() и levenshtein_less_equal().

Если обновление откладывают, доступ к функциям ограничивают правами. Команду REVOKE EXECUTE ON FUNCTION применяют к обеим. Если модуль не используют, его удаляют из базы. Создание расширений оставляют за суперпользователем. Такой порядок сужает поверхность атаки. Заодно он упрощает инвентаризацию установленного программного обеспечения.

Расширения PostgreSQL требуют не меньше внимания, чем ядро. Многие модули пишут сторонние авторы, а обновляют их реже. Регулярная сверка списка расширений с актуальными выпусками помогает не пропустить свежий патч.

Ссылки

Комментарии: 0