Una vulnerabilidad descubierta por kingcope permite que los servidores Apache vulnerables sean susceptibles de sufrir una denegación de servicio.
La vulnerabilidad se encuentra en el uso de la cabecera Range
. Esta
cabecera se utiliza para obtener sólo una parte de la página. Si se
solicitan varias partes además de pedir que la respuesta se comprima,
mediante la cabecera Accept-Encoding: gzip
, se dispara el consumo de
procesador y memoria.
Existe un script que permite comprobar si el servidor es vulnerable y, si es el caso, explotar dicha vulnerabilidad.
Para comprobar si un servidor es vulnerable, podemos ejecutar:
$ telnet 127.0.0.1 80
HEAD / HTTP/1.1
Host: 127.0.0.1
Range: bytes=0-5
Accept-Encoding: gzip
Connection: close
Si la respuesta es un código 206 Partial Content
el servidor es
vulnerable:
HTTP/1.1 206 Partial Content
Date: Wed, 31 Aug 2011 11:52:13 GMT
Server: Apache/2.2.17 (Ubuntu)
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Range: bytes 0-5/20
Content-Length: 6
Connection: close
Content-Type: text/html;charset=UTF-8
Protección
Si tenemos un servidor vulnerable, podemos adoptar alguna de las siguientes medidas de protección.
-
Podemos deshabilitar la cabecera
Range
mediante la directivaRequestHeader
, usando el módulomod_headers
:RequestHeader unset Range
-
Limitar el número de intervalos mediante
mod_rewrite
:RewriteEngine On
RewriteCond %{HTTP:Range} ([0-9]-[0-9])(\s,\s[0-9]-[0-9])+ RewriteRule .* - [NS,L,F]
-
Deshabilitar el módulo
mod_deflate
:$ sudo a2dismod deflate