將標頭範圍修復應用於 apache 2.0.59 問題 CVE-2011-3192
我一直在嘗試將建議的修復應用於 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 上,“範圍”欄位中的垃圾數據將被忽略;本質上,一個有效的未設置。