CVE-2026-18036: утечка данных приватного ключа NTRU из-за деления с переменным временем в Bouncy Castle
В Bouncy Castle для Java до версии 1.86 обнаружена уязвимость класса timing side-channel: операции приведения секретных полиномов NTRU по модулю выполнялись через целочисленное деление, время работы которого зависит от секретного операнда. Это позволяет атакующему, способному замерять тайминги, постепенно восстановить информацию о приватном ключе NTRU. Оценка критичности — 8.2 (HIGH).
Подробности
Уязвимость присутствует в Bouncy Castle for Java версий до 1.86 включительно. В трёх вспомогательных функциях NTRU, эталонные реализации которых намеренно обходятся без операции деления, приведение секретных значений по модулю выполнялось с помощью оператора %. Это означало, что каждая такая редукция фактически выполнялась через целочисленное деление, задержка которого зависит от секретного операнда. Функция Polynomial.modQ делила на переменный делитель. В отличие от константного делителя, такой случай компилятор не может оптимизировать (strength reduction) до умножения, поэтому деление выполнялось при каждом вызове — в том числе на пути декапсуляции, где делимое напрямую зависит от приватного ключа. Функции Polynomial.mod3 и NTRUSampling.mod3 делили секретные полиномы ключа f и g на этапе генерации ключей, полиномы сообщения r и m при инкапсуляции, а также коэффициенты, восстанавливаемые при декапсуляции. Атакующий, имеющий возможность измерять время выполнения этих операций, может извлечь информацию о приватном ключе NTRU. Такой сценарий относится к классу атак по побочному каналу (timing side-channel) и особенно опасен для сценариев, где криптографические операции выполняются на оборудовании, доступном для наблюдения, либо в окружениях с разделяемыми ресурсами. Уязвимости присвоена оценка CVSS 8.2 (HIGH). В версии 1.86 проблема устранена: функция modQ теперь использует маскирование, что даёт точный результат, поскольку q всегда является степенью двойки, а mod3 применяет свободную от деления конструкцию fold and select из эталонной реализации. Возвращаемые значения при этом не изменились.Что делать
Основная рекомендация — обновить Bouncy Castle for Java до версии 1.86 или более поздней. Поскольку исправление не меняет результаты вычислений, обновление не должно повлечь несовместимости на уровне криптографических выходных данных. Если немедленное обновление невозможно, следует рассмотреть компенсирующие меры: ограничить доступ к процессам, выполняющим операции NTRU, исключить сценарии, при которых время выполнения криптографических операций может наблюдаться извне, а также по возможности изолировать такие вычисления от потенциально враждебного окружения. Однако эти меры являются лишь временными, так как полностью устранить утечку по таймингу они не способны. Дополнительно рекомендуется провести ревизию систем, использующих NTRU из состава Bouncy Castle, и оценить, насколько реалистичен для них сценарий измерения времени выполнения. Если приватные ключи NTRU применялись в условиях, где замеры таймингов были возможны, стоит рассмотреть их ротацию. Итог: CVE-2026-18036 — серьёзная уязвимость побочного канала в реализации NTRU библиотеки Bouncy Castle для Java, позволяющая получить сведения о приватном ключе. Исправление доступно в версии 1.86 и не изменяет результаты работы алгоритма, поэтому обновление является наиболее простым и надёжным способом защиты.Источник: CVE Project (cvelistV5)
