Apache-2.2

將標頭範圍修復應用於 apache 2.0.59 問題 CVE-2011-3192

  • March 7, 2016

我一直在嘗試將建議的修復應用於 CVE-2011-3192 的 apache,該修復將添加到 httpd.conf

# Drop the Range header when more than 5 ranges. 
# CVE-2011-3192 
SetEnvIf Range (,.*?){5,} bad-range=1 
RequestHeader unset Range env=bad-range

但是,在 Apache 2.0.59 中,configtest 說

Syntax error on line .... 
header unset takes two arguments

我們仍然需要使用範圍標頭,因此取消設置整個範圍部分並不是一個真正的選擇。關於讓它發揮作用的任何想法?

壞消息! 2.0.59 中的 mod_headers 在其驗證程式碼中似乎不能很好地處理環境變數。

它解析如下:

RequestHeader {action} {inhdr} {value} {envclause}

對於unset, 2.0.59 像這樣驗證,如果value指令名稱後有第三個參數 ( ),則廢棄指令:

if (new->action == hdr_unset) {
   if (value)
       return "header unset takes two arguments";
}

所以,按預期RequestHeader unset Range工作和休息……但也會休息。RequestHeader unset Range bytes=0-1000``RequestHeader unset Range env=bad-range

有人在某個地方發現了這一點,而目前版本則這樣做了——將論點放在它們所屬的地方:

if (new->action == hdr_unset) {
   if (value) {
       if (envclause) {
           return "header unset takes two arguments";
       }
       envclause = value;
       value = NULL;
   }
}

所以,它仍然解析envclause到該value位置,但由於 unset 不帶值,它會相應地重新排列。所以,現在,RequestHeader unset Range env=bad-range工作,但RequestHeader unset Range bytes=0-1000 env=bad-range仍然拋出一個驗證錯誤..並且RequestHeader unset Range bytes=0-1000可能只是在執行時爆炸。


要解決這個問題,不乏糟糕的選擇——修補然後重新編譯 mod_headers 以使其正常工作是一種選擇,或者只是徹底升級 Apache。但是,用(沒有驗證錯誤)清空標題可能值得一試set,而不是使用unset

RequestHeader set Range "badrange" env=bad-range

在我檢查的 Apache 2.2 上,“範圍”欄位中的垃圾數據將被忽略;本質上,一個有效的未設置。

引用自:https://serverfault.com/questions/305032