Rack 框架的 multipart 解析器存在内存耗尽漏洞,可导致拒绝服务

本文详细分析了 Ruby Rack 框架中一个高严重性漏洞(CVE-2025-61771)。该漏洞源于其 multipart 解析器在处理非文件表单字段时,会无限制地将整个字段内容缓冲在内存中,攻击者可借此发起拒绝服务攻击,导致应用程序内存耗尽。

漏洞详情

  • bundler
  • rack (RubyGems)

受影响版本

  • < 2.2.19
  • = 3.1, < 3.1.17

  • = 3.2, < 3.2.2

已修复版本

  • 2.2.19
  • 3.1.17
  • 3.2.2

描述

概述 Rack::Multipart::Parser 在解析 multipart/form-data 请求时,会将非文件表单字段(即没有文件名的部分)作为 Ruby String 对象完全存储在内存中。单个巨大的文本字段(例如数百兆字节或更大)会消耗等量的进程内存,可能导致内存不足(OOM)条件和拒绝服务(DoS)。

详细信息 在解析 multipart 请求时,文件部分会被流式传输到临时文件中,但非文件部分则被缓冲到内存:

1
2
body = String.new  # 非文件字段 → 内存中的缓冲区
@mime_parts[mime_index].body << content

对于这些内存缓冲区没有任何大小限制。因此,任何大的文本字段——虽然技术上有效——都会在添加到 params 之前被完全加载到进程内存中。

影响 攻击者可以通过发送包含巨大非文件字段的请求来触发过度的内存使用。其影响随着请求大小和并发量的增加而扩大,可能导致工作进程崩溃或严重的垃圾回收开销。所有处理 multipart 表单提交的 Rack 应用程序都会受到影响。

缓解措施

  • 升级:使用已修复的 Rack 版本,该版本对非文件字段的大小设置了合理的上限(例如 2 MiB)。
  • 变通方案
    • 在 Web 服务器或代理层(例如 Nginx 的 client_max_body_size)限制最大请求体大小。
    • 在应用程序层面验证并拒绝异常大的表单字段。

参考资料

安全评分

严重级别:高

CVSS 3.1 总分:7.5

CVSS v3 基础指标

  • 攻击向量:网络
  • 攻击复杂度:低
  • 所需权限:无
  • 用户交互:无
  • 范围:未改变
  • 机密性影响:无
  • 完整性影响:无
  • 可用性影响:高

向量字符串:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

EPSS 分数:0.056% (第17百分位数)

弱点

  • 弱点:CWE-400 不受控制的资源消耗
    • 该产品未能正确控制有限资源的分配和维护,从而使攻击者能够影响所消耗的资源量,最终导致可用资源耗尽。

标识符

  • CVE ID:CVE-2025-61771
  • GHSA ID:GHSA-w9pc-fmgc-vxvw
  • 源代码仓库:rack/rack

致谢

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