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

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

我一直在尝试将建议的修复程序应用于 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;
    }
}

因此,它仍在将解析envclausevalue位置,但由于 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 上,“范围”字段中的垃圾数据将被忽略;本质上,这是一种有效的取消设置。

相关内容