CVE-2019-19244: уязвимость SQLite 3.30.1 позволяет вызвать падение через sub-select с DISTINCT и оконными функциями
В SQLite 3.30.1 обнаружена уязвимость CVE-2019-19244: некорректная обработка подзапроса, одновременно использующего DISTINCT и оконные функции при определённом варианте ORDER BY, приводит к аварийному завершению процесса. Проблема актуальна для приложений и сервисов, встраивающих эту версию СУБД.
Подробности
Речь идёт об уязвимости CVE-2019-19244, затрагивающей SQLite версии 3.30.1. Проблема локализована в функцииsqlite3Select в файле select.c — центральном узле обработки инструкции SELECT.
Согласно официальному описанию, аварийное завершение (crash) возникает в случае, когда подзапрос (sub-select) одновременно удовлетворяет двум условиям:
- использует ключевое слово
DISTINCT; - использует оконные функции (window functions);
ORDER BY определённым образом. Сочетание этих конструкций приводит к некорректной работе механизма планирования запроса и, как следствие, к падению процесса, выполняющего SQL-запрос.
Тип уязвимости — отказ в обслуживании (DoS). Оценка CVSS в записи CVE не указана, сведения о производителе в карточке также отсутствуют (поля Affected и производитель помечены как n/a). Практическая значимость зависит от контекста эксплуатации: если приложение принимает SQL-запросы или их фрагменты от пользователя либо формирует сложные аналитические запросы с оконными функциями, подобранный ввод способен обрушить процесс СУБД и нарушить работу сервиса. Оконные функции появились в SQLite начиная с версии 3.25.0, поэтому уязвимость теоретически может затрагивать и близкие версии, где применим аналогичный путь обработки запроса, — однако в записи CVE прямо указана только 3.30.1.
Что делать
- Обновить SQLite до версии новее 3.30.1: проблема относится к конкретному состоянию кода, и последующие релизы содержат исправления планировщика запросов.
- Если обновление невозможно, ограничить попадание в СУБД запросов с сочетанием
DISTINCTи оконных функций в подзапросах, особенно поступающих из недоверенных источников. Валидация и нормализация SQL на стороне приложения снижают риск. - Проверить все компоненты и зависимости, встраивающие SQLite (мобильные SDK, десктопные приложения, серверные модули), и синхронизировать их версии.
- Обеспечить изоляцию процесса, работающего с БД, и настроить автоматический перезапуск: это уменьшит последствия возможного падения.
DISTINCT, оконных функций и ORDER BY в подзапросе. Критичность умеренная, но для сервисов, зависящих от стабильности СУБД, обновление до актуальной версии SQLite остаётся обязательной мерой.
Источник: CVE Project (cvelistV5)
