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