Назад к блогу

OpenSSH 10.6: отключение LZ77, запрет символов в именах пользователей и новые опции

OpenSSH 10.6: отключение LZ77, запрет символов в именах пользователей и новые опции

OpenSSH 10.6 закрывает две потенциальные уязвимости через намеренный отказ от совместимости: из сжатия удалён алгоритм LZ77, а в именах пользователей из командной строки запрещены символы `$` и `\`. Кроме того, релиз добавляет новые директивы для проброса агента, управления попытками аутентификации по ключам и логирования слабой криптографии. Разбираем, что именно изменилось и кому стоит пересмотреть конфигурацию.

OpenSSH 10.6/10.6p1 выпущен 2026-10-06. Тег V_10_6_P1 в репозитории openssh-portable указывает на коммит a8c72b8, помечен 06 Oct 08:46 и подписан проверенной подписью коммиттера djmdjm (Damien Miller) с отпечатком ключа JDubEpIXO0CfnM+iagFQce4MiJJDqTvgbBR80SuRwTQ.

Релиз намеренно ломает два ранее поддерживавшихся поведения ради безопасности: общий словарь сжатия и использование символов $ и \ в именах пользователей, передаваемых в командной строке. Также добавлен ряд новых опций конфигурации и изменена обработка платформ без передачи файловых дескрипторов.

Что именно изменилось

Сжатие. Из deflate отключена часть LZ77 — механизм, который ищет повторы ранее увиденных данных и вместо повторного кодирования ссылается на уже встреченную последовательность. Кодирование Хаффмана сохранено, поэтому сжатие продолжает работать, но менее эффективно. Исходящий поток сжатия инициализируется в режиме, при котором deflate применяет только кодирование Хаффмана и не ведёт словарь повторов, — именно поэтому LZ77 оказывается отключён:

switch (deflateInit2(&ssh->state->compression_out_stream,
    Z_BEST_SPEED, Z_DEFLATED, 15, 8, Z_HUFFMAN_ONLY)) {

Сжатие по умолчанию остаётся выключенным, поэтому атака работает только если его включили. Пользователям рекомендуется переносить сжатие на уровень приложения поверх протокола SSH — там оно обычно эффективнее и полностью невосприимчиво к атаке такого типа.

Имена пользователей. Символы $ и \ теперь отклоняются в именах пользователей, переданных в командной строке. Ограничение не применяется, когда имя задано директивой User в конфигурационном файле SSH, поэтому легитимные учётные записи с этими символами можно по-прежнему использовать через директиву. В версии 10.3 уже исправлялась связанная ошибка: имена пользователей из командной строки проверялись на метасимволы оболочки слишком поздно, после того как они могли быть раскрыты через ssh_config.

Проверка типов ключей. sshd(8) и ssh(1) выполняют проверку типов ключей и подписей CA во время парсинга ключей против allowlist-списков (таких как PubkeyAcceptedAlgorithms) как можно раньше. Подпись CA — это подпись ключа удостоверяющим центром, подтверждающая, что ключ можно считать доверенным. Это уменьшает поверхность атаки, которую представляют отключённые алгоритмы. Изменение предложено при участии Chris Rohlf совместно с Claude и Anthropic Research.

Новые опции. В sshd(8) появилась директива AgentSocketPath, задающая расположение $SSH_AUTH_SOCK для проброса агента. Она поддерживает пользовательский путь (по умолчанию подкаталог $HOME, например "user:.ssh/agent") и общий каталог (например "shared:/tmp"); сокеты в общих каталогах создаются внутри подкаталога со случайным именем. У ssh-agent появился флаг -A, задающий каталоги сокета агента и принимающий стили "user:" и "shared:", аналогичные sshd AgentSocketPath.

Добавлена опция PubkeyAuthOptions max-pk-ok:nnn, позволяющая задать число проверок PK_OK (PK_OK), не засчитываемых в MaxAuthTries, по умолчанию 6 попыток. Проверки PK_OK позволяют клиенту заранее узнать, подойдёт ли серверу его ключ, не расходуя попытки аутентификации. После их исчерпания дальнейшие попытки считаются неудачными аутентификациями против MaxAuthTries.

Опция TCPKeepAlive расширена: "yes" или "transport" включает keepalive на сокете соединения, а "TCPKeepAlive all" дополнительно включает их для сокетов проброса. Также добавлена опция sshd WarnWeakCrypto, включённая по умолчанию и логирующая использование клиентом не пост-квантово-стойкой схемы согласования ключей.

Платформы без передачи дескрипторов. На платформах, которые не поддерживают передачу файловых дескрипторов и требуют root для выделения PTY, опции GatewayPorts и StreamLocalForwarding отключаются принудительно. Причина в том, что на этих платформах процесс sshd-session после аутентификации сохраняет root-привилегии, тогда как на других платформах он работает с привилегиями вошедшего пользователя. При повышенных привилегиях sshd-session мог выполнять действия от имени root и обходить ограничения, которые обычно применялись бы к пользователю, например устанавливать соединения через unix domain socket или привязываться (через -R forwarding) к TCP-портам с малыми номерами. Затронутые платформы включают QNX 6, SCO OpenServer 5 и сборки, сделанные с опцией конфигурации --disable-fd-passing. Опция --disable-fd-passing удалена.

Предыстория

До версии 10.6 сжатие в OpenSSH использовало общий словарь — историю уже встреченных последовательностей байтов — для всех каналов одной SSH-сессии. Этот общий словарь давал выигрыш в производительности, потому что LZ77 мог вместо повторного кодирования одинаковых байтов ссылаться на уже увиденную последовательность. Однако именно это свойство и создавало утечку: OpenSSH делил историю между каналами, поэтому управляемые атакующим данные могли влиять на то, как сжимается секрет в другом канале той же сессии.

Предыдущие релизы OpenSSH датированы так: 10.5/10.5p1 — 2026-08-11, 10.4/10.4p1 — 2026-07-06, 10.3/10.3p1 — 2026-04-02, 10.2/10.2p1 — 2025-10-10, 10.1/10.1p1 — 2025-10-06.

Почему это сделали

Утечка через сжатие. Атакующий, который может подавать выбранный им открытый текст в один канал и наблюдать за итоговым шифротекстом, использует сжатие, чтобы восстановить секреты, передаваемые по другому каналу в той же сессии. Утечка возникает из-за памяти LZ77: когда догадка совпадала с частью секрета, итоговый трафик мог стать чуть короче, что давало атакующему очередную порцию информации. Это относит атаку к тому же семейству, что CRIME и BREACH, хотя для её проведения нужна довольно специфичная конфигурация: трафик, контролируемый атакующим, и секрет должны находиться в одной мультиплексированной SSH-сессии. В самых малошумных тестах Баумер и Бринкманн восстанавливали восьмисимвольный секрет из алфавита в 26 символов в среднем за 276 догадок на 100 испытаний, а в более шумном браузерном сценарии это число возрастало примерно до 27 600. Документация уже рекомендовала не включать сжатие для соединений, где смешивается доверенный и недоверенный трафик.

Инъекция через имена пользователей. Команда может собираться из внешних данных: например, инструмент, CI-задача или агент запускают ssh "$INPUT_USER@host", и затем это имя пользователя может попасть внутрь команды, передаваемой оболочке, где символы вроде $ и \ становятся синтаксисом оболочки, а не частью имени. Об этой проблеме сообщили SecBuddyF KeenLab Tencent (CodeBuddy Security).

Что это меняет на практике

При обновлении до 10.6 ломается несколько вещей:

  • Сжатие становится менее эффективным из-за отключения словарного кодера LZ77. Большинство интерактивных сессий разницы не заметят, но автоматизированные задачи, передающие большие объёмы сжимаемых данных по узким каналам, могут пострадать.
  • ssh(1) строже проверяет имена пользователей в командной строке и отказывает в именах с обратным слешем и знаком доллара. Скрипты и агентские инструменты, передающие такие имена напрямую, придётся изменить.
  • На платформах без передачи файловых дескрипторов и требующих root для выделения PTY принудительно отключаются GatewayPorts и StreamLocalForwarding.
  • scp(1) начинает выдавать предупреждение об устаревании флага -R в стандартный поток ошибок; в будущем релизе флаг будет игнорироваться.
  • Удалена опция конфигурации сборки --disable-fd-passing.

Ограничения и открытые вопросы

Авторы признают, что предложенные меры не могут быть абсолютными из-за разнообразия оболочек и пользовательских конфигураций, и продолжают рекомендовать не передавать командные строки ssh(1) и других инструментов напрямую из недоверенного ввода. Ограничение на символы $ и \ не применяется, когда имя пользователя задано директивой User в конфигурационном файле SSH. Атака через сжатие требует довольно специфичной настройки: управляемый атакующим трафик и секрет должны находиться в одной мультиплексированной SSH-сессии. Поддержка платформ без передачи файловых дескрипторов будет удалена в будущем, если не найдут альтернатив, не требующих привилегий в пост-аутентификационном процессе. Проект планирует выпускать исправления чаще, чем обычно, вместо ожидания обычного графика релизов.

Источники

Похожее