Бесплатно Экспресс-аудит сайта:

22.04.2022

Крупная криптографическая уязвимость в Java позволяет подделывать сертификаты

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

Уязвимость затрагивает реализацию алгоритма с открытым ключом Elliptic Curve Digital Signature Algorithm (ECDSA) в версиях Java 15 и младше. ECDSA — алгоритм, использующий принципы эллиптической криптографии для цифровой аутентификации сообщений. Ключевым преимуществом ECDSA является меньший размер генерируемых им ключей по сравнению с RSA или другими криптоалгоритмами, что делает его подходящим для использования в таких стандартах, как 2FA на основе FIDO, язык разметки Security Assertion Markup Language (SAML), OpenID и JSON.

«Если компания использует одну из уязвимых версий Java, злоумышленник может легко подделать некоторые типы SSL-сертификатов и рукопожатий (позволяющих перехватывать и изменять сообщения), подписанные JWT, утверждения SAML или токены идентификатора OIDC и даже сообщения аутентификации WebAuthn», — пояснил исследователь из ИБ-фирмы ForgeRock Нил Мэдден (Neil Madden), обнаруживший уязвимость.

Уязвимость (CVE-2022-21449) получила оценку в 7,5 балла по шкале CVSS. По словам специалиста, он оценил бы опасность проблемы на максимальные 10 баллов «из-за широкого спектра воздействий на различную функциональность в контексте управления доступом».

Подписи ECDSA основаны на псевдослучайном числе, обычно обозначаемом как K, которое используется для получения двух дополнительных чисел — R и S. Для подтверждения подлинности подписи сторона должна проверить уравнение, включающее R и S, открытый ключ подписавшего, и криптографический хэш сообщения. Когда обе части уравнения равны, подпись действительна.

Реализация проверки подписи ECDSA в Java не проверяет, равны ли R или S нулю, поэтому пользователь может создать значение подписи, в котором они оба равны 0, и Java примет это как действительную подпись для любого сообщения и для любого общедоступного ключа. Цифровой эквивалент пустой идентификационной карты.

Организациям, использующим любую из уязвимых версий Java для проверки подписей, настоятельно рекомендуется применить исправления.