Rack多部分解析器存在无限制头缓冲区,可能导致拒绝服务攻击(内存耗尽)

本文详细分析了CVE-2025-61772漏洞,该漏洞存在于Rack的多部分解析器中,允许攻击者通过发送不完整的头部数据来无限制消耗服务器内存,最终导致拒绝服务。

漏洞概述

Ruby的Rack库中的多部分解析器(Rack::Multipart::Parser)存在一个安全漏洞(CVE-2025-61772)。该漏洞允许远程攻击者通过发送格式错误的多部分请求,导致服务器内存无限制增长,从而引发拒绝服务(DoS)。

受影响版本

  • bundler管理的rack
  • RubyGems (rack):
    • < 2.2.19
    • = 3.1, < 3.1.17

    • = 3.2, < 3.2.2

已修复版本

  • 2.2.19
  • 3.1.17
  • 3.2.2

技术细节

漏洞原理

在解析多部分表单数据的每个部分(part)的头部时,解析器会持续读取数据,直到遇到表示头部结束的特定终止符CRLFCRLF(即两个连续的回车换行)。解析器使用的关键代码是:

1
@sbuf.scan_until(/(.*?\r\n)\r\n/m)

如果恶意请求的某个部分的头部始终不包含这个终止符,解析器就会持续将接收到的字节数据追加到内存缓冲区(@sbuf.concat(content)),而没有任何大小上限。这使得攻击者可以通过一个格式错误的部件,消耗与整个请求体大小成比例的内存。

影响

攻击者可以发送包含不完整多部分头部的请求来触发高内存使用。这可能导致进程因内存不足(OOM)而被终止,或造成严重的性能下降。所有处理文件上传或多部分表单数据的Rack应用都可能受到影响。

缓解措施

  1. 升级:将Rack升级到已修复的版本。修复方案为每个部分的头部大小设置了上限(例如64 KiB)。
  2. 临时方案:在升级之前,可以在代理服务器或Web服务器层面(例如Nginx的client_max_body_size)限制最大请求体大小,以控制潜在的内存消耗。

相关链接

  • GHSA-wpv5-97wm-hp9c
  • NVD漏洞详情:CVE-2025-61772
  • Rack修复提交:589127f, d869fed, e08f78c
  • Ruby安全咨询数据库条目

安全评分

  • CVSS 3.1 总体评分: 7.5 (高危)
  • CVSS 向量: AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
    • 攻击向量:网络
    • 攻击复杂度:低
    • 所需权限:无
    • 用户交互:无
    • 影响范围:未改变
    • 机密性影响:无
    • 完整性影响:无
    • 可用性影响:高
  • 弱点类型: CWE-400 不受控制的资源消耗

致谢

  • 报告者: kwkr
  • 修复开发者: jeremyevans
  • 修复审阅者: ioquatix
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计