Символ "\n" — и полный контроль даже при базовой защите. Теперь это RCE в OpenSSH

Как особенность генерации ProxyCommand в популярном инструменте делает его целью для Git-атак.


fx87wibhsb2yi03un9ulqsqyqklpxh5i.jpg

В OpenSSH обнаружена новая уязвимость — CVE-2025-61984 , которая позволяет добиться удалённого выполнения кода (RCE) через манипуляцию с параметром ProxyCommand и особенностями обработки символов в оболочке. Эксплуатация возможна даже при наличии защит от стандартных метасимволов оболочки — за счёт использования управляющих символов и синтаксических ошибок, которые не останавливают выполнение команд в некоторых шеллах.

OpenSSH предоставляет механизм ProxyCommand для подключения через промежуточный прокси. Обычно используется так: ProxyCommand /usr/bin/nc -X connect -x 192.0.2.0:8080 %h %p. Однако в конфигурации ~/.ssh/config, если указано %r, имя пользователя может содержать управляющие символы. Несмотря на то, что большинство опасных символов фильтруются, такие как ;, |, (, ), &, ранее не фильтровались \n (перевод строки), $, [ и другие, которые в некоторых шеллах могут изменить поведение команды. Именно это поведение позволяет атакующему сформировать поддельное значение имени пользователя, содержащее вредоносную команду, следующую после ошибки в первой строке.

Если git-репозиторий содержит вредоносный подмодуль с URL вида: url = "$[+]\nsource poc.sh\ n@foo.example.com :foo", а пользователь имеет в ~/.ssh/config следующую строку: ProxyCommand some-command %r@%h:%p, то при клонировании через git clone --recursive произойдёт выполнение второй строки (source poc.sh), если используется оболочка вроде Bash, Fish или csh. Это возможно потому, что синтаксическая ошибка $[+] вызывает переход на следующую строку. Zsh, в отличие от других оболочек, корректно прерывает выполнение при подобных ошибках.

У пользователя должен быть включён ProxyCommand с %r. Злоумышленник должен контролировать URL подмодуля в .gitmodules. Уязвимая оболочка должна быть установлена как SHELL (например, bash). Пользователь должен произвести git clone --recursive. Таким образом, уязвимость может использоваться в цепочках атак на цепочки поставок (supply chain), CI/CD-серверы и пользовательские окружения.

Teleport — один из затронутых инструментов, который в конфигурации tsh config генерирует ProxyCommand с %r. Это позволяет атакующему, знающему имя кластера, инициировать атаку через подмодули git.

Патч для OpenSSH включает жёсткую фильтрацию управляющих символов в функции valid_ruser(): if (iscntrl((u_char)s)) return 0;. Также рекомендуется: обновиться до OpenSSH 10.1; изменить ProxyCommand с использованием одинарных кавычек: '%r', чтобы избежать интерпретации; запретить SSH в подмодулях: git config --global protocol.ssh.allow user; отключить URL-обработчики для ssh://, если они пропускают управляющие символы; перейти на оболочки с более строгим поведением (например, Zsh).

Хотя атака требует специфической конфигурации , это очередное напоминание о сложности и непредсказуемости взаимодействия между git, SSH и shell-интерпретаторами. Даже без прямой эксплуатации, такие уязвимости демонстрируют важность строгости обработки пользовательского ввода в инструментах командной строки и автоматизации.