
我一直在尝试将建议的修复程序应用于 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
我们仍然需要使用范围标头,因此取消设置整个范围部分实际上不是一个选项。有什么想法可以让它发挥作用吗?
答案1
坏消息! 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 上,“范围”字段中的垃圾数据将被忽略;本质上,这是一种有效的取消设置。