Aplicando a correção do intervalo do cabeçalho ao problema do apache 2.0.59 CVE-2011-3192

4

Eu tenho tentado aplicar a correção sugerida ao apache para o CVE-2011-3192, que era adicionar ao 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

No entanto, no Apache 2.0.59, o configtest diz

Syntax error on line .... 
header unset takes two arguments

Ainda exigimos o uso do cabeçalho do intervalo, de modo que a desconfiguração de toda a parte do intervalo não seja realmente uma opção. Alguma idéia de como fazer isso funcionar?

    
por M Bishop 25.08.2011 / 21:26

1 resposta

3

Más notícias! mod_headers in 2.0.59 não parece brincar com variáveis de ambiente em seu código de validação.

Ele analisa assim:

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

Para unset , 2.0.59 valida assim, descartando uma diretiva se ela tiver um terceiro argumento ( value ) após o nome da diretiva:

if (new->action == hdr_unset) {
    if (value)
        return "header unset takes two arguments";
}

Portanto, RequestHeader unset Range funciona e RequestHeader unset Range bytes=0-1000 quebra conforme pretendido, mas RequestHeader unset Range env=bad-range também quebra.

Alguém descobriu isso em algum lugar ao longo da linha, e as versões atuais fazem isso, em vez disso - colocando os argumentos onde eles pertencem:

if (new->action == hdr_unset) {
    if (value) {
        if (envclause) {
            return "header unset takes two arguments";
        }
        envclause = value;
        value = NULL;
    }
}

Então, ele ainda está analisando o envclause na value position, mas como unset não recebe um valor, ele se reorganiza de acordo. Então, agora, RequestHeader unset Range env=bad-range funciona, mas RequestHeader unset Range bytes=0-1000 env=bad-range ainda lança um erro de validação .. e RequestHeader unset Range bytes=0-1000 provavelmente explode em tempo de execução.

Para consertar, não faltam opções ruins - corrigir e recompilar mod_headers para funcionar corretamente é uma opção, ou apenas atualizar o Apache. Mas, pode valer a pena tentar esvaziar o cabeçalho com set (sem erros de validação), em vez de usar unset :

RequestHeader set Range "badrange" env=bad-range

No Apache 2.2 que eu verifiquei, os dados indesejados no campo "Range" serão simplesmente ignorados; em essência, um eficaz unset.

    
por 26.08.2011 / 03:29