本文件介绍了影响 Erlang/OTP 平台内置 SSH 服务器实现的漏洞 CVE-2025-32433。
该漏洞是一种无需身份验证即可远程执行任意代码 (RCE) 的漏洞,影响多个 Erlang/OTP 分支(补丁发布前):
Erlang/OTP 被广泛用作可扩展分布式系统的基础,并集成在许多知名项目的技术栈中(例如即时通讯软件、消息代理、高负载 Web 服务)。
SSH 基础库中存在关键的 RCE 漏洞,使得使用 Erlang/OTP 作为服务器或具有开放 SSH 访问权限的组件的基础设施面临风险。
逐步分析该漏洞并展示完整的研究周期:
收集并整理材料:
查找并系统化有关 CVE-2025-32433 的公开数据,描述其本质及潜在影响。
确定 CPE 和配置条件:
列出受漏洞影响的 CPE 及配置条件列表。
开发 PoC/利用程序:
在测试环境中创建并演示可工作的利用原型。
安全批量检查方法:
描述三种检查易受攻击主机的方法:
本项研究 纯粹出于教育和道德目的,仅在受控测试环境中进行。
作者 对任何滥用所提供信息的行为不承担任何责任。
请仅将此信息用于学习及提升您系统的安全性。
Erlang 是一种为构建高并发、高容错系统而设计的编程语言。
其平台 Open Telecom Platform (OTP) 多年来一直用于关键基础设施——从电信到金融领域。
在 OT(运营技术)环境和 5G 网络中,Erlang/OTP 因其可扩展性及以最小停机时间确保系统持续运行的能力而备受青睐。
为了实现远程管理,这些网络常使用 Erlang/OTP 内置的 SSH 实现。
正是这一点使得 CVE-2025-32433 漏洞对此类环境尤其危险。
Erlang/OTP 中的安全通信由其自身的 SSH 实现提供,该实现:
该实现中的漏洞允许具有网络访问权限的攻击者 无需身份验证即可执行任意代码,从而对易受攻击的资产构成直接威胁。
根据全球互联网扫描数据(Cortex Xpanse,2025 年 4 月),易受攻击的 Erlang/OTP SSH 服务 在互联网上广泛可用,不仅运行在标准端口上,还运行在例如 TCP 端口 2222 上。
该端口常用于过时的工业自动化组件以及 Ethernet/IP 隐式消息传递协议,从而扩大了可能的攻击向量。
该漏洞与 Erlang/OTP 版本中包含的 SSH 版本有关。
易受攻击服务在多种行业特有端口上的分布,形成了显著的全球攻击面。
遥测数据显示,超过 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 服务器,或者服务器位于隔离网络中,则无法利用该漏洞。
该漏洞的产生原因是 Erlang/OTP 内置 SSH 服务器错误地处理了 预身份验证 过程。
两种连接协议消息起着关键作用——SSH_MSG_CHANNEL_OPEN 和 SSH_MSG_CHANNEL_REQUEST。
根据 RFC 4254 标准,此类消息应 仅在用户成功身份验证后 才被接收。
任何提前发送它们的尝试都应立即导致连接中断。
在 CVE-2025-32433 的情况下,SSH 守护进程未能确保此规则的执行,从而允许攻击者在未提供有效凭据的情况下打开会话通道并发送包含任意命令的 exec 请求。
换言之,这导致 未经身份验证的远程代码执行 (RCE) —— 攻击者无需知道用户名、密码或密钥即可控制服务器。

SSH 连接 协议运行在 SSH 传输层和身份验证层之上。
它提供交互式登录、远程命令执行和端口转发功能。
在 Erlang/OTP 有漏洞的 SSH 实现中,正是这两个消息——SSH_MSG_CHANNEL_OPEN 和 SSH_MSG_CHANNEL_REQUEST(用于发起通道和请求命令)——成为攻击点:
攻击者可以发送特制的流量,诱骗系统在 身份验证之前 执行任意代码。

在本研究中,为 CVE-2025-32433 准备了一个可工作的概念验证程序。
CVE-2025-32433.py — Python 脚本,手动构造 SSH 数据包
(SSH_MSG_KEXINIT, SSH_MSG_CHANNEL_OPEN, SSH_MSG_CHANNEL_REQUEST) 并在 身份验证之前 发送它们。
这允许在易受攻击的 Erlang/OTP 版本中在服务器端执行任意命令——在 PoC 中,它创建了一个包含文本 cyberok 的文件 /lab.txt。
ssh_server.erl — 最小的 Erlang 模块,启动 OTP 内置 SSH 守护进程,监听端口 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 回调。
✅ 此类测试确认了 实际远程代码执行 (RCE) 的可能性,
但仅在隔离测试环境中进行。
nuclei -u 127.0.0.1:2222 -t erlang-active.yaml -code
与 nuclei 模板的区别:
运行脚本
⚠️ 运行前确保已安装并启动了 interactsh-client
python3 babyfon.py -f targets.txt -d your.interactsh_domain

运行后,在 interactsh-client 中检查 DNS 交互。 (示例中扫描两个目标:一个易受攻击,另一个已修补)



测试结论: