Rack多部分解析器内存耗尽漏洞分析
漏洞概述
Rack::Multipart::Parser在处理multipart/form-data请求时,会将非文件表单字段(不含文件名的部分)完全存储在内存中作为Ruby字符串对象。单个大型文本字段(数百MB或更多)可能消耗等效的进程内存,导致内存不足(OOM)条件和拒绝服务(DoS)。
技术细节
在多部分解析过程中,文件部分会被流式传输到临时文件,但非文件部分会被缓冲到内存中:
|
|
这些内存缓冲区没有大小限制。因此,任何大型文本字段(虽然在技术上是有效的)在添加到参数之前都会完全加载到进程内存中。
影响范围
攻击者可以发送大型非文件字段来触发过度内存使用。影响随请求大小和并发性而扩展,可能导致工作进程崩溃或严重的垃圾回收开销。所有处理多部分表单提交的Rack应用程序都会受到影响。
缓解措施
升级修复
使用已修复的Rack版本,该版本对非文件字段实施了合理的大小限制(例如2 MiB)。
临时解决方案
- 在Web服务器或代理层限制最大请求体大小(例如Nginx的client_max_body_size)
- 在应用程序级别验证并拒绝异常大的表单字段
参考信息
- GHSA-w9pc-fmgc-vxvw
- https://nvd.nist.gov/vuln/detail/CVE-2025-61771
- rack/rack@589127f
- rack/rack@d869fed
- rack/rack@e08f78c
- https://github.com/rubysec/ruby-advisory-db/blob/master/gems/rack/CVE-2025-61771.yml
受影响版本
- < 2.2.19
-
= 3.1, < 3.1.17
-
= 3.2, < 3.2.2
修复版本
- 2.2.19
- 3.1.17
- 3.2.2
安全评分
CVSS v3.1基础评分:7.5(高危) 攻击向量:网络 攻击复杂度:低 所需权限:无 用户交互:无 范围:未改变 机密性:无影响 完整性:无影响 可用性:高影响