Уязвимость средства криптографической защиты OpenSSH
Уязвимость средства криптографической защиты OpenSSH
Категория: Программы Теги: Уязвимости Опубликовано: 8 июня 2025

Уязвимость BDU:2022-01880 (CVE-2016-20012) OpenSSH

Уязвимость BDU:2022-01880 (CVE-2016-20012) связана с особенностью обработки аутентификации в OpenSSH (до версии 8.7). Сервер тратит разное время на проверку валидных и невалидных имен пользователей при использовании публичных ключей. Это позволяет удаленно определить существующие учетные записи через timing-атаку, измеряя задержки ответов.

Анализ уязвимости

Уровень опасности: 5.3 MEDIUM
Вектор атаки: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N

  • 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:L (Confidentiality: Low) – Частичная утечка конфиденциальности.

  • I:N (Integrity: None) – Без воздействия на целостность.

  • A:N (Availability: None) – Без влияния на доступность.


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

  1. Доступ к SSH-серверу: Злоумышленник должен иметь возможность инициировать TCP-соединение на порт SSH (обычно 22).

  2. Версия OpenSSH ≤ 8.7: Сервер не должен иметь патчи против timing-атак.

  3. Отсутствие ограничений на попытки подключения: Если реализованы механизмы вроде fail2ban или rate-limiting, атака усложняется.


Анализ кода эксплоита

Рассмотрим код эксплоита для понимания работы вектора атаки с использованием уязвимости CVE-2016-20012. Эксплоит использует библиотеку paramiko для измерения времени ответа сервера при попытках аутентификации с неверным паролем. Ключевые элементы:

1. Основная функция check_username

def check_username(hostname, port, username, attempts=5, timeout=10):
    response_times = []
    for _ in range(attempts):
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        start_time = time.time()
        try:
            client.connect(hostname, port=port, username=username, 
                          password='invalidpassword', timeout=timeout)
        except paramiko.AuthenticationException:
            pass  # Ожидаемая ошибка при неверных данных
        finally:
            end_time = time.time()
            client.close()
            response_time = end_time - start_time
            response_times.append(response_time)
    # Расчет статистики
    avg_time = statistics.mean(response_times)
    stddev = statistics.stdev(response_times) if len(response_times) > 1 else 0
    print(f"Username: {username}, Avg: {avg_time:.4f}s, StdDev: {stddev:.4f}")
  • Принцип работы:

    • Для каждого имени из словаря выполняются 5 попыток подключения с неверным паролем (invalidpassword).

    • Замеряется время между отправкой запроса и получением AuthenticationException.

    • Валидные имена пользователей вызывают более долгий ответ (сервер проверяет ключ в авторизованных ключах), невалидные — мгновенный отказ.

  • Статистическая обработка:
    Усреднение времени и расчет стандартного отклонения исключают ложные срабатывания из-за сетевых задержек.

2. Словарь атаки

with open("/path/to/names.txt", 'r') as file:
    usernames = [line.strip() for line in file if line.strip()]

Типичные словари включают стандартные имена (admin, root, test) и слитые базы логинов.


Последствия успешной эксплуатации

  1. Перечисление учетных записей:

    • Определение существующих имен пользователей.

    • Подготовка к брутфорс-атакам на пароли или ключи SSH.

  2. Сбор информации для целевых атак:

    • Идентификация сервисных аккаунтов (например, jenkinsgit).

    • Косвенное определение ОС (Linux/Unix-имена vs. Windows).

  3. Эскалация угроз:

    • Компрометация слабых учетных записей → получение shell → движение по сети.


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

1. Обновление OpenSSH

  • Версии 8.8+ устраняют уязвимость, нормализуя время ответа для всех запросов.

  • Команда обновления:

    sudo apt update && sudo apt upgrade openssh-server

2. Rate-Limiting и Fail2ban

  • Fail2ban: Автоматическая блокировка IP после серии неудачных попыток.
    Пример конфигурации (/etc/fail2ban/jail.local):

    [sshd]
    enabled = true
    maxretry = 3  # Блокировка после 3 попыток
    bantime = 1h
  • TCP Wrappers: Ограничение доступа по IP через /etc/hosts.allow:

    sshd: 192.168.1.0/24, 10.0.0.1 # Разрешить только указанные подсети/IP

3. Правила для Suricata/IPS

Блокировка подозрительно частых SSH-подключений с разных аккаунтов:

alert tcp any any -> $HOME_NET 22 (msg:"SSH Username Enumeration Attempt"; 
  flow:to_server; 
  detection_filter:track by_src, count 10, seconds 30; 
  threshold:type limit, count 1; sid:1000001; rev:1;)
  • Логика: Срабатывание при 10 попытках подключения за 30 секунд с одного IP.

4. Альтернативные меры

  • Port Knocking: Скрытие SSH-порта за последовательностью "стуков".

  • 2FA: Добавление TOTP (Google Authenticator) или U2F-ключей через PAM.


Заключение

Уязвимость BDU:2022-01880 (CVE-2016-20012) демонстрирует риски, связанные с информационным утечками через побочные каналы (timing-атаки). Хотя она не позволяет напрямую получить доступ к системе, она становится первым шагом для целевых атак. Критически важно:

  • Обновлять OpenSSH до актуальных версий.

  • Внедрять многоуровневую защиту (rate-limiting, 2FA).

  • Мониторить сетевую активность с помощью Suricata.

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