MitM-атака на OpenSSH через VerifyHostKeyDNS
MitM-атака на OpenSSH через VerifyHostKeyDNS
Категория: Программы Теги: Уязвимости Опубликовано: 8 апреля 2025

Уязвимость BDU:2025-01959: MitM-атака на OpenSSH через VerifyHostKeyDNS

Уязвимость BDU:2025-01959 (CVE-2025-26465) затрагивает клиент OpenSSH версий 6.8p1–9.9p1 и связана с опцией VerifyHostKeyDNS. При её включении злоумышленник, находящийся в позиции Man-in-the-Middle (MitM), может полностью обойти проверку ключа сервера, подменив его и получив доступ к данным пользователя.
Условия эксплуатации:

  • Клиент использует VerifyHostKeyDNS=yes или ask.

  • Атакующий контролирует сетевой трафик между клиентом и сервером.


Технический анализ уязвимости BDU:2025-01959

1. Механизм VerifyHostKeyDNS

Опция VerifyHostKeyDNS позволяет клиенту проверять SSH-ключи сервера через DNS-записи типа SSHFP. Если запись существует и совпадает с ключом сервера, проверка считается успешной. Однако при ошибках в обработке памяти клиент может пропустить проверку.

2. Ошибка в обработке памяти

Уязвимый код:

if (options.verify_host_key_dns) {  
    ...  
    if ((r = sshkey_from_private(host_key, &plain)) != 0)  
        goto out;  
}  

Если sshkey_from_private() возвращает ошибку SSH_ERR_ALLOC_FAIL (нехватка памяти), клиент игнорирует это и продолжает подключение без проверки ключа.

3. Эксплуатация через DoS-атаку

Атакующий отправляет клиенту множество пакетов PING, что вызывает:

  • Неконтролируемое выделение памяти под буферы PONG.

  • Исчерпание памяти клиента (sshkey_from_private возвращает SSH_ERR_ALLOC_FAIL).

  • Обход проверки ключа сервера.


Разбор Proof of Concept (PoC)

Этапы атаки:

  1. Подготовка MitM:

    • Атакующий перехватывает трафик между клиентом и сервером.

    • Запускает поддельный SSH-сервер с крупным ключом (для увеличения потребления памяти).

  2. Исчерпание памяти клиента:

    • Эксплойт отправляет клиенту тысячи пакетов SSH2_MSG_PING:

      for _ in range(100000):  
          send_packet(SSH2_MSG_PING, data=random_bytes(256))  
    • Каждый PING заставляет клиент выделять память под PONG, что приводит к утечке.

  3. Обход проверки ключа:

    • При нехватке памяти sshkey_from_private() возвращает SSH_ERR_ALLOC_FAIL.

    • Клиент пропускает проверку ключа и подключается к поддельному серверу.

Пример работы эксплойта:

# Запуск поддельного сервера с крупным ключом  
fake-server$ sshd -o KexAlgorithms=curve25519-sha256 -h /path/to/large_key  

# Клиент с включенным VerifyHostKeyDNS  
client$ ssh -o VerifyHostKeyDNS=yes user@real-server  
# После исчерпания памяти клиент подключается к fake-server без проверки  

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

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

Установите версию, где уязвимость исправлена (выше 9.9p1). Проверьте версию:

ssh -V  

2. Отключение VerifyHostKeyDNS

Измените конфигурацию клиента (~/.ssh/config или /etc/ssh/ssh_config):

VerifyHostKeyDNS no  

3. Ограничение ресурсов сервера

Для защиты от DoS-атак настройте параметры в sshd_config:

LoginGraceTime 1m          # Макс. время подключения  
MaxStartups 10:30:60      # Лимит одновременных подключений  
PerSourcePenalties yes    # Блокировка IP при подозрительной активности  

4. Сетевые меры

  • Используйте VPN или SSH-туннели для защиты от MitM.

  • Настройте фаервол для блокировки недоверенных источников.

5. Мониторинг и анализ

  • Отслеживайте аномальную активность через инструменты вроде Wazuh или Auditd.

  • Пример правила для Auditd:

    auditctl -a always,exit -F arch=b64 -S connect -F success=0 -k ssh_failed_connection  
Алексей Черемных Алексей Черемных
77