Выпуск OpenSSH 9.2 с устранением уязвимости, проявляющейся на этапе до аутентификации

Опубликован релиз OpenSSH 9.2, открытой реализации клиента и сервера для работы по протоколам SSH 2.0 и SFTP. В новой версии устранена уязвимость, приводящая к двойному освобождению области памяти на стадии до прохождения аутентификации. Уязвимости подвержен только выпуск OpenSSH 9.1, в более ранних версиях проблема не проявляется.

Для создания условий проявления уязвимости достаточно изменить баннер SSH-клиента на «SSH-2.0-FuTTYSH_9.1p1» для того, чтобы добиться выставления флагов «SSH_BUG_CURVE25519PAD» и «SSH_OLD_DHGEX», зависящих от версии SSH-клиента. После выставления данных флагов память под буфер «options.kex_algorithms» освобождается два раза — при выполнении функции do_ssh2_kex(), вызывающей compat_kex_proposal(), и при выполнении функции do_authentication2(), вызывающей по цепочке input_userauth_request(), mm_getpwnamallow(), copy_set_server_options(), assemble_algorithms() и kex_assemble_names().

Создание рабочего эксплоита для уязвимости считается маловероятным, так как процесс эксплуатации слишком усложнён — современные библиотеки распределения памяти предоставляют защиту от двойного освобождения памяти, а процесс pre-auth, в котором присутствует ошибка, выполняется с пониженными привилегиями в изолированном sandbox-окружении.

Кроме отмеченной уязвимости в новом выпуске также устранены ещё две проблемы с безопасностью:

  • Ошибка при обработке настройки «PermitRemoteOpen«, приводящая к игнорированию первого аргумента, если он отличается от значений «any» и «none». Проблема проявляется в версиях новее OpenSSH 8.7 и приводит к пропуску проверки при указании только одного полномочия.
  • Атакующий, контролирующий DNS-сервер, используемый для определения имён, может добиться подстановки спецсимволов (например, «*») в файлы known_hosts, если в конфигурации включены опции CanonicalizeHostname и CanonicalizePermittedCNAMEs, и системный резолвер не проверяет корректность ответов от DNS-сервера. Проведение атаки рассматривается как маловероятное, так как возвращаемые имена должны соответствовать
    условиям, заданным через CanonicalizePermittedCNAMEs.

Другие изменения:

  • В ssh_config для ssh добавлена настройка EnableEscapeCommandline,
    управляющая включением обработки на стороне клиента escape-последовательности «~C», предоставляющей командную строку. По умолчанию обработка «~C» теперь отключена для использования более жёсткой sandbox-изоляции, что потенциально может привести к нарушению работы систем, в которых «~C» используется для перенаправления портов во время работы.

  • В sshd_config для sshd добавлена директива ChannelTimeout для задания таймаута неактивности канала (каналы, в которых за указанное в директиве время не зафиксирован трафик, будут автоматически закрыты). Для сеанса, X11, агента и перенаправления трафика могут быть заданы разные таймауты.
  • В sshd_config для sshd добавлена директива UnusedConnectionTimeout, позволяющая задать таймаут для завершения клиентских соединений, находящихся определённое время без активных каналов.
  • В sshd добавлена опция «-V» для вывода версии по аналогии с подобной опцией в клиенте ssh.
  • В вывод «ssh -G» добавлена строка «Host», отражающая значение аргумента с именем хоста.
  • В scp и sftp добавлена опция «-X» для управления такими параметрами протокола SFTP, как размер буфера копирования и число ожидающих завершения запросов.
  • В ssh-keyscan разрешено сканирование полных CIDR-диапазонов адресов, например, «ssh-keyscan 192.168.0.0/24».

Источник: http://www.opennet.ru/opennews/art.shtml?num=58598