Rack多部分解析器内存耗尽漏洞解析:CVE-2025-61771

本文详细分析了Ruby Rack框架中一个高危漏洞CVE-2025-61771。该漏洞源于其多部分数据解析器在处理不含文件名的表单字段时,会无限制地将整个字段内容缓冲在内存中,攻击者可借此发送超大文本字段导致服务内存耗尽,从而实现拒绝服务攻击。

Rack:多部分解析器将大型非文件字段完全缓冲在内存中,导致拒绝服务(内存耗尽)· CVE-2025-61771 · GitHub 安全公告数据库

漏洞详情

软件包

  • 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: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 设计