MongoDB PHP Driver в ветках 1.x.x до 1.21.12, 2.1.x до 2.1.12 и 2.5.x до 2.5.5 позволяет вызвать отказ в обслуживании по сети. Из-за рекурсивной обработки BSON (двоичного формата документов MongoDB) при кодировании и декодировании возникает переполнение стека. Проблема затрагивает PHP-приложения, которые передают в драйвер документы или объекты, построенные из внешних данных. Бюллетень MongoDB PHPC-276 от 19 октября 2026 года относит проблему к удалённому отказу в обслуживании и не сообщает об эксплуатации в реальных атаках. Данных о необходимости аутентификации бюллетень не приводит; вектор атаки сетевой, потому что сам драйвер не предоставляет сетевой сервис, а отказ в обслуживании зависит от приложения.
Пределы рекурсии при кодировании и декодировании BSON
При кодировании объект, который реализует интерфейс сериализации BSON, может возвращать структуру с новым экземпляром того же объекта. Драйвер проходит такую цепочку рекурсивно, пока не исчерпывает стек. В тесте из бюллетеня аварийное завершение начиналось примерно на 12 750 итерациях. Последствие - падение процесса PHP, то есть отказ в обслуживании; бюллетень не заявляет выполнение кода. Для удалённой атаки приложение должно само сериализовать построенную злоумышленником структуру, например вложенные объекты из пользовательских данных.
При декодировании документ с глубокой вложенностью заставляет драйвер рекурсивно вызывать код на C, пока не заканчивается стек. Отдельный сценарий связан с CodeWScope - конструкцией BSON для хранения кода и области видимости. В этой конструкции драйвер сбрасывал глубину на каждом уровне. Поэтому документ с 20 000 уровней обходил предел и приводил к SIGSEGV (сигналу аварийного завершения процесса). Драйвер теперь проверяет предел перед рекурсивным вызовом; для отдельного значения, полученного из документа, отсчёт начинается с глубины 1.
Поэтому вложенные документы в сыром BSON, которые драйвер не разбирает и передаёт как есть, не расходуют лимит. При превышении предела драйвер выбрасывает исключение. Проверка учитывает общую вложенность, включая CodeWScope, а регрессионные тесты проверяют документ с 501 уровнем. Для ветки 2.x исправление включает проверку глубины и учёт CodeWScope; оно вошло в версии 1.21.12, 2.1.12 и 2.5.5. Предел декодирования составляет 500 уровней, предел кодирования - 100 уровней.
Декодирование допускает большую глубину, потому что сервер хранит документы с вложенностью до 180 уровней. Ниже глубины, на которой рекурсия в C исчерпывает стек, новый предел совпадает с ограничением libbson, библиотеки для работы с BSON. Проверка глубины для кодирования появилась раньше; теперь аналогичный механизм действует и при декодировании. Задачу открыли в 2015 году и закрыли 14 октября 2026 года. В трекере проблема имеет приоритет P3; связанная задача CDRIVER-634 предлагала настраивать глубину рекурсии во время выполнения.
Для закрытия уязвимости обновите драйвер до 1.21.12, 2.1.12 или 2.5.5 в зависимости от используемой ветки. После обновления пересоберите расширение PHP и проверьте версию через менеджер зависимостей. Если обновление невозможно, ограничьте глубину вложенности BSON на уровне приложения и не принимайте объекты с рекурсивной сериализацией из недоверенных источников. Проверьте версии во всех окружениях, включая тестовые и промежуточные, и зависимости, которые содержат расширение. Официальных обходных мер, кроме установки исправленных версий, бюллетень не описывает.
Уязвимость затрагивает сетевой вектор и приводит к падению процесса PHP. Обновление закрывает оба сценария переполнения стека: рекурсивную сериализацию и декодирование глубоко вложенного BSON. Для приложений, принимающих BSON из внешних источников, сетевой сценарий отказа в обслуживании сохраняется до установки исправления. Бюллетень не упоминает публичный эксплойт.