martes, 14 de septiembre de 2010

cookies y sus tamaños


Hoy que me han dejado algo de tiempo para leer y ponerme al día, he estado leyendo entre otras cosas, este magnífico paper de la presentación de Robert Hansen y Josh Sokol en Blackhat, sobre cómo HTTPS no es bastante para garantizar la confidencialidad de la información de un sitio web. En el paper, y después en este post, se menciona un detalle que llama la atención: es posible hacer una denegación de servicio, no a un sitio web entero, sino a una porción del mismo nada más.

¿Cómo?. Inyectando una cookie demasiado grande en el navegador del usuario. En el caso de que un sitio web reciba una cookie demasiado grande... ¿qué puede pasar?. Algunas opciones posibles para que se dé este DoS son:
  • el valor de la cookie malformada, una vez recibido por el servidor de web, es almacenada en una o más variables en el aplicativo web correspondiente. Podría darse el caso de que esta variable tenga un límite de tamaño, y por tanto que fuera posible realizar un overflow. Y por tanto, ser posible una denegación de servicio. Esta posibilidad depende, por supuesto, de cómo se haga la gestión de memoria a nivel de sistema y en el entorno de ejecución correspondiente. Aquí va un ejemplo (extraído de la guía Owasp Testing) , en que se usa esta posibilidad sobre un aplicativo web CGI (o sea, tecnológicamente más viejo que la tos)
  • en tecnologías más modernas, podría ocurrir que la cookie de marras, al tener un valor malformado, no fuera tratada adecuadamente por la lógica del programa y se disparara una excepción no controlada (el resto os lo podéis imaginar)
  • el servidor de web recibe una petición HTTP más grande de lo que puede tratar, y la rechaza
El tercer punto es el más curioso: ¿cuál es el tamaño máximo de una petición HTTP?. Se configura en cada servidor de web. IIS 6.0 tiene un valor predeterminado de 16 KB, de acuerdo a este artículo de la web de Symantec. Para aplicaciones ASP.NET, parece que es 4MB (es el valor por defecto del parámetro httpruntimesection.maxrequestlength). Apache Tomcat 5.5 tiene un valor por defecto de 4 KB, 8 KB en Tomcat 6.0, según su documentación (véase parámetro maxHttpHeaderSize). Y es diferente para otros servidores (me gustaría tener una lista más completa, pero no tengo más tiempo para hacerla, por desgracia).

La idea, entonces, es inyectar una cookie en el navegador del usuario (con un xss, por ejemplo), lo suficientemente grande como para que se rechace la petición HTTP, asignándole como ruta una parte determinada del sitio web atacado (/logout.aspx, por ejemplo). ¿Cuál es el tamaño máximo que puede tener una cookie, en un navegador web?. ¿Cuántas cookies puedo tener por dominio?. El RFC 2965 dice que un navegador debería ("should") permitir al menos 20 cookies por dominio, con un tamaño máximo garantizado para cada una de 4 KB al menos. Internet Explorer parece que cumple de sobra, de acuerdo a este post de IEBlog de 2007.

Con lo cual, pues parece que este tipo de DoS es perfectamente posible, aunque cantará muchísimo en los logs del servidor de web, proxies, IDS, etc. No he contado nada que no se supiera ya, pero espero que la información de este post sirva: yo mismo no me sabía los detalles de los tamaños, etc, y me ha costado lo mío buscarlos. Cualquier aportación (particularmente si hay erratas), es bienvenida. Slds!

Si te gustó esta entrada, quizás quieras suscribirte al blog por RSS...

2 comentarios:

E.Cortijo dijo...

Hola amigo, muy bueno tu analisis, leo detenidamente tu articulo el cual merece la pena indagar más para conocer sus extensas posibilidades.

Saludos desde Venezuela
E.Cortijo

des dijo...

Muchísimas gracias E.Cortijo :)