Por que o modsecurity requer o Content-Length em solicitações POST?

7

Eu tenho um serviço web RESTful que aceita uma solicitação POST para um recurso sem um corpo de entidade, por exemplo, uma solicitação POST vazia. A configuração padrão de segurança de segurança requer que todas as solicitações POST tenham um comprimento de conteúdo:

# Require Content-Length to be provided with every POST request
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective HTTP_Content-Length "^$"

O console do modsecurity relata isso como um PROTOCOL_VIOLATION / EVASION. No entanto, não vejo isso como verdadeiro na minha leitura do HTTP / 1.1 RFC . Um servidor tem permissão para solicitar Content-Length (retornando 400 ou 411), mas não vejo nada que diga que um servidor deva (ou uma recomendação que deveria) se comportar dessa maneira.

Isso possivelmente varia de acordo com o navegador, mas os clientes Flash que fazem solicitações POST sem entidades de entidade não enviam um cabeçalho de solicitação. Nem se enrola quando você faz 'curl -XPOST ...'. Por estas razões, e porque acredito que a regra modsecurity seja uma má interpretação da especificação HTTP, estou considerando levantar o requisito para um cabeçalho Content-Length em solicitações POST em nossa configuração.

Alguém sabe se houve uma exploração específica para a qual essa regra foi criada? Inúmeras pesquisas no Google e só encontrei referências a isso como parte da configuração de proteção de estoque.

    
por toolbear74 16.09.2009 / 02:33

2 respostas

8

Antes de mais nada, você deve saber que está executando uma versão obsoleta do ModSecurity (ramificação 1.x). Se você estiver executando o Apache 2.0.x, você deve atualizar para o ModSecurity 2.x. Se você ainda estiver executando o Apache 1.3.x, então eu tenho medo que você não tenha escolha, já que o ModSecurity 2.x não funcionará com ele. O ModSecurity 1.x em si não é conhecido por ser vulnerável, mas seu mecanismo de regras é muito inflexível para as demandas de hoje.

Se bem me lembro, o ModSecurity 1.x exigia solicitações POST para especificar o comprimento do conteúdo simplesmente porque ele não suportava corpos de solicitação em partes (a forma alternativa de enviar corpos de solicitação, em que o comprimento total não é conhecido até o final) . Organismos com pedidos em pedaços eram incrivelmente raros (estamos falando de 2003, 2004) e ainda são raros (embora alguns dispositivos móveis estejam usando-os).

Não há tais restrições no ModSecurity 2.x.

Se você remover essa regra, criará um grande buraco através do qual alguém poderia se esgueirar em um ataque não detectado. Por outro lado, posso argumentar que, com você executando o ModSecurity 1.x, existem outras maneiras de fazer o mesmo. Como alternativa, ajuste a regra para recusar solicitações que tenham o conjunto de cabeçalhos de solicitação Transfer-Encoding. Você deveria estar seguro com isso.

Divulgação: escrevi o ModSecurity.

    
por 01.12.2009 / 20:35
0

Acredito que o requisito é parte da especificação xml-rpc, em vez da especificação http. Se você não está atrás de xml-rpc, eu acho que seria uma coisa boa para omitir.

Eu não sei muito sobre as razões de sua inclusão geral no mod_security, a menos que ele estivesse originalmente lá para evitar algum tipo de estouro de buffer esotérico.

    
por 16.09.2009 / 10:21