Rack内存耗尽DoS漏洞深度解析:URL编码表单处理中的无边界内存消耗风险

本文详细分析了CVE-2025-61919漏洞,该漏洞存在于Ruby的Rack中间件中。攻击者通过发送大型的URL编码表单数据,可导致服务器内存被完全耗尽,从而引发拒绝服务攻击。文章阐述了漏洞成因、影响范围及修复方案。

Rack 因无边界URL编码请求体解析而存在内存耗尽DoS漏洞·CVE-2025-61919·GitHub安全通告数据库

漏洞详情

概述

Rack::Request#POST在处理Content-Type: application/x-www-form-urlencoded的请求时,会通过调用rack.input.read(nil)将整个请求体读入内存,且未强制执行长度限制或上限。因此,大型请求体会在解析前被完全缓冲到进程内存中,导致通过内存耗尽实现拒绝服务(DoS)。

细节

在处理非多部分表单提交时,Rack的请求解析器执行以下操作:

1
form_vars = get_header(RACK_INPUT).read

由于read方法调用时未带参数,整个请求体将被加载到一个Ruby字符串中。该操作发生在查询参数解析或任何params_limit强制执行之前。因此,没有上游请求体大小限制的Rack应用程序可能会遭受与请求大小成比例的无边界内存分配。

影响

攻击者可以发送大型的application/x-www-form-urlencoded请求体来消耗进程内存,导致系统变慢或被操作系统因内存不足(OOM)而终止。其影响与请求大小和并发数呈线性比例关系。即使配置了解析限制,该问题在那些限制生效之前就已发生。

缓解措施

  • 更新至已修复的Rack版本,该版本使用query_parser.bytesize_limit强制执行表单参数限制,防止无边界读取application/x-www-form-urlencoded请求体。
  • 在代理或Web服务器层强制执行严格的请求体大小上限(例如,Nginx的client_max_body_size、Apache的LimitRequestBody)。

参考链接

技术信息

受影响的包

  • bundler
  • rack (RubyGems)

受影响的版本

  • < 2.2.20
  • >= 3.0, < 3.1.18
  • >= 3.2, < 3.2.3

已修复的版本

  • 2.2.20
  • 3.1.18
  • 3.2.3

严重性等级:高 CVSS v3.1 基础评分:7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)

弱点类型 CWE-400: 不受控制的资源消耗

标识符

  • CVE ID: CVE-2025-61919
  • GHSA ID: GHSA-6xw4-3v39-52mm

来源 rack/rack 代码仓库

致谢

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