Всё об обновлении OpenSSH 10.3 для тех, кто заботится о безопасности.

Разработчики OpenSSH выпустили версию 10.3 – и на этот раз обновление получилось куда серьёзнее, чем обычные плановые патчи. Команда закрыла сразу несколько уязвимостей, одна из которых существовала ещё в оригинальном коде Berkeley rcp – утилиты, которой уже несколько десятилетий.
Самая неожиданная находка касается команды scp: при скачивании файлов под учётной записью root в режиме совместимости флаги setuid и setgid не сбрасывались с загружаемых файлов. Вредоносный файл мог сохранить расширенные права на исполнение – поведение, восходящее к временам оригинального rcp из BSD. Ошибку обнаружил Христос Папаконстантину из Cantina и Spearbit.
Там же нашлась проблема в sshd: директивы PubkeyAcceptedAlgorithms и HostbasedAcceptedAlgorithms неверно обрабатывали ECDSA-ключи. Достаточно было указать в конфигурации один алгоритм ECDSA – например, ecdsa-sha2-nistp384 – и сервер молча принимал любые другие алгоритмы из семейства ECDSA, даже не включённые в список.
Серьёзного внимания заслуживает и уязвимость в ssh: валидация shell-метасимволов в именах пользователей выполнялась слишком поздно. При определённых конфигурациях с токеном %u в блоке Match exec атакующий, контролирующий имя пользователя, мог выполнить произвольные команды оболочки. Об уязвимости сообщил Флориан Конхойзер. Разработчики напомнили, что напрямую передавать командную строку ssh недоверенному вводу – изначально плохая идея, а подобные защитные меры не могут быть абсолютными.
Ещё одна находка связана с authorized_keys: при сопоставлении параметра principals="" с сертификатом, в котором имя принципала содержало запятую, использовался некорректный алгоритм. В редких случаях это позволяло обойти проверку – при условии, что удостоверяющий центр выдал сертификат с несколькими именами, разделёнными запятой. Уязвимость обнаружил Владимир Токарев.
Отдельного внимания заслуживает изменение поведения сертификатов с пустой секцией principals. Раньше такой сертификат работал как wildcard и позволял аутентифицироваться под любым пользователем, доверявшим выдавшему удостоверение центру. Теперь пустая секция означает отказ в доступе – поведение более предсказуемое и безопасное.
Важное изменение затронет и тех, кто работает с устаревшим оборудованием или программным обеспечением: из OpenSSH удалена совместимость с SSH-реализациями, не поддерживающими rekeying. Соединение с такими системами будет разрываться в момент, когда транспортный уровень потребует переключения ключей.
Кроме того, опции -J и -oProxyJump теперь проверяют имена пользователей и хостов, переданных через командную строку, – чтобы исключить инъекцию shell-команд в ситуациях, когда параметры ProxyJump напрямую формируются из недоверенного ввода. Уязвимость обнаружил исследователь под псевдонимом rabbit.
Среди новых возможностей появилась поддержка кодовых точек IANA для перенаправления ssh-agent согласно черновику стандарта draft-ietf-sshm-ssh-agent, а ssh-keygen научился записывать ключи ED25519 в формате PKCS8. Командная строка ssh пополнилась экранным кодом ~I, который показывает сведения об активном соединении, а мультиплексирование получило команды conninfo и channels для диагностики на лету. В sshd добавили штраф invaliduser – теперь попытки войти под несуществующим именем пользователя можно штрафовать дольше обычных неудачных аутентификаций.
Также исправлен ряд неприятных регрессий: проблема с вводом PIN-кода для PKCS#11-ключей, появившаяся в версиях 10.1 и 10.2, наконец устранена. Исправлены краши в ssh-keygen при выгрузке нескольких ключей и потенциальное зависание при обмене ключами, если в /etc/moduli отсутствовали нужные параметры DH.
Исходные коды доступны на официальном сайте openssh.com.