
Уязвимость 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)
Этапы атаки:
-
Подготовка MitM:
-
Атакующий перехватывает трафик между клиентом и сервером.
-
Запускает поддельный SSH-сервер с крупным ключом (для увеличения потребления памяти).
-
-
Исчерпание памяти клиента:
-
Эксплойт отправляет клиенту тысячи пакетов
SSH2_MSG_PING
:for _ in range(100000): send_packet(SSH2_MSG_PING, data=random_bytes(256))
-
Каждый
PING
заставляет клиент выделять память подPONG
, что приводит к утечке.
-
-
Обход проверки ключа:
-
При нехватке памяти
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
