Rack多部分解析器内存消耗漏洞:大字段导致拒绝服务攻击

Rack的多部分表单解析器在处理大型非文件字段时,会将其完整缓存在内存中,导致攻击者可通过发送大型文本字段触发内存耗尽,造成拒绝服务。受影响的版本包括Rack 2.2.19之前、3.1.17之前和3.2.2之前。

漏洞详情

包管理器: 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将非文件表单字段(没有文件名的部分)完全作为Ruby字符串对象存储在内存中。单个大型文本字段(数百兆字节或更大)在multipart/form-data请求中可以消耗等量的进程内存,可能导致内存不足(OOM)条件和拒绝服务(DoS)。

详情 在多部分解析过程中,文件部分被流式传输到临时文件,但非文件部分被缓冲到内存中:

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

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

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

缓解措施

升级: 使用修补后的Rack版本,该版本对非文件字段强制执行合理的大小限制(例如2 MiB)。

临时解决方案:

  • 在Web服务器或代理层限制最大请求体大小(例如Nginx的client_max_body_size)。
  • 在应用程序级别验证并拒绝异常大的表单字段。

参考

严重性

CVSS总体评分: 7.5(高) CVSS v3基础指标:

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

CVSS向量: 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 设计