Bouncy Castle BC-JAVA: уязвимость CVE-2026-71890 позволяет исключить произвольного участника MLS-группы
В Bouncy Castle для Java до версии 1.86 обнаружена уязвимость высокой критичности (CVSS 8.7) в реализации протокола MLS (RFC 9420). Внешний участник, располагающий публичным GroupInfo, может сформировать external commit с Remove-предложением и исключить любого члена группы, заняв его место в ratchet tree. Уязвимость затрагивает все приложения, использующие публичные API Group.externalJoin и Group.handle.
Подробности
Уязвимость присутствует в Bouncy Castle для Java версий до 1.86. Корень проблемы — недостаточная проверка списка предложений во внешнем commit. Функция org.bouncycastle.mls.protocol.Group.validateExternalCachedProposals подсчитывала предложения по типам и ограничивала индекс удаляемого листа, но не проверяла, что этот лист каким-либо образом связан с присоединяющимся участником. Согласно разделу 12.2 RFC 9420, внешний commit допускает не более одного Remove-предложения, с помощью которого присоединяющийся удаляет свою старую версию. При этом требуется, чтобы LeafNode в поле path commit'а удовлетворял критериям, которые применялись бы в Update для удаляемого листа, — в частности, чтобы его credential содержал идентификаторы, приемлемые для удаляемого участника. Обычное правило валидатора о self-remove на этом пути намеренно не применяется, поскольку resync commit легитимно удаляет лист, которым владеет присоединяющийся, но взамен ничего не устанавливалось. В результате любая сторона, располагающая публичным GroupInfo группы — а именно его и предполагается передавать внешнему участнику, — могла сформировать Remove с LeafIndex любого участника, и все члены группы применяли бы этот commit, исключая участника и занимая его слот в ratchet tree. Проверка credential, которая должна была это предотвратить, существовала только в gRPC interop-стенде и потому не защищала других вызывающих публичные API Group.externalJoin и Group.handle.Что делать
Основная рекомендация — обновить библиотеку Bouncy Castle для Java до версии 1.86 или выше. В этой версии external commit, содержащий Remove, принимается только тогда, когда credential удаляемого листа идентичен credential в новом листе самого присоединяющегося — как на отправляющей, так и на принимающей стороне. Если немедленное обновление невозможно, следует ограничить доступ сторонних лиц к публичному GroupInfo групп MLS и внимательно контролировать операции внешнего присоединения. Стоит также проверить, не использовались ли публичные API Group.externalJoin и Group.handle в сценариях, где GroupInfo мог быть получен недоверенной стороной. Итог: CVE-2026-71890 — серьёзная уязвимость в реализации MLS, позволяющая внешнему участнику исключать произвольных членов группы и захватывать их позиции в ratchet tree. Единственная надёжная мера защиты — обновление до Bouncy Castle для Java 1.86.Источник: CVE Project (cvelistV5)
