Ataque do cabeçalho do host com proxies reversos

2

Então, fui encarregado de pesquisar um problema identificado por uma verificação de segurança da web da Acunetix.

Aqui estão os detalhes sobre a verificação: Host_header_attack
Detecção automatizada de ataques de cabeçalho de host

Eu não posso postar mais de dois links ainda, já que não tenho reputação suficiente, mas a referência skeletonscribe no primeiro dos links acima entra em mais detalhes sobre a exploração e parece ser a principal fonte sobre o assunto .

As soluções alternativas sugeridas sugerem o uso de aplicativos e hosts virtuais padrão 'fictícios' usando SERVER_NAME em vez de usar o Cabeçalho do host . Essas sugestões são ótimas quando se fala de um verdadeiro servidor de origem, mas não tanto quando você está usando um proxy reverso.

Nosso site que está sendo verificado pela Acunetix é configurado como um servidor de aplicativos localizado atrás de um proxy reverso. No nosso caso, o proxy reverso é iPlanet, mas eu confirmei o mesmo comportamento no Apache 2.4.7 com mod_proxy . Veja como funciona e por que ele dispara a digitalização Acunetix.

Quando uma solicitação é feita usando um URI absoluto (como faz o scanner), o servidor é, de acordo com a especificação RFC, destinado a ignorar o cabeçalho do Host e, em vez disso, usar o host que está dentro do URI absoluto. Esse é o comportamento que vemos e, como resultado, o host virtual correto é selecionado, mesmo se o cabeçalho do Host tiver um valor incorreto / malicioso. Até aí tudo bem.

O problema surge quando o proxy reverso passa essa solicitação para o servidor de origem de backend. Quando isso acontece, ele passa o cabeçalho original do host junto com a solicitação. Se o cabeçalho do Host tiver um valor incorreto ou mal-intencionado, ele será transmitido de volta ao servidor de origem. Se o servidor de origem não implementar hosts virtuais, não será necessário verificar se o cabeçalho do host está correto.

O resultado disso é que qualquer aplicativo em execução no servidor de origem / aplicativo de origem que tentar usar o valor do cabeçalho do host estará usando o valor do host mal-intencionado. O uso do SERVER_NAME não é de uso nesta instância, pois o nome do servidor (ou host verdadeiro) do site não é encaminhado pelo proxy reverso e o servidor de origem ainda responde com o valor do cabeçalho do Host. Usar UseCanonicalName e a diretiva ServerNam e aqui também é inútil, já que você precisa do nome do servidor da solicitação original, que pode ter mais de um valor.

Esse 'ataque' foi identificado em 2013, mas não consigo encontrar muitas informações sobre ele que não apenas reiterem os detalhes das referências acima. Não é um problema comum, porque os clientes HTTP não enviam URIs absolutos, a menos que estejam conversando com servidores proxy de encaminhamento. Isso significa que todas as solicitações regulares serão relativas a URIs e esse problema desaparece (os cabeçalhos de host mal-intencionado ficam presos no host virtual 'simulado' ou padrão no proxy reverso).

Eu criei uma solução alternativa, em que o proxy reverso ativamente define o cabeçalho do Host para o SERVER_NAME antes que a solicitação seja enviada para o back-end. Isso funciona, mas me preocupo se pode ser uma solução que vai contra as práticas / padrões da aposta. Definir o cabeçalho do Host como este quebra algo? Nós pensamos nisso, mas não consigo pensar em um cenário em que isso aconteceria. Eu estarei ligando para a Oracle amanhã para obter feedback deles.

Parece-me que este pode ser um caso tão periférico, que é apenas um descuido nos dois produtos de servidor web que experimentei, mas não consigo imaginar que algo iria passar tanto tempo sem ser abordado. Eu devo estar perdendo alguma coisa.

Desculpe, é muito tempo, mas alguma ideia? :) A parte 'questão' deste ensaio seria esta:

  1. A minha solução alternativa acima seria uma boa solução ou quebraria as coisas?
  2. Existe uma solução conhecida para este problema?
por Tom17 06.02.2015 / 03:35

2 respostas

3

Seu proxy reverso deve estar corrigindo o cabeçalho Host: por padrão. Isso não é um bug e deve ser reportado ao seu desenvolvedor (s).

De RFC 7230 seção 5.4 :

When a proxy receives a request with an absolute-form of request-target, the proxy MUST ignore the received Host header field (if any) and instead replace it with the host information of the request-target. A proxy that forwards such a request MUST generate a new Host field-value based on the received request-target rather than forward the received Host field-value.

Observe que a versão anterior desse RFC, a RFC 2616, era muito menos específica. Diz apenas :

An HTTP/1.1 proxy MUST ensure that any request message it forwards does contain an appropriate Host header field that identifies the service being requested by the proxy.

Não se pode dizer que o comportamento do seu proxy esteja de acordo com a especificação antiga ou a nova.

Enquanto isso, sua solução alternativa é aceitável, pois introduz o comportamento correto.

    
por 06.02.2015 / 03:50
0

Eu tenho o mesmo problema para corrigir, Acunetix relatou esta vulnerabilidade - Eu não tenho um proxy reverso, mas eu vim a mesma solução, eu defino explicitamente o cabeçalho do Host no vHost, então é sempre o que eu quero. No entanto, a execução da verificação novamente mostra que o problema ainda está presente.

Eu usei o Postman e o cURL para verificar minha solução e observei que os cabeçalhos do Host host ou do X-Forwarded malicioso não estavam mais sendo ecoados, mas o Acunetix ainda está mostrando a vulnerabilidade ...

Eu implementei 2 soluções:

1) Criada uma vqost catchall ... 2) Definir explicitamente o cabeçalho do Host no meu servidor vHost

O ponto 1 é proteger contra meramente alterar o cabeçalho do Host para evitar que o Apache passe a solicitação para o primeiro nome baseado no vHost e o ponto 2 classifique a modificação do X-Forwarded-Host.

O que mais há?

Apache 2.4 Ubuntu 14.04.5

    
por 18.11.2016 / 10:09