
Уязвимость CVE-2023-38408: Удаленное выполнение кода в OpenSSH через ssh-agent
Уязвимость CVE-2023-38408, обнаруженная в OpenSSH, затрагивает функцию PKCS#11 компонента ssh-agent и связана с использованием ненадёжного пути поиска динамических библиотек. Злоумышленник, действующий удалённо, может использовать эту уязвимость для выполнения произвольного кода на целевой системе, если включена переадресация ssh-agent. Проблема актуальна для версий OpenSSH до 9.3p2.
Уровень опасности: Критический (CVSS:3.1 9.8 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
Для успешной атаки необходимо:
-
Доступ к переадресованному ssh-agent: Жертва должна использовать SSH-соединение с включенной опцией
ForwardAgent
(например,ssh -A user@host
). -
Возможность подключения к атакуемой системе: Злоумышленник должен иметь возможность установить SSH-соединение или воспользоваться скомпрометированными учетными записями.
-
Уязвимая версия OpenSSH: Версии ниже 9.3p2.
Уязвимость особенно опасна в средах, где переадресация агента используется для управления множеством серверов (например, в DevOps-инфраструктурах).
Технические детали
Уязвимость CVE-2023-38408 в OpenSSH позволяет удалённое выполнение кода (RCE) через ssh-agent при включенной переадресации агента (-A
или ForwardAgent
). Эксплойт использует цепочку манипуляций с динамическими библиотеками и обработкой сигналов. Рассмотрим ключевые этапы атаки:
1. Подготовка шеллкода и передача через SSH-сокет
-
Шеллкод: Злоумышленник создаёт вредоносный код (например, бинд-шелл на порту 31337) и внедряет его в память процесса
ssh-pkcs11-helper
. -
Передача через сокет: Используя
nc
, шеллкод отправляется через Unix-сокетSSH_AUTH_SOCK
, связанный с переадресованным агентом. Пример команды:(perl -e 'print "\0\0\x27\xbf\x14\0\0\0\x10/usr/lib/modules\0\0\x27\xa6" . "\x90" x 10000'; echo -n "$SHELLCODE") | nc -U "$SSH_AUTH_SOCK" &
Здесь
\x90
— NOP-слайд, облегчающий попадание в область шеллкода.
2. Загрузка библиотек для манипуляции памятью
Эксплойт последовательно загружает библиотеки через ssh-add -s
, чтобы:
-
Сделать стек исполняемым: Например, библиотеки вроде
libKF5SonnetUi.so.5.92.0
устанавливают флагrwx
для стека, обходя защиту NX (No-Execute). -
Зарегистрировать обработчик сигналов:
-
SIGSEGV: Библиотека
libttcn3-rt2-dynamic.so
регистрирует кастомный обработчик для сигнала Segmentation Fault. -
Nodelete: Библиотеки с атрибутом
NODELETE
(например,libns3.35-wave.so.0.0.0
) остаются в памяти даже послеdlclose()
, сохраняя код обработчика.
-
3. Подмена обработчика сигналов
-
Перехват выполнения: После регистрации обработчика
SIGSEGV
, атакующий заменяет его код на "гаджет", который перенаправляет выполнение на шеллкод в стеке. -
Использование уязвимых библиотек: Например,
libgnatcoll_postgres.so
при загрузке черезdlopen()
регистрирует альтернативный стек сигналов черезsigaltstack()
, но не отключает его приdlclose()
. Это позволяет перезаписать область памяти сигнального стека.
4. Триггеринг SIGSEGV и выполнение кода
-
Искусственное вызывание ошибки: Загрузка библиотеки, которая вызывает недопустимый доступ к памяти (например, обращение к
NULL-указателю
), что приводит кSIGSEGV
. -
Выполнение шеллкода: Обработчик сигнала, подменённый атакующим, перенаправляет выполнение на NOP-слайд и шеллкод в стеке. Пример результата:
nc localhost 31337 # Получение доступа к оболочке.
5. Техники обхода защиты
-
Grooming адресного пространства: Использование
NODELETE
и повторной загрузки библиотек для контроля над расположением кода в памяти. -
Эксплуатация побочных эффектов: Некоторые библиотеки при
dlclose()
не очищают зарегистрированные обработчики сигналов или оставляют исполняемые регионы памяти 48.
Последствия успешной атаки
-
Удалённое выполнение кода (RCE): Злоумышленник получает полный контроль над системой.
-
Эскалация привилегий: Если ssh-agent запущен от привилегированного пользователя, атакующий может повысить права до root.
-
Кража данных: Доступ к SSH-ключам, конфиденциальным файлам и сетевым ресурсам.
Рекомендации по защите
-
Обновление OpenSSH:
Установите версию 9.3p2 или новее. Команда для проверки версии:ssh -V
-
Отключение переадресации ssh-agent:
Избегайте использованияssh -A
. Если переадресация необходима, ограничьте её настройками вsshd_config
:AllowAgentForwarding no
-
Ограничение загрузки библиотек:
Используйте политики SELinux или AppArmor для блокировки загрузки неподписанных библиотек. -
Мониторинг активности ssh-agent:
-
Проверяйте журналы (
/var/log/auth.log
) на подозрительные подключения. -
Используйте команду
ssh-add -L
для аудита ключей, загруженных в агент.
-
-
Сегментация сети:
Ограничьте доступ к SSH-портам (22/TCP) с помощью фаервола.
Пример защиты от атаки
# Проверка и обновление OpenSSH на Linux (Debian/Ubuntu)
sudo apt update
sudo apt upgrade openssh-server
# Отключение ForwardAgent в ~/.ssh/config
echo "Host *
ForwardAgent no" >> ~/.ssh/config
