Ruby IPAddr正则表达式拒绝服务漏洞分析与修复

Ruby IPAddr ReDoS漏洞分析报告

漏洞概述

在Ruby的IPAddr库中发现了一个正则表达式拒绝服务漏洞。该漏洞存在于IPAddr.new方法的参数验证过程中,攻击者可以通过构造特定的恶意输入导致正则表达式匹配时间呈指数级增长。

漏洞详情

问题代码位置

# lib/ipaddr.rb第525行
def mask!(mask)
  case mask
  when String
    case mask
    when /\A(0|[1-9]+\d*)\z/  # 存在ReDoS漏洞的正则表达式
      prefixlen = mask.to_i

漏洞利用原理

正则表达式/\A(0|[1-9]+\d*)\z/在处理包含大量重复字符的字符串时会出现性能问题。特别是当输入类似'1' * 50000 + '.'的字符串时,匹配过程会消耗大量计算资源。

攻击向量

# 攻击示例
IPAddr.new("0.0.0.0/" + '1' * 50000 + '.')  # 触发ReDoS

影响范围

受影响的方法

  • IPAddr.new
  • IPAddr#include?
  • IPAddr#==
  • IPAddr#|
  • IPAddr#&

Rails框架影响

由于ActionDispatch::RemoteIp中间件使用了IPAddr.new方法,攻击者可以通过伪造X-Forwarded-For头进行攻击:

# Rails中的易受攻击代码
def ips_from(header)
  ips = header.strip.split(/[,\s]+/)
  ips.select do |ip|
    range = IPAddr.new(ip).to_range  # 存在漏洞的调用
    range.begin == range.end
  rescue ArgumentError
    nil
  end
end

性能测试数据

Ruby 3.1.1(存在漏洞)

       user     system      total        real
   0.000056   0.000003   0.000059 (  0.000055)
   0.002921   0.000003   0.002924 (  0.002968)
   0.300863   0.000694   0.301557 (  0.302580)
  31.050866   0.103006  31.153872 ( 31.255489)

Ruby 3.2.0(已修复)

       user     system      total        real
   0.000033   0.000001   0.000034 (  0.000031)
   0.000056   0.000077   0.000133 (  0.000134)
   0.000385   0.000050   0.000435 (  0.000435)
   0.003579   0.000456   0.004035 (  0.004035)

修复方案

官方修复

该漏洞在Ruby 3.2版本中通过正则表达式引擎优化得到修复。Ruby 3.1版本已结束生命周期,建议用户升级到Ruby 3.2或更高版本。

缓解措施

  • 使用nginx等反向代理服务器限制HTTP头长度(约8KB)
  • 更新到不受影响的Ruby版本

时间线

  • 2022年2月19日:漏洞报告提交
  • 2022年3月7日:状态改为已处理
  • 2025年6月3日:确认为已修复状态
  • 2025年7月8日:报告公开披露

结论

该ReDoS漏洞在Ruby 3.2及以上版本中已得到有效修复。建议所有使用IPAddr库的Ruby应用程序升级到安全版本,以避免潜在的服务拒绝攻击风险。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

posted @ 2025-09-23 11:04  qife  阅读(11)  评论(0)    收藏  举报