Rack 框架中因 URL 编码体解析未设限而存在内存耗尽 DoS 漏洞

本文详细分析了 CVE-2025-61919 漏洞,该漏洞影响 Rack 框架,攻击者可通过发送特制的、无长度限制的 URL 编码请求体,导致服务进程内存被耗尽,从而实现拒绝服务攻击。

漏洞详情

包管理工具 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

描述

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

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

1
form_vars = get_header(RACK_INPUT).read

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

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

缓解措施

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

参考

严重程度:高

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.081% (第 24 百分位)

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

CVE ID CVE-2025-61919

GHSA ID GHSA-6xw4-3v39-52mm

源代码 rack/rack

致谢

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