CVSS 评分:10.0(严重)
状态:已在野外被积极利用
披露时间:2025 年 6 月
CVE-2025-32433 是 Erlang/OTP 附带的 SSH 服务器实现(ssh 应用)中的一个严重未认证远程代码执行漏洞。该缺陷位于 认证完成之前 的 SSH 连接处理逻辑中,这意味着触发漏洞利用无需任何有效凭据。能够访问易受攻击的 Erlang SSH 端口(通常为 22,或 RabbitMQ、Riak、CouchDB 等使用的自定义端口)的攻击者,可以在目标系统上执行任意 shell 命令。
该漏洞由安全研究员 Felix "xcz" Lange 发现,并通过 OTP 安全披露流程上报。在公告发布后 72 小时内即出现了公开 PoC 代码,且披露后立即观察到多个威胁行为者扫描易受攻击的 SSH 横幅(SSH-2.0-Erlang/OTP-*)。
该漏洞存在于 OTP 中 ssh 应用内的 Erlang SSH 实现中。具体而言,缺陷在于 SSH 守护进程在认证阶段之前如何处理 密钥交换发起消息。
ssh_bind.erl 和 ssh_connection_handler.erl 模块在处理某些乱序或格式错误的 SSH 协议消息时,未能正确验证状态机转换。通过在密钥交换阶段发送精心构造的 数据包或特制的 消息,攻击者可以诱使 Erlang VM:
这本质上是一个 不安全的 Erlang 项反序列化 漏洞,同时结合了 状态机绕过。Erlang 的 binary_to_term/1 函数在未启用 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 VM 进程的权限获得代码执行能力。
典型的载荷使用 Erlang 的外部项格式进行编码:
{run, "cmd.exe /c <command>"}
-- or --
{spawn, "<command>"}
这些项在被 binary_to_term/1 解码后,会与 SSH 连接状态机交互以执行系统命令。
| 产品 | 受影响版本 | 修复版本 |
|---|---|---|
| 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) |
通常,抓取横幅即可:
# 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 或原始套接字访问(PoC 使用原始套接字)# 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)