
В данном документе представлено исследование уязвимости CVE-2025-32433, затрагивающей реализацию встроенного SSH-сервера в платформе Erlang/OTP.
Эта уязвимость представляет собой возможность удалённого выполнения произвольного кода (Remote Code Execution, RCE) без необходимости аутентификации и затрагивает несколько веток Erlang/OTP до выхода патчей:
Erlang/OTP широко используется как основа для масштабируемых распределённых систем и входит в стек многих известных проектов (например, мессенджеры, брокеры сообщений, высоконагруженные веб-сервисы).
Наличие критической RCE-уязвимости в базовой библиотеке SSH ставит под угрозу инфраструктуру, использующую Erlang/OTP в качестве сервера или компонента с открытым SSH-доступом.
Пошагово рассмотреть уязвимость и продемонстрировать полный цикл исследования:
Сбор и структурирование материалов:
Найти и систематизировать публично доступные данные о CVE-2025-32433, описать суть и возможный импакт.
Определение CPE и условий конфигурации:
Привести список CPE и конфигурационных условий, для которых уязвимость актуальна.
Разработка PoC/Exploit:
Создать и продемонстрировать рабочий прототип эксплуатации на тестовой среде.
Методики безопасной массовой проверки:
Описать три способа проверки уязвимых хостов:
Данное исследование проводится исключительно в образовательных и этичных целях и выполнено только в контролируемой тестовой среде.
Автор не несёт ответственности за любое неправомерное использование представленных сведений.
Используйте эту информацию лишь для обучения и повышения уровня безопасности своих систем.
Erlang — язык программирования, созданный для построения высокопараллельных и отказоустойчивых систем.
Его платформа Open Telecom Platform (OTP) на протяжении многих лет применяется в критически важных инфраструктурах — от телекоммуникаций до финансового сектора.
В средах OT (операционные технологии) и в сетях 5G Erlang/OTP ценят за масштабируемость и способность обеспечивать непрерывную работу систем с минимальными простоями.
Для удалённого администрирования такие сети часто используют встроенную реализацию SSH в Erlang/OTP.
Именно это делает уязвимость CVE-2025-32433 особенно опасной для подобных сред.
Безопасное взаимодействие в Erlang/OTP обеспечивается собственной реализацией SSH, которая:
Уязвимость в этой реализации позволяет злоумышленнику, имеющему сетевой доступ, выполнить произвольный код без аутентификации, что создаёт прямую угрозу для уязвимых активов.
По данным глобального интернет-сканирования (Cortex Xpanse, апрель 2025), уязвимые сервисы Erlang/OTP SSH широко доступны в интернете и работают не только на стандартных портах, но и, например, на TCP-порту 2222.
Этот порт нередко используется устаревшими компонентами промышленной автоматизации и протоколом неявной передачи сообщений Ethernet/IP, что расширяет возможный вектор атак.
Уязвимость связана с версиями SSH, входящими в релизы Erlang/OTP.
Распространение уязвимых сервисов на портах, характерных для различных отраслей, формирует значительную глобальную поверхность атаки.
Телеметрия показала, что свыше 85 % попыток эксплуатации были зафиксированы на межсетевых экранах OT-сегмента следующих сфер:
В то же время, несмотря на высокую зависимость от OT, в секторах:
не выявлено факторов, которые бы способствовали активному распространению именно этой угрозы.
CVE-2025-32433 зарегистрирована в базе NVD со следующими типовыми CPE (Common Platform Enumeration):
cpe:2.3:a:erlang:otp:25:*:*:*:*:*:*:*cpe:2.3:a:erlang:otp:26:*:*:*:*:*:*:*cpe:2.3:a:erlang:otp:27:*:*:*:*:*:*:*Уязвимыми считаются минорные релизы ниже следующих патч-версий:
- 25.x — до 25.3.2.20 включительно
- 26.x — до 26.2.5.11 включительно
- 27.x — до 27.3.3 включительно
ssh:daemon/2), а не внешний openssh.22 или кастомный, например 2222) должен быть доступен для удалённых подключений из сети атакующего.ssh:daemon/2.⚠️ Если Erlang/OTP используется только как клиентская библиотека без поднятого SSH-сервера, или если сервер закрыт в изолированной сети, уязвимость не достижима.
Уязвимость возникает из-за того, что встроенный SSH-сервер Erlang/OTP некорректно обрабатывает процесс предварительной аутентификации.
Ключевую роль играют два типа сообщений протокола соединения — SSH_MSG_CHANNEL_OPEN и SSH_MSG_CHANNEL_REQUEST.
Согласно стандарту RFC 4254, такие сообщения должны приниматься только после успешной аутентификации пользователя.
Любая попытка отправить их раньше должна немедленно приводить к разрыву соединения.
В случае CVE-2025-32433 демон SSH не обеспечивает выполнение этого правила, что позволяет атакующему открыть канал сеанса и передать запрос exec с произвольной командой без предоставления валидных учётных данных.
Иными словами, это приводит к неаутентифицированному удалённому выполнению кода (RCE) — злоумышленник способен захватить управление сервером, не зная ни имени пользователя, ни пароля, ни ключа.

Протокол SSH Connection работает поверх транспортного и аутентификационного уровней SSH.
Он предоставляет функции интерактивного входа, удалённого выполнения команд и переадресации портов.
В уязвимой реализации SSH в Erlang/OTP именно два сообщения — SSH_MSG_CHANNEL_OPEN и SSH_MSG_CHANNEL_REQUEST, необходимые для инициации канала и запроса команд, становятся точкой атаки:
злоумышленник может отправить специально сформированный трафик, который обманом заставит систему выполнить произвольный код до прохождения аутентификации.

В рамках исследования подготовлен рабочий Proof-of-Concept для CVE-2025-32433.
CVE-2025-32433.py — Python-скрипт, который вручную формирует SSH-пакеты
(SSH_MSG_KEXINIT, SSH_MSG_CHANNEL_OPEN, SSH_MSG_CHANNEL_REQUEST) и
отправляет их до прохождения аутентификации.
Это позволяет в уязвимых версиях Erlang/OTP выполнить произвольную команду
на стороне сервера — в PoC она создаёт файл /lab.txt с текстом cyberok.
ssh_server.erl — минимальный Erlang-модуль, поднимающий встроенный
SSH-демон OTP на порту 2222. Он нужен только для демонстрации
и запускается внутри Docker-контейнера.
Dockerfile — рецепт сборки контейнера, в котором автоматически
компилируется указанная версия Erlang/OTP и запускается тестовый
SSH-сервер.
⚠️ Данный PoC предназначен исключительно для локального тестирования и образовательных целей. Не использовать в продуктивных или общедоступных сетях.
Соберите образ:
git clone https://github.com/iteride/CVE-2025-32433.git && cd CVE-2025-32433/POC/ && docker build -t cve-ssh .

Запустите образ
docker run -d --name cve-ssh -p 2222:2222 cve-ssh
Демонстрация POC

Пассивный шаблон ищет косвенные признаки уязвимости, не выполняя реальных атакующих действий.
Он анализирует только «поверхностную» информацию, которую сервис отдает сам:
Если обнаружена уязвимая версия (например, OTP 25.3.2.19 или 26.2.5.10), nuclei помечает хост как потенциально уязвимый.
⚠️ Такой подход безопасен: никаких вредоносных пакетов или попыток эксплуатации не производится.
nuclei -u 127.0.0.1:2222 -t erlang-passive.yaml
Активный шаблон выполняет контролируемую имитацию атаки:
он отправляет специально сформированные SSH-пакеты до аутентификации и проверяет, срабатывает ли уязвимость.
Для фиксации факта эксплуатации используется Interactsh — если удалённый сервер выполнил вредоносный запрос, на панели Interactsh появится DNS-callback.
✅ Такой тест подтверждает реальную возможность удалённого выполнения кода (RCE),
но проводится только в изолированной тестовой среде.
nuclei -u 127.0.0.1:2222 -t erlang-active.yaml -code
Отличия от nuclei-template:
Запуск скрипта
⚠️ Перед запуском убедитесь, что установлен и запущен interactsh-client
python3 babyfon.py -f targets.txt -d your.interactsh_domain

После запуска проверяем DNS-интеракции в interactsh-client. (В примере сканируются две цели: одна уязвима, другая уже пропатчена)



Вывод из тестов: