CVE-2025-61772CVE-2025-61772是Rack Web服务器接口中的一个高危拒绝服务(DoS)漏洞,CVSS评分为7.5分。Rack是Ruby生态系统中广泛使用的模块化Web服务器接口,为Ruby Web应用框架(如Rails和Sinatra)提供HTTP请求和响应的处理能力。该漏洞存在于Rack::Multipart::Parser组件中,影响2.2.19、3.1.17和3.2.2之前的所有版本。
漏洞的根本原因在于Rack::Multipart::Parser在解析multipart/form-data格式的HTTP请求时,未对multipart part的header block大小设置上限。当攻击者发送一个multipart part的header block缺少终止标识(CRLFCRLF,即空行)时,解析器会持续将接收到的字节追加到内存中,而不进行任何大小限制检查。这种行为导致内存使用量无界增长,最终耗尽服务器内存资源。
该漏洞的影响范围广泛,所有处理multipart上传的Ruby Web应用都可能受到影响。攻击者可以通过远程方式(无需认证和用户交互)发送精心构造的不完整multipart头部数据,触发服务器内存的大量消耗,导致进程因OOM(Out of Memory)被终止或严重性能下降。由于影响随着请求大小限制和并发量的增加而放大,该漏洞在高流量生产环境中尤其危险。
在HTTP协议中,multipart/form-data编码格式用于文件上传等场景。每个multipart part由header block和body两部分组成,header block以一个空行(CRLFCRLF,即\r\n\r\n)作为终止标识,随后才是part的body内容。
Rack::Multipart::Parser在解析multipart数据时,期望找到header block的终止空行(CRLFCRLF)来确定header部分的边界。然而,在2.2.19、3.1.17和3.2.2之前的版本中,该解析器缺少对header block大小的限制检查。具体而言:
1. 当解析器接收到multipart part的header数据但未找到CRLFCRLF终止符时,它会持续将新到达的字节追加到内部缓冲区中;
2. 由于没有设置per-part header的最大尺寸限制(如64 KiB),攻击者可以通过发送大量不包含终止空行的header数据,使缓冲区无限增长;
3. 每个到达的字节都会被分配内存并存储,导致进程内存使用量持续攀升;
4. 最终,系统因内存耗尽触发OOM Killer终止进程,或因频繁的内存分配/垃圾回收导致严重性能下降。
利用方式极为简单:攻击者只需构造一个multipart请求,其中包含一个part的header数据故意不包含CRLFCRLF终止符,并持续发送大量数据。由于攻击向量为网络(AV:N),无需认证(PR:N)和用户交互(UI:N),该漏洞可通过远程方式轻松利用。
修复方案是在Rack::Multipart::Parser中添加per-part header的大小限制(如64 KiB),当header数据超过该限制时抛出异常或拒绝处理,从而防止无界内存消耗。