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