Rack因处理URL编码请求体时存在内存耗尽漏洞,易受DoS攻击

本文详细分析了Rack框架中一个高严重性漏洞(CVE-2025-61919),该漏洞允许攻击者通过发送特制的、无大小限制的URL编码请求体,导致服务器内存耗尽,从而引发拒绝服务攻击。

Rack因无限制URL编码请求体解析而存在内存耗尽DoS漏洞

漏洞详情

CVE ID: CVE-2025-61919 GHSA ID: GHSA-6xw4-3v39-52mm 严重程度: 高 (CVSS评分 7.5)

受影响版本

  • bundler 包管理器下的 rack (RubyGems)
  • 受影响的具体Rack版本:
    • < 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 请求体来消耗进程内存,导致速度变慢或被操作系统终止。其影响与请求大小和并发量呈线性关系。即使配置了解析限制,该问题也在这些限制生效之前发生。

缓解措施

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

参考链接

CVSS v3.1 指标

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

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

弱点分类

  • CWE-ID: CWE-400 - 不受控制的资源消耗

致谢

  • 漏洞报告者: Pirikara
  • 修复开发者: jeremyevans
  • 修复审核者: ioquatix

发布日期: 2025年10月10日 最后更新: 2025年10月13日

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计