
Воспроизведение cve-2025-32433-erlang_ssh_rce_reproduction
Оценка CVSS: 10.0 (КРИТИЧЕСКАЯ)
Статус: Активная эксплуатация в дикой природе
Раскрытие: июнь 2025
CVE-2025-32433 — это критическая уязвимость удалённого выполнения кода без аутентификации в реализации SSH-сервера (приложение ssh), поставляемой вместе с Erlang/OTP. Ошибка находится в логике обработки SSH-соединений до завершения аутентификации, то есть для эксплуатации не требуются действительные учётные данные. Злоумышленник, имеющий доступ к уязвимому SSH-порту Erlang (обычно 22 или нестандартные порты, используемые RabbitMQ, Riak, CouchDB и т. п.), может выполнять произвольные команды оболочки на целевой системе.
Уязвимость была обнаружена исследователем безопасности Felix "xcz" Lange и сообщена через процесс раскрытия уязвимостей OTP. Публичный PoC-код появился в течение 72 часов после публикации рекомендаций, а сразу после раскрытия были замечены многочисленные злоумышленники, сканирующие уязвимые SSH-баннеры (SSH-2.0-Erlang/OTP-*).
Уязвимость существует в реализации SSH в Erlang, расположенной в приложении ssh из состава OTP. Конкретно, ошибка заключается в том, как SSH-демон обрабатывает сообщения инициализации обмена ключами до фазы аутентификации.
Модули ssh_bind.erl и ssh_connection_handler.erl не выполняют корректную проверку переходов конечного автомата при обработке некоторых неупорядоченных или повреждённых сообщений протокола SSH. Отправляя специально сформированный пакет SSH_MSG_KEXINIT или особым образом созданное сообщение запроса службы во время фазы обмена ключами, злоумышленник может заставить виртуальную машину Erlang:
По сути, это уязвимость небезопасной десериализации термов Erlang в сочетании с обходом конечного автомата. Функция binary_to_term/1 в Erlang применяется к управляемым злоумышленником входным данным без включённого режима safe, что позволяет создавать произвольные атомы и вызывать любые зарегистрированные процессы.
Attacker Vulnerable Erlang SSH Server
│ │
│──── TCP Connect (port 22) ──────────→│
│ │
│←── SSH-2.0-Erlang/OTP-26.x banner ──│
│ │
│──── SSH_MSG_KEXINIT (crafted) ──────→│
│ │
│──── [malformed service request] ────→│ ← State machine confused
│ │
│──── [binary_to_term payload] ───────→│ ← Unsafe deserialization
│ │
│←── Remote shell / cmd execution ────│
Ключевая особенность в том, что обработчик SSH-соединений переходит в непредусмотренное состояние, в котором вызывает binary_to_term для входящих данных до завершения рукопожатия безопасности. Встраивая вредоносный терм Erlang, кодирующий полезную нагрузку выполнения команд (например, с использованием erlang:open_port/2 с spawn), злоумышленник получает возможность выполнять код с привилегиями процесса виртуальной машины Erlang.
Типичная полезная нагрузка использует внешний формат термов Erlang для кодирования:
{run, "cmd.exe /c <command>"}
-- or --
{spawn, "<command>"}
Эти термы при декодировании функцией binary_to_term/1 взаимодействуют с конечным автоматом SSH-соединения и выполняют системные команды.
Как правило, достаточно снять баннер:
# A vulnerable service responds with:
SSH-2.0-Erlang/OTP-26.1
SSH-2.0-Erlang/OTP-25.2
SSH-2.0-Erlang/OTP-27.0
# A patched service responds with:
SSH-2.0-Erlang/OTP-26.2.6
SSH-2.0-Erlang/OTP-27.3.2
Любая версия Erlang/OTP ниже указанных выше исправленных номеров уязвима.
paramiko или доступ к raw-сокетам (PoC использует raw-сокеты)# Build a vulnerable Erlang container
FROM erlang:26.1-alpine
RUN echo "root:toor" | chpasswd && \
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
CMD ["erlexec", "ssh:daemon(8222)"]
Либо используйте существующий уязвимый сервис в вашей сети.
Определите уязвимую цель по баннеру:
nc -w 3 <target> 22
# Look for: SSH-2.0-Erlang/OTP-
Запустите PoC-эксплойт:
python exploit.py --target 192.168.1.100 --port 22 --command "whoami"
Проверьте выполнение:
[+] CVE-2025-32433 Erlang/OTP SSH Pre-Auth RCE
[+] Target: 192.168.1.100:22
[+] Banner: SSH-2.0-Erlang/OTP-26.1
[+] Triggering vulnerability...
[+] Payload sent.
[+] Response: root
[!] Exploit succeeded
Предоставленный exploit.py реализует рабочий PoC, который:
Эксплойт использует три ключевых компонента:
ssh_bind.erl и ssh_transport.erlОбновите Erlang/OTP (наивысший приоритет):
# On Debian/Ubuntu
sudo apt-get update && sudo apt-get install erlang-base=1:27.3.2-1
# On RHEL/CentOS
sudo yum update erlang
# Source build
wget https://github.com/erlang/otp/releases/download/OTP-27.3.2/otp_src_27.3.2.tar.gz
tar xzf otp_src_27.3.2.tar.gz
cd otp_src_27.3.2
./configure && make && sudo make install
Ограничьте доступ по SSH (временное решение):
# Firewall rules to limit SSH source IPs
iptables -A INPUT -p tcp --dport 22 -s <trusted_networks> -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
Отключите Erlang SSH, если он не используется:
% In sys.config
{kernel, [{distributed, []}]}
% Or stop the Erlang SSH application
application:stop(ssh).
Ищите аномальные паттерны SSH-рукопожатий:
131, 104 и т. д.)epmd, beam.smp)Эта информация предоставлена только в образовательных целях и для авторизованного тестирования безопасности. Несанкционированное использование этого эксплойта против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения, является незаконным. Авторы не несут ответственности за любое неправомерное использование.
Структура репозитория:
cve-2025-32433-erlang_ssh_rce_reproduction/
├── README.md # This file
├── exploit.py # Python PoC exploit
└── LICENSE # MIT (for PoC code only)
| Продукт | Затронутые версии | Исправленные версии |
|---|
| Erlang/OTP | < 27.3.2, < 26.2.6, < 25.3.3 | 27.3.2+, 26.2.6+, 25.3.3+ |
| Elixir (через Erlang) | Все версии, работающие на уязвимом OTP | Перекомпилирован с исправленным OTP |
| RabbitMQ | < 3.12.14, < 3.13.7 (на уязвимом OTP) | 3.12.14+, 3.13.7+ с исправленным OTP |
| Riak KV/TS | < KV 2.9.6, < TS 1.5.5 (на уязвимом OTP) | Обновлённые пакеты с исправленным OTP |
| CouchDB | < 3.3.3 (при использовании Erlang SSH) | 3.3.3+ или отключите SSH |
| Ejabberd | < 24.06 (на уязвимом OTP) | 24.06+ с исправленным OTP |