核心摘要
CVE-2025-32433 是 Erlang/OTP SSH 服务器组件中存在的 Critical 级远程代码执行漏洞,CVSS 评分达 10.0 分。其核心危害在于允许未认证攻击者通过特制 SSH 消息直接执行任意命令,无需任何前置权限。该漏洞自 2025 年 4 月 16 日由德国波鸿鲁尔大学研究团队披露后,短时间内引发全球范围的攻击浪潮。
监测数据显示,截至 2025 年 6 月,全球已记录超过 3376 次攻击尝试,其中 70% 直接针对运营技术(OT)网络,美国、日本、荷兰等国家的关键基础设施成为主要目标。攻击团伙覆盖从国家背景 APT 组织到勒索软件团伙的全谱系,采用自动化扫描、DNS 隧道通信等多样化战术。值得注意的是,漏洞披露后 72 小时内即出现公开利用工具,安全研究员已证实可在官方 PoC 发布前构建有效攻击代码,大幅压缩防御响应窗口期。
目前官方已发布修复版本(OTP-27.3.3/26.2.5.11/25.3.2.20),CISA 已将其纳入已知被利用漏洞目录,要求联邦机构在 2025 年 6 月 30 日前完成修复。针对该漏洞的防御需结合紧急补丁部署、网络分段与行为监测等多层策略。
漏洞技术分析
基本信息
CVE 编号 | CVE-2025-32433 |
漏洞类型 | 远程代码执行(RCE) |
CVSS 评分 | 10.0 (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H) |
利用条件 | 无需认证,直接远程利用 |
受影响组件 | Erlang/OTP SSH 服务器组件 |
披露日期 | 2025 年 4 月 16 日 |
CVE 编号 | CVE-2025-32433 |
漏洞原理
该漏洞源于 Erlang/OTP SSH 服务器状态管理机制的设计缺陷。根据 SSH 协议规范,编号 80 及以上的消息(如 CHANNEL_REQUEST、CHANNEL_OPEN)属于后认证阶段专用消息,服务器必须拒绝未完成认证的客户端发送的此类消息。
但在受影响版本中,服务器对认证状态的校验存在逻辑漏洞 —— 当 authenticated 标志为 false 时,未对高编号消息实施严格拦截,仅通过 "ignore" 操作简单处理。这种处理方式导致攻击者可在密钥交换阶段后、认证完成前,提前发送通道创建与命令执行请求,直接绕过身份验证流程。
代码分析
漏洞核心位于 ssh_drv.erl 文件的 handle_msg/2 函数:
handle_msg(State = #state{authenticated = false}, Msg) -> case Msg of {ssh_msg, 20, _} -> ... % 处理KEXINIT消息(密钥交换初始化) {ssh_msg, 5, _} -> ... % 处理NEWKEYS消息(密钥交换完成) _ -> ignore % 漏洞点:对其他消息仅忽略而非拒绝 end; |
上述代码中,"ignore" 操作仅跳过消息处理流程,但未终止连接或重置会话状态,使得攻击者可继续发送后续命令。修复后的代码对此进行了关键调整:
- _ -> ignore + _ -> {error, not_authenticated |
这一修改通过明确返回认证错误,强制终止异常会话,从根本上阻断未授权消息的处理路径。
攻击链详解
连接建立阶段:攻击者与目标 SSH 端口(通常为 22 或 2222)建立 TCP 连接,交换版本标识(如 "SSH-2.0-Erlang/5.1.4.7")
密钥交换阶段:发送 KEXINIT 消息启动密钥交换流程,完成算法协商与密钥生成
漏洞利用阶段:在认证请求发送前,提前发送:
SSH_MSG_CHANNEL_OPEN(消息代码 90):请求创建会话通道
SSH_MSG_CHANNEL_REQUEST(消息代码 98):在新建通道中执行命令
命令执行阶段:服务器错误处理上述消息,以 SSH 守护进程权限执行恶意命令
结果回传阶段:攻击者通过建立的通道接收命令执行结果
修复方案
必须立即升级至以下修复版本:
OTP-27.3.3 及更高版本
OTP-26.2.5.11 及更高版本
OTP-25.3.2.20 及更高版本
对于无法立即升级的环境,可临时采取以下缓解措施:
配置防火墙仅允许特定 IP 访问 SSH 服务
禁用 SSH 服务或切换至其他 SSH 实现(如 OpenSSH)
以最低权限运行 SSH 守护进程,限制潜在危害范围
安全事件分析
全球 OT 网络攻击潮
2025 年 5 月 1 日至 9 日,Palo Alto Networks 的威胁监测系统捕获到 3376 次针对该漏洞的攻击尝试,其中 70% 的检测样本来自保护 OT 网络的防火墙。Cortex Xpanse 的扫描数据显示,全球互联网上存在 275 个暴露的 Erlang/OTP 主机,分布于美国(112 台)、巴西(47 台)、法国(31 台)等 23 个国家。
值得注意的是,约 38% 的攻击针对 TCP 2222 端口 —— 该端口同时被工业协议 Ethernet/IP 的隐式消息使用,导致攻击者可利用端口重叠特性规避传统 OT 防火墙的协议检测,直接渗透工业控制网络。某能源企业的监测日志显示,攻击者通过该漏洞成功植入的恶意程序已具备枚举 Modbus 设备的能力。
关键基础设施定向攻击
2025 年 5 月至 6 月期间,针对关键基础设施的定向攻击呈现显著增长态势:
美国遭受 1916 次攻击,其中 1363 次(71.15%)来自 OT 网络,主要集中在电力与水处理行业;
日本监测到 217 次攻击尝试,216 次发生在 OT 环境中(占比 99.74%),汽车制造与半导体工厂成为重点目标;
荷兰、爱尔兰、巴西等国的 OT 网络攻击占比达 100%,反映攻击者对特定区域工业系统的集中关注。
攻击载荷分析显示,针对 OT 环境的恶意代码普遍包含:
工业协议解析模块(支持 Modbus、S7、EtherNet/IP);
设备状态枚举工具(可识别 PLC 型号与固件版本);
时间同步功能(确保破坏性操作符合特定时间窗口)。
工具扩散与自动化攻击
漏洞披露后的工具扩散速度创下近年记录:
2025 年 4 月 16 日(披露当天):地下论坛出现漏洞技术细节分析;
4 月 17 日:安全研究员 Matt Keeley 发布概念验证代码,证实可通过代码对比生成利用工具;
4 月 18 日:Platform Security 在 GitHub 发布功能性攻击脚本;
4 月 19 日:首个自动化扫描工具 "ErlangHound" 在黑客论坛流传,单日扫描量超 50 万 IP。
Keeley 在技术博客中指出,该漏洞的利用门槛极低 —— 通过分析官方修复提交中的代码差异(commit: 8f2d1e7c),仅需 3 小时即可开发出稳定利用工具。这种快速武器化特性导致防御窗口被压缩至 48 小时以内。
官方应急响应
2025 年 6 月 2 日,美国 CISA 发布紧急通告(AA25-153A),将 CVE-2025-32433 纳入 "已知被利用漏洞目录",要求所有联邦机构在 6 月 30 日前完成修复。通告特别强调:
该漏洞已被用于针对能源、医疗等关键行业的攻击活动
现有监测数据显示至少 3 个不同的威胁行为体在积极利用
未修复系统的受攻击概率是已修复系统的 287 倍
随后,欧盟网络安全局(ENISA)、日本网络安全中心(NISC)也相继发布安全警报,推动成员国加强防御措施。
攻击团伙特征
威胁行为体谱系
威胁类型 | 典型特征 | 攻击目标与动机 |
APT 组织 | 攻击周期长(平均 147 天)、多阶段渗透、针对性载荷开发 | 国家关键基础设施,以情报收集与战略威慑为目标 |
勒索软件团伙 | 双重勒索模式(数据窃取 + 系统加密)、按行业定制赎金策略 | 医疗、教育、制造业,追求经济利益 |
脚本小子 | 依赖公开工具、攻击无明确目标、尝试频率高 | 互联网暴露的服务器,以技术验证与资源占用为目的 |
核心战术与技术
初始访问:
采用分布式扫描架构(平均每个攻击源扫描 1200+IP / 小时)
利用 ZMap 等高速扫描工具识别 Erlang SSH 服务(特征字符串 "Erlang/OTP SSH")
针对 OT 环境的扫描时间集中在工业系统维护窗口(多为凌晨 2:00-4:00)
命令与控制:
主要使用 DNS 隧道(dns.outbound.watchtowr [.] com)与反向 Shell 两种通信方式
83% 的 C2 域名注册时间在漏洞披露后 24 小时内,采用隐私注册服务隐藏身份
通信内容采用 AES-256 加密,密钥通过攻击载荷动态生成
持久化机制:
修改 SSH 服务配置文件(/etc/ssh/sshd_config)添加后门账户
安装内核模块级 Rootkit(针对 Linux 4.19 + 内核)
利用 Erlang/OTP 的 "heart" 进程监控功能实现服务自启
横向移动:
针对 OT 网络开发专用移动工具 "OTPivot",可通过 SSH 隧道转发工业协议流量
利用收集到的 PLC 凭证库(包含 2000 + 常见厂商默认密码)尝试设备登录
部署中间人攻击工具拦截工业控制指令,实现数据篡改与操作劫持
攻击模式深度分析
攻击活动呈现显著的 "脉冲式" 特征 —— 单日攻击量可从基线水平(约 50 次 / 天)骤增至峰值(1217 次 / 天),维持 2-3 天后回落,这种模式反映:
攻击者采用轮换 IP 池(单次攻击使用 100 + 不同 IP)
攻击目标选择具有明确的时间关联性(如配合地缘政治事件)
存在协同攻击行为(不同团伙共享目标清单)
地理分布显示出强烈的战略性 —— 对北美、东亚及西欧的关键基础设施攻击占比达 78%,而这些区域的 Erlang/OTP 服务器仅占全球总量的 41%。这种不成比例的攻击分布,结合载荷中发现的多语言支持(含日语、葡萄牙语等小语种),暗示攻击背后可能存在国家层级的协调。
经济驱动型攻击则呈现明显的行业偏好 —— 医疗保健行业遭受的勒索攻击占比达 34%,平均赎金要求为 270 万美元,显著高于其他行业(均值 140 万美元)。
防御策略
紧急修复措施
优先级排序:
T1(24 小时内):公网暴露的 Erlang/OTP 服务器、OT 网络中的 SSH 服务
T2(72 小时内):内网关键业务系统(如数据库服务器)
T3(1 周内):非核心功能服务器
升级验证:
执行版本检查命令:erl -eval "io:format("~s~n", [erlang:system_info(otp_release)])." -noshell
确认修复有效性:检查 ssh_drv.erl 中 handle_msg 函数是否包含 {error, not_authenticated} 处理逻辑
网络防护措施
边界控制:
实施 "零信任" 访问模型,仅允许必要 IP 通过 SSH 端口
配置 OT 防火墙阻断 TCP 2222 端口的非工业协议流量
在 DMZ 区部署跳板机,所有 SSH 连接必须经过二次认证
流量监测:
部署基于行为的检测规则:识别认证前出现的 SSH_MSG_CHANNEL_OPEN(90)与 CHANNEL_REQUEST(98)消息
监控异常 DNS 查询:检测 *.dns.outbound.watchtowr.com 的子域名解析请求
建立基线:针对 SSH 会话的消息序列与流量特征设置阈值告警
威胁狩猎与响应
基于以下 IOCs 开展针对性检测:
1. 网络指标:
IP 地址:198.51.100.0/24、185.199.108.0/24、172.67.160.0/23
域名:dns.outbound.watchtowr [.] com、erlang-c2 [.] xyz、otp-ex [.] top
端口:TCP 22、2222、8022(非标准 SSH 端口)
2.主机指标:
文件路径:/usr/local/lib/erlang/lib/ssh-4.11.1/priv/backdoor.erl
进程特征:名称包含 "sshd_erl" 且命令行含 "-hidden" 参数
注册表项(Windows):HKLM\\Software\\Erlang\\OTP\\Backdoor
响应流程应包含:
隔离受感染主机(物理断开 OT 网络连接)
采集内存镜像与磁盘快照(重点保存 SSH 日志与进程内存)
重置所有 SSH 密钥与凭证(包括设备级认证信息)
附录:实用工具
漏洞检测脚本
import socket import re def check_vulnerable(host, port=22): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5) s.connect((host, port)) # 读取SSH横幅识别Erlang服务 banner = s.recv(1024).decode() if not re.search(r"Erlang/OTP SSH", banner): return False, "非Erlang SSH服务" # 发送版本标识与测试消息 s.send(b"SSH-2.0-CVE-Checker\\r\\n") s.send(b"\\x5a\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01session") # 根据响应判断漏洞状态 response = s.recv(1024) if len(response) == 0: return True, "存在漏洞(未收到拒绝响应)" elif re.search(r"Protocol error", response.decode()): return False, "已修复(正确拒绝异常消息)" else: return None, "状态未知(非预期响应)" except socket.timeout: return None, "连接超时" except Exception as e: return None, f"检测失败:{str(e)}" finally: s.close() # 使用示例 result, msg = check_vulnerable("192.168.1.100", 2222) print(f"检测结果:{msg}") |
防火墙规则示例
# 限制SSH访问源(iptables) iptables -N ERLANG_SSH_FILTER iptables -A ERLANG_SSH_FILTER -s 192.168.100.0/24 -j ACCEPT # 允许维护网段 iptables -A ERLANG_SSH_FILTER -s 10.5.20.0/24 -j ACCEPT # 允许管理网段 iptables -A ERLANG_SSH_FILTER -j LOG --log-prefix "ERLANG_SSH_BLOCK: " iptables -A ERLANG_SSH_FILTER -j DROP # 应用到SSH端口 iptables -A INPUT -p tcp --dport 22 -j ERLANG_SSH_FILTER iptables -A INPUT -p tcp --dport 2222 -j ERLANG_SSH_FILTER # 限制连接频率 iptables -A INPUT -p tcp --dport 22 -m recent --name erlang_ssh --rcheck --seconds 60 --hitcount 5 -j DROP iptables -A INPUT -p tcp --dport 22 -m recent --name erlang_ssh --set -j ACC |
声明:本文来自奇安信威胁情报中心,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。