Была обнародована информация о уязвимость, обнаруженная в реализация OpenSSH SSH-агент что позволяет коду работать в системе, которая предоставила ssh-агенту доступ к хосту на другом конце ssh-соединения.
Уязвимость, уже занесенная в каталог под CVE-2023-38408, это примечательно тем, что его можно использовать удаленно. Атака возможно только в том случае, если пользователь подключился по ssh к системе, контролируемой злоумышленником включив переадресацию сокетов на ssh-agent через ssh с помощью параметра «-A» или параметра ForwardAgent в файле конфигурации.
Процесс ssh-agent, используемый для кэширования закрытых ключей для аутентификации с открытым ключом, поддерживает необязательный режим переадресации, который позволяет удаленной стороне ssh-соединения получить доступ к ssh-agent в локальной системе, чтобы не хранить данные аутентификации на других хостах.
Уязвимость связано с наличием в ssh-агенте поддержки загрузки модулей PKCS#11, который можно запустить, в том числе, через unix-сокет, проброшенный в другую систему на ssh-agent.
Эта особенность позволяет злоумышленнику, который контролирует хост к которому он подключен немедленно загружать и выгружать любые разделяемые библиотеки из каталогов /usr/lib* в локальной системе жертвы в отдельном процессе ssh-pkcs11-helper. Эта функция появляется в ssh-agent, скомпилированном с опцией ENABLE_PKCS11, которая включена по умолчанию.
Изначально возможность загрузки разделяемых библиотек не считалась угрозой в целях безопасности, так как загрузка возможна только из системных каталогов /usr/lib*, которые содержат библиотеки, официально предоставленные дистрибутивом, и операции с этими библиотеками ограничиваются вызовом функций dlopen() и dlclose(), без вызова функций библиотеки.
Тем не менее, упустил из виду, что некоторые библиотеки имеют функции конструктора и разрушителя которые вызываются автоматически при выполнении операций dlopen() и dlclose(). Этого может хватить, чтобы подобрать нужные библиотеки и организовать удаленное выполнение кода.
Способность к атаке проявляется в среда по умолчанию Ubuntu, так как не тестировался в других дистрибутивах, который также устанавливает три пакета из репозитория "universe" (хотя предполагается, что в некоторых дистрибутивах возможна атака в дефолтной конфигурации).
Было предложено 8 вариантов атаки.
Например, один из перспективных вариантов создания рабочего эксплойта основан на том, что библиотека libgnatcoll_postgres.so при выполнении dlopen() регистрирует отдельный стек сигналов, используемый в обработчиках сигналов, путем вызова функции sigaltstack(), а после вызова dlclose() выделяет память, но не отключает ведение журнала стека сигналов (SS_DISABLE).
Чтобы воспользоваться уязвимостью, выполняются следующие манипуляции:
- Различные библиотеки загружаются для изменения макета mmap.
- Загружается библиотека libgnatcoll_postgres.so, регистрируется альтернативный стек сигналов и выполняется munmap().
- Библиотеки загружаются для изменения макета mmap и замены отдельного стека сигналов другой областью памяти режима записи (например, стеком потоков или сегментами .data/.bss).
- Загружает библиотеку, которая регистрирует обработчик сигнала SA_ONSTACK, но не регистрирует его с помощью munmap() при вызове dlclose().
- Библиотека, которая получает сигнал и вызывает обработчик сигнала SA_ONSTACK, загружается, в результате чего замененная область памяти перезаписывается кадрами стека из обработчика сигнала.
- Библиотеки загружаются специально для перезаписи содержимого замененной области памяти.
Что касается уязвимости, стоит упомянуть, что это исправлено в версии OpenSSH 9.3p2 недавно опубликовано. В новой версии запросы на загрузку модулей PKCS#11 отключены по умолчанию. В качестве обходного пути безопасности вы можете указать пустой белый список PKCS#11/FIDO (ssh-agent -P ») при запуске ssh-agent или явно указать библиотеки, разрешенные в белом списке.
Наконец, если вы заинтересованы в том, чтобы узнать больше об этом, вы можете ознакомиться с подробностями в по следующей ссылке.