Skip to main content

La popular biblioteca de Python urllib3 está expuesta a una vulnerabilidad de denegación de servicio

Escrito por
Headshot of Hayley Denbraver

Hayley Denbraver

Python feature

9 de marzo de 2020

0 minutos de lectura

Urllib3, un potente y popular cliente HTTP de Python, está expuesto a una vulnerabilidad de denegación de servicio descubierta recientemente. Urllib3 se usa en todo el ecosistema de Python: más de 1200 paquetes lo incluyen como dependencia, entre ellos paquetes populares como requests, selenium, kubernetes y otros. Si tienes un proyecto de Python, es muy probable que estés usando urllib3.

El año pasado informamos sobre una vulnerabilidad de inyección CRLF en urllib3.

Vulnerabilidad de denegación de servicio

En la versión 1.25.2, se agregó lógica a util/url.py para codificar en formato porcentual los caracteres no válidos en el destino de la solicitud. El método _encode_invalid_chars, tal como está escrito, permite un ataque de denegación de servicio. El arreglo percent_encodings contiene todas las coincidencias de codificaciones porcentuales. No se eliminan los duplicados. Para una URL de longitud N, el tamaño de percent_encodings corresponde a un tiempo de ejecución lineal. El siguiente paso (normalizar los bytes ya codificados en formato porcentual) también tiene un tiempo de ejecución lineal por cada codificación porcentual, lo que resulta en un tiempo de ejecución polinómico (O(n2)). Esta ineficiencia podría aprovecharse deliberadamente para consumir CPU y provocar una denegación de servicio. Si se eliminaran los duplicados de percent_encodings, el tiempo de cálculo de _encode_invalid_chars correspondería al tiempo de ejecución lineal, más eficiente.

El método vulnerable se actualizó en la versión 1.25.8 para mejorar su eficiencia y ya no es vulnerable a este tipo de ataque de denegación de servicio.

¿Mi proyecto es vulnerable?

Debido al uso generalizado de urllib3 en el ecosistema de Python, conviene revisar tus proyectos de Python para saber si usas las versiones vulnerables. Para solucionar el problema, actualiza urllib3 a la versión estable más reciente (1.25.8). Como muchos paquetes de Python dependen de urllib3, es probable que la vulnerabilidad esté presente en tu proyecto como dependencia indirecta. Esto significa que, según cuál sea tu dependencia de nivel superior, quizá no puedas actualizarla en todos los casos.

Con Snyk, revisar tus dependencias de Python es fácil. Tenemos un nivel gratuito que incluye análisis ilimitados de proyectos de código abierto y 200 análisis al mes de repositorios privados. Hace poco, Snyk mejoró la compatibilidad con Python en Snyk Open Source, lo que permite a los desarrolladores corregir vulnerabilidades en las dependencias con la ayuda de pull requests de corrección automatizada. ¡Analiza tu proyecto hoy mismo!

A Snyk le encanta Python

En Snyk, nos encanta el código abierto y queremos que se mantenga lo más saludable posible. Con ese objetivo, informamos sobre nuevas vulnerabilidades, no porque los paquetes sean malos (no lo son), sino porque queremos ayudar a los desarrolladores a usar software de código abierto de forma segura. También queremos ayudar a quienes descubren nuevas vulnerabilidades a reportarlas de manera responsable. Puedes divulgar las vulnerabilidades que hayas encontrado o las que falten en Snyk Vulnerability Database, y te ayudaremos a verificar la vulnerabilidad y a contactar a la persona encargada del mantenimiento. Obtén más información aquí.

Empieza con los desafíos de Capture the Flag

Aprende a resolver desafíos de captura la bandera con nuestro taller virtual introductorio a pedido.