MongoDB закрыла пять уязвимостей в официальных драйверах и вспомогательных инструментах. Проблемы затрагивают драйверы для PHP, C и Python, оболочку Compass и библиотеку laravel-mongodb. Три уязвимости получили высокую оценку по CVSS 4.0, две - умеренную. Злоумышленник может подменить сервер базы данных в строке подключения, выйти за границы буфера в памяти и добиться создания объектов в приложениях на PHP.
Детали уязвимостей
Самую высокую оценку, 8,3 из 10, получила уязвимость CVE-2026-96746 в драйвере для C. Ошибка кроется в механизме мониторинга соединений, который следит за состоянием хостов из строки подключения. Когда список команд растёт прямо во время сканирования, драйвер пересчитывает размер буфера и пишет данные за его пределами. Злоумышленнику для этого нужно контролировать разрешение имён и ответы серверов, перечисленных в строке подключения. В худшем случае приложение, работающее с драйвером, завершается аварийно. Затронуты выпуски ветки 1.x до версии 1.30.12 и ветки 2.x до 2.5.5. Обходных путей разработчики не предложили, помогает только обновление.
Второй по значимости стала CVE-2026-96748 в драйвере PyMongo с той же оценкой 8,3. Здесь ошибка в разборе строки подключения. Драйвер декодирует процентные последовательности во всей части, где перечислены хосты, до того как разделит её на отдельные адреса. Закодированные запятая и двоеточие после декодирования превращаются в настоящие разделители. Если приложение подставляет в строку подключения внешние данные, например имя арендатора из запроса, злоумышленник дописывает в список свой сервер. Клиент затем проводит обнаружение топологии и проходит аутентификацию на чужом узле. Учётные данные могут попасть к посторонним, а результаты операций - оказаться подменёнными. Проблема тянется с версии 3.5.0.
Третья уязвимость PyMongo с оценкой 5,3 связана с клиентским шифрованием полей. Драйвер передаёт конечную точку службы управления ключами без проверки. Строка с суффиксом .sock воспринимается как путь к локальному сокету, а не как адрес удалённого узла. Тот, кто может записывать в хранилище ключей, направляет соединение на произвольный сокет на хосте приложения. Ущерб ограничен самим фактом подключения: сокет обёрнут в проверяющий контекст TLS, поэтому рукопожатие всегда срывается, а сообщение службе управления ключами не уходит. Произвольные данные передать не удаётся. Затронуты только приложения с клиентским шифрованием полей, чьё хранилище ключей доступно для записи извне.
Четвёртая проблема PyMongo с оценкой 7,5 касается кодирования документов BSON. Арифметика размеров ведётся в знаковом 32-битном типе, а проверка переполнения написана в форме, поведение которой не определено стандартом C. Очень большое значение в данных, которые кодирует приложение, приводит к записи за границы буфера. Вектор атаки локальный, последствия зависят от того, как собрано расширение. Риск затрагивает конфиденциальность, целостность и доступность данных.
Пятая уязвимость, оценка 6,3, относится к драйверу для PHP. При создании объектов событий мониторинга драйвер учитывает имена классов, встроенные в содержимое документа. Если приложение зарегистрировало подписчика на события команд и включает в операции недоверенные данные, злоумышленник заставляет драйвер создать класс приложения, реализующий интерфейс сохраняемости, и вызывает его метод десериализации. Итог зависит от того, какие классы есть в приложении. Уязвимы выпуски до 1.21.10, ветки 2.0 и 2.2 до версий 2.1.10 и 2.5.3.
Отдельно исправления получили ещё два компонента. Сборка Compass 1.49.12 закрывает уязвимости в этом инструменте. В библиотеке laravel-mongodb поправили работу распределённой блокировки в кэше. Строка владельца блокировки, начинающаяся со знака доллара, воспринималась как выражение пути к полю. Из-за этого проверки владения и срока действия блокировки давали неверный результат. Теперь значение сравнивают и хранят как буквальную строку. Исправление вошло в ветку 5.x.
Круг затронутых шире, чем кажется по названиям продуктов. Драйвер для C лежит в основе обёрток для других языков и части служебных утилит, поэтому переполнение буфера в нём отражается на множестве сборок. Драйверы для Python и PHP массово применяют в веб-приложениях, системах аналитики и внутренних сервисах компаний. Строку подключения при этом часто собирают динамически, подставляя имена арендаторов, филиалов или фрагменты адресов из запросов. Как раз такая практика превращает ошибку разбора в реальный риск.
Исправленные версии выглядят так: драйвер для PHP - 1.21.10, 2.1.10 и 2.5.3, драйвер для C - 1.30.12 и 2.5.5, PyMongo - 4.18.2, Compass - 1.49.12. Данных об эксплуатации этих уязвимостей в реальных атаках нет. MongoDB опубликовала бюллетени 24 сентября 2026 года, сводка появилась 28 сентября.
Пока обновление не установлено, стоит убрать возможность записи в хранилище ключей для недоверенных пользователей. Это требование полезно и без описанных ошибок. Внешние данные нельзя подставлять в строку подключения и в её часть с адресами хостов. Документы ключей имеет смысл проверить на значения, оканчивающиеся на .sock. Для PHP-драйвера стоит убедиться, что входящие BSON-документы не содержат служебного поля, задающего класс объекта.
Проблемы задевают общий слой: драйверы лежат в основе приложений, которые работают с базой данных. Ошибки в разборе строк подключения и в обработке недоверенных данных повторяются у нескольких драйверов, причём часть из них живёт в коде годами. Обновление занимает минуты, а последствия подмены сервера или переполнения буфера исправлять дороже.
Ссылки
- https://github.com/mongodb/laravel-mongodb/pull/3579
- https://github.com/mongodb/mongo-c-driver/security/advisories/GHSA-frjf-h5jg-4v46
- https://github.com/mongodb/mongo-php-driver/security/advisories/GHSA-cmvj-vxvq-rh2c
- https://github.com/mongodb/mongo-python-driver/security/advisories/GHSA-qx36-8mw2-4r3x
- https://github.com/mongodb/mongo-python-driver/security/advisories/GHSA-v4x9-3549-crwv
- https://github.com/mongodb/mongo-python-driver/security/advisories/GHSA-vp6j-j7w5-5xjj
- https://github.com/mongodb-js/compass/releases/tag/v1.49.12