Ruby IPAddr ReDoS漏洞分析报告
漏洞概述
在Ruby的IPAddr库中发现了一个正则表达式拒绝服务漏洞。该漏洞存在于IPAddr.new方法的参数验证过程中,攻击者可以通过构造特定的恶意输入导致正则表达式匹配时间呈指数级增长。
漏洞详情
问题代码位置
# lib/ipaddr.rb第525行
def mask!(mask)case maskwhen Stringcase maskwhen /\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.endrescue ArgumentErrornilend
end
性能测试数据
Ruby 3.1.1(存在漏洞)
user system total real0.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 real0.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智能小助手)
公众号二维码