Уязвимость CVE-2023-38408: Удаленное выполнение кода в OpenSSH через ssh-agent
Уязвимость CVE-2023-38408: Удаленное выполнение кода в OpenSSH через ssh-agent
Категория: Программы Теги: Уязвимости Опубликовано: 3 апреля 2025

Уязвимость 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)

Для успешной атаки необходимо:

  1. Доступ к переадресованному ssh-agent: Жертва должна использовать SSH-соединение с включенной опцией ForwardAgent (например, ssh -A user@host).

  2. Возможность подключения к атакуемой системе: Злоумышленник должен иметь возможность установить SSH-соединение или воспользоваться скомпрометированными учетными записями.

  3. Уязвимая версия 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-ключам, конфиденциальным файлам и сетевым ресурсам.


Рекомендации по защите

  1. Обновление OpenSSH:
    Установите версию 9.3p2 или новее. Команда для проверки версии:

    ssh -V  
  2. Отключение переадресации ssh-agent:
    Избегайте использования ssh -A. Если переадресация необходима, ограничьте её настройками в sshd_config:

    AllowAgentForwarding no  
  3. Ограничение загрузки библиотек:
    Используйте политики SELinux или AppArmor для блокировки загрузки неподписанных библиотек.

  4. Мониторинг активности ssh-agent:

    • Проверяйте журналы (/var/log/auth.log) на подозрительные подключения.

    • Используйте команду ssh-add -L для аудита ключей, загруженных в агент.

  5. Сегментация сети:
    Ограничьте доступ к SSH-портам (22/TCP) с помощью фаервола.


Пример защиты от атаки

# Проверка и обновление OpenSSH на Linux (Debian/Ubuntu)  
sudo apt update  
sudo apt upgrade openssh-server  

# Отключение ForwardAgent в ~/.ssh/config  
echo "Host *  
    ForwardAgent no" >> ~/.ssh/config  
Алексей Черемных Алексей Черемных
87