Ayer los chicos de Apache han publicado nuevas revisiones de todas las versiones mayores de Tomcat (más concretamente, las revisiones 7.0.23, 6.0.35 y 5.5.35) de Tomcat. Todas las versiones anteriores del servidor de aplicaciones son vulnerables a un ataque de denegación de servicio que puede permitir a un atacante con muy poco ancho de banda y con un solo equipo quitar de la red a un servidor potente de un modo sencillo.
Las versiones Tomcat 7.0.22 y anteriores, 6.0.34 y anteriores, y 5.5.34 y anteriores, son vulnerables a este ataque. Este ataque se debe a que Tomcat para almacenar los parámetros que le llegan y las peticiones http emplea una estructura tipo HashSet, y realiza un hash sencillo de los datos para decidir en qué ""bucket"" va cada dato. Dentro de cada bucket hay una lista enlazada que contienen los datos que han generado el mismo hash.
Al igual que sucede siempre con los HashSet, mientras los hashes de los elementos a almacenar estén bien repartidos y caigan en ""bukets"" diferentes a ceder a un elemento es una operación con un coste constante independientemente del número de elementos almacenados. Pero si un montón de elementos caen en el mismo buket, no queda más remedio que iterar por la lista de elementos buscando el elemento concreto que necesitamos.
Este ataque en cuestión fue hecho público en un congreso de Hackers y no afecta sola Tomcat, sino que afecta prácticamente a todos los servidores web del planeta, ya que todos estaban empleando el mismo algoritmo de hashing. El ataque sencillamente consiste en generar peticiones http con parámetros tales que generen el mismo hash. Por tanto, todos terminan en un buket, y acceder a los parámetros requiere una cantidad considerable de operaciones. Los servidores atacados terminan con picos continuos de CPU del 100%.
Dado lo sencillo del ataque, puede realizarse con un único PC con un módem, y con este modesto equipo pueden tumbarse servidores. En este parche de Tomcat lo único que han hecho es poner un límite máximo al número de parámetros que van a almacenar; en versiones posteriores resolverán a este problema debidamente (empleando un algoritmo de hashing tal que los valores que va a generar no sean predecibles fácilmente por el atacante).
En cualquier caso, toca a actualizar la versión de Tomcat a todo el mundo que tenga una introducción...