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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM