Назад | Перейти на главную страницу

Применение исправления диапазона заголовков к проблеме 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

Нам по-прежнему требуется использование заголовка диапазона, поэтому отключение всей части диапазона на самом деле не вариант. Есть мысли о том, как заставить это работать?

Плохие новости! mod_headers в 2.0.59 похоже, не очень хорошо работает с переменными среды в коде проверки.

Он разбирает так:

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, который я проверял, нежелательные данные в поле «Диапазон» просто игнорируются; по сути, эффективный ансет.