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应用造成影响。
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的使用。
RequestHeader unset Range
4) 作为权宜之计,可部署Range标头计数模块:
http://people.apache.org/~dirkx/mod_rangecnt.c
某些平台的预编译二进制文件位于:
http://people.apache.org/~dirkx/BINARIES.txt