Ataques DoS efectivos mediante colisiones de hashes

Durante la conferencia 28c3 (28th Chaos Communication Congress) de finales del año pasado en Berlín, Alexander “alech” Klink y Julian “zeri” Wälde ofrecieron una interesante charla titulada "Ataques de denegación de servicio eficientes sobre plataformas de aplicaciones web". En ella hablan de ataques basados en colisiones de hashes que causan fácilmente pérdidas de servicio en un gran porcentaje de aplicaciones web.

Pero, ¿en qué consisten estos ataques?. Muchas aplicaciones web automáticamente recogen los parámetros de cada petición y los pegan en un hash de pares de claves para aumentar el rendimiento y la velocidad. La idea es "colisionar" estos hashes mediante peticiones http post para que el servidor objetivo consuma una gran cantidad de CPU al procesarlos.

Si un atacante es capaz de entender los valores usados en el algoritmo de hashing puede pre-calcular un conjunto de valores de hashes que den como resultado el mismo. Comparar estos hashes se convierte en una función cuadrática que puede crear una carga muy pesada en el servidor web.

Por ejemplo, enviar aproximadamente dos megabytes de valores que computan el mismo hash provoca que el servidor tenga que comparar más de 40 billones de strings. Wow!

Es fácil encontrar estas colisiones en lenguages que no aleatorizan las funciones de hashing: node.js/v8, php, python, ASP, ruby, java, etc. Sólo unos pocos se salvan, como cruby (1.9 ~2008) o perl (5.8.1 ~2003). De hecho se comenzó esta investigación a partir de la FAQ de seguridad de Perl (perldoc perlsec) en la que se habla de un fallo de seguridad en versiones anteriores a la 5.8.1, que permitían ataques de colisiones de hashes. Podéis encontrar los lenguajes y versiones afectas y parcheadas aquí.

Y finalmente, ¿cómo puedo explotar esta vulnerabilidad? Pues existe una herramienta escrita en Java que puede ayudar a comprobar fácilmente si nuestro servidor es vulnerable: PostTester. Eso sí, la versión gratuita está limitada sólo a direccionamiento privado (127.0.0.x, 10.xxx, 172.16.xx a 172.31.xx y 192.168.xx).


Comentarios