将头部范围修复应用于apache 2.0.59问题CVE-2011-3192

我一直在尝试将build议的修复程序应用于Apache的CVE-2011-3192,这是要添加到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 

我们仍然需要使用范围标题,以便取消整个范围部分不是真正的select。 任何想法得到这个工作?

坏消息! 2.0.59中的mod_headers在validation代码中似乎不太适合环境variables。

它parsing如下:

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

对于未unset ,2.0.59validation是这样的,如果在指令名后面有第三个参数( 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; } } 

所以,它仍然将环境parsing为value位置,但是由于未envclause并不具有价值,因此重新排列。 所以,现在, RequestHeader unset Range env=bad-range工作,但是RequestHeader unset Range bytes=0-1000 env=bad-range仍然抛出validation错误..并且RequestHeader unset Range bytes=0-1000可能只是在运行时爆炸。


要解决这个问题,不缺less不好的select – 修补然后重新编译mod_headers才能正常工作是一种select,或者只是扁平化升级Apache。 但是,可能值得一试,用set (无validation错误)来清空头部,而不是使用unset

 RequestHeader set Range "badrange" env=bad-range 

在我检查的Apache 2.2上,“Range”字段中的垃圾数据将被忽略; 本质上是一个有效的解决scheme。