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

Rack(Ruby的Web服务器接口)在处理application/x-www-form-urlencoded类型的请求体时,会将整个请求体无限制地读入内存,导致攻击者可以通过发送大请求体发起内存耗尽拒绝服务攻击。

漏洞详情

摘要 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)。

参考信息

技术信息

受影响的包

  • 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:不受控制的资源消耗

信息来源

  • 报告者:Pirikara
  • 修复开发者:jeremyevans
  • 修复审查者:ioquatix
  • 发布于:2025年10月10日
  • 最后更新:2025年10月13日
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计