Rack多部分解析器内存耗尽漏洞分析与修复

本文详细分析了Rack多部分解析器在处理大型非文件字段时存在的内存耗尽漏洞,该漏洞可能被利用导致拒绝服务攻击,同时提供了升级修复版本和临时缓解措施的建议。

漏洞详情

包管理工具

  • bundler
  • rack (RubyGems)

受影响版本

  • < 2.2.19
  • = 3.1, < 3.1.17

  • = 3.2, < 3.2.2

已修复版本

  • 2.2.19
  • 3.1.17
  • 3.2.2

漏洞描述

概述

Rack::Multipart::Parser将非文件表单字段(没有文件名的部分)完全作为Ruby字符串对象存储在内存中。单个大型文本字段(数百兆字节或更多)在多部分/表单数据请求中可能消耗等效的进程内存,可能导致内存不足(OOM)条件和拒绝服务(DoS)。

详细说明

在多部分解析期间,文件部分被流式传输到临时文件,但非文件部分被缓冲到内存中:

1
2
body = String.new  # 非文件 → 内存缓冲区
@mime_parts[mime_index].body << content

这些内存缓冲区没有大小限制。因此,任何大型文本字段——虽然在技术上是有效的——都将在添加到参数之前完全加载到进程内存中。

影响

攻击者可以发送大型非文件字段来触发过度内存使用。影响随着请求大小和并发性而扩展,可能导致工作进程崩溃或严重的垃圾收集开销。所有处理多部分表单提交的Rack应用程序都会受到影响。

缓解措施

升级:使用修复版本的Rack,该版本对非文件字段实施了合理的大小限制(例如2 MiB)。

临时解决方案

  • 在Web服务器或代理层限制最大请求体大小(例如Nginx的client_max_body_size)
  • 在应用程序级别验证并拒绝异常大的表单字段

参考资料

安全评分

CVSS总体评分:7.5/10(高危)

CVSS v3基础指标

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

EPSS评分:0.051%(第16百分位)

弱点分类

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

产品未能正确控制有限资源的分配和维护,从而使攻击者能够影响消耗的资源量,最终导致可用资源耗尽。

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