Драйвер MongoDB для C# допускает обход аутентификации и исчерпание памяти

MongoDB

Драйвер MongoDB для C# уязвим к обходу аутентификации при подключении с клиентским сертификатом. Он же допускает исчерпание памяти при разборе документов. Обход аутентификации позволяет одному приложению читать и записывать данные в MongoDB от имени другого приложения. Исчерпание памяти ведёт к отказу в обслуживании: процесс драйвера со временем занимает всю доступную память. Затронуты ветки 3.x и 2.x, то есть приложения на C#, которые подключаются к базе с сертификатом или разбирают внешние документы.

Кэш кластеров, сертификаты и таблица символов

Вендор подтверждает затронутость драйвера: уязвимы версии ниже 3.13.0, исправление отнесено к 3.13.0. В карточках задач стоит статус "исправлено" и приоритет Major P3 - третий уровень важности по внутренней шкале. Идентификаторы CVE не присвоены, оценки CVSS нет. Для обхода аутентификации указан уровень high с оговоркой, что верхняя граница - critical, то есть высокий с возможным переходом в критический.

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

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

Дальше срабатывает общий на процесс кэш кластеров. Кластер - набор серверов MongoDB с общими настройками подключения, и созданные кластеры драйвер хранит в одном словаре на весь процесс. Второй клиент с поддельным сертификатом совпадает по ключу кэша с первым и получает уже готовый кластер. Для рукопожатия TLS, то есть шифрованного соединения, драйвер берёт сертификат и закрытый ключ первого клиента, поэтому команды второго уходят от его имени.

Закрытый ключ атакующему не нужен: достаточно открытых данных чужого сертификата. Вне его контроля остаются два условия - совместная работа в одном процессе с клиентом жертвы и знание адресов серверов с параметрами подключения. Участие пользователя и сетевой доступ не требуются. В описании отмечено, что под угрозой пользовательские данные и метаданные ответов API.

Исчерпание памяти устроено проще. При разборе BSON и JSON драйвер складывает символьные значения в статическую таблицу - общий для процесса словарь, который не очищается и не освобождается сборщиком мусора. BSON - двоичный формат документов MongoDB, JSON - текстовый формат обмена данными. Если приложение разбирает поток документов с новыми уникальными символами, таблица растёт и занятая память не возвращается. В итоге процесс упирается в предел памяти и перестаёт отвечать на запросы.

Исправление вошло в версию драйвера 3.13.0, обходных мер вендор не приводит. Поле затронутых версий в карточках задач пустое, поэтому ориентиром служит формулировка уведомления: уязвимы версии до 3.13.0. Обновление до 3.13.0 закрывает эти проблемы; других официальных мер в описании нет.

Обход аутентификации опаснее: он не требует закрытого ключа и открывает данные другого клиента. Исчерпание памяти ограничивается отказом в обслуживании. Сведений об эксплуатации этих проблем в реальных атаках нет, поэтому обновление до 3.13.0 остаётся плановой задачей для тех, кто использует ветки 3.x и 2.x.

Ссылки

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