Rack 框架曝出内存耗尽DoS漏洞:无限URL编码表单解析的风险

本文详细介绍了CVE-2025-61919漏洞,该漏洞存在于Rack框架中。由于在处理`application/x-www-form-urlencoded`类型请求体时未限制读取大小,攻击者可发送超大请求导致服务器内存耗尽,从而引发拒绝服务攻击。文章阐述了漏洞细节、影响范围及修复方案。

漏洞概要

Rack(Ruby的Web服务器接口)在处理内容类型为 application/x-www-form-urlencoded 的表单提交时,其 Rack::Request#POST 方法会将整个请求体不加限制地读入内存。攻击者通过发送巨大的请求体,可导致服务器进程内存耗尽,从而引发拒绝服务攻击。

受影响版本

  • bundler 包管理器中的 rack gem(RubyGems)
  • 受影响的具体版本:
    • < 2.2.20
    • >= 3.0.0, < 3.1.18
    • >= 3.2.0, < 3.2.3

已修复版本

  • 2.2.20
  • 3.1.18
  • 3.2.3

漏洞详情

在处理非多部分表单提交时,Rack的请求解析器执行以下操作: form_vars = get_header(RACK_INPUT).read

由于 read 方法在调用时未指定参数(即 read(nil)),它会将整个请求体加载到一个Ruby字符串对象中。此操作发生在进行查询参数解析或应用任何 params_limit 限制之前。因此,如果上游(如代理或Web服务器)未设置请求体大小限制,Rack应用将面临与请求大小成比例的无限制内存分配风险。

影响

攻击者可以发送大型的 application/x-www-form-urlencoded 请求体来消耗服务器进程内存,导致服务变慢或被操作系统因内存不足而终止。其影响与请求大小和并发请求数呈线性关系。关键在于,即使应用程序配置了解析参数的数量限制,此内存分配问题在限制生效前就已经发生了。

缓解措施

  1. 升级:更新到已修复的Rack版本。修复后的版本使用 query_parser.bytesize_limit 来强制执行表单参数的大小限制,从而防止无限制地读取 application/x-www-form-urlencoded 请求体。
  2. 上游限制:在代理或Web服务器层强制执行严格的请求体最大尺寸限制。例如:
    • Nginx: 使用 client_max_body_size 指令。
    • Apache: 使用 LimitRequestBody 指令。

参考链接

安全信息

  • 严重等级:高
  • CVSS 3.1 分数: 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)
  • CWE 分类: CWE-400 - 不受控制的资源消耗
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计