Apache HTTP Server畸形Range选项处理远程拒绝服务漏洞

Http协议之Byte Range http://www.ietf.org/rfc/rfc2616.txt (14.35章节)

14.35   Range ....................................................138
   14.35.1    Byte Ranges ...........................................138
   14.35.2    Range Retrieval Requests ..............................139

Apache演示
1. 新建内容为abcdefghijk的txt页面
2. 不带Byte Range Header的请求,请看:


3.带Byte Range Header的请求,请看:


理论上,一旦带上N个Range分片,Apache单次请求压力就是之前的N倍(实际少于N),需要做大量的运算和字符串处理。
故构建无穷的分片,单机DOS攻击,就能搞垮Apache Server。
解决方案

1.启用SetEnvlf和mod_rewrite检测访问中是否有大量的Range,若有的话,则忽略该Range请求头或直接拒绝请求。

需要说明的是,上述临时解决方案主要是让Apache应对Range头选项阈值超过5时的疑似攻击请求,不会对一般的Web应用造成影响。

但如果Web应用中提供PDF数据、视频流媒体等信息,则需要调整Range头选项阈值到更大的数值


 Option 1:(适用于Apache 2.0、2.2)

 

# Drop the Range header when more than 5 ranges.  

# CVE-2011-3192

LoadModule rewrite_module modules/mod_rewrite.so

SetEnvIf Range (,.*?){5,} bad-range=1  

RequestHeader unset Range env=bad-range  

# optional logging.  

CustomLog logs/range-CVE-2011-3192.log common env=bad-range  


Option 2:(也适用于Apache 1.3)

 

# Reject request when more than 5 ranges in the Range: header.  

# CVE-2011-3192  

#  

LoadModule rewrite_module modules/mod_rewrite.so

RewriteEngine on  

RewriteCond %{HTTP:range} !(^bytes=[^,]+(,[^,]+){0,4}$|^$)  

RewriteRule .* - [F]  


2.限制访问字段大小为几百字节。

 

LimitRequestFieldSize 200  


3.对于不是下载站点来说,建议禁用Byte Range,使用mod_header来彻底禁止Range header的使用。

 
LoadModule rewrite_module modules/mod_rewrite.so

RequestHeader unset Range


4) 作为权宜之计,可部署Range标头计数模块:

     http://people.apache.org/~dirkx/mod_rangecnt.c

   某些平台的预编译二进制文件位于:

         http://people.apache.org/~dirkx/BINARIES.txt
posted @ 2014-07-18 14:16  princessd8251  阅读(6203)  评论(0编辑  收藏  举报