Zero-day en Python 3.8.0 a 3.8.3 causa colisión de hash que puede convertirse en un ataque DOS

Asignada como CVE.2020-14422, la vulnerabilidad en Python que afecta a las versiones 3.8.0, 3.8.1, 3.8.2 y 3.8.3 puede causar una colisión de hashes en IPv4 e IPv6., que puede convertirse en una denegación de servicio (DOS)

La vulnerabilidad se produce debido a la forma en la que interactúan IPv4Interface y IPv6Interface. Las funciones hash de estas clases siempre devuelven 32 y 64 respectivamente, pero Lib/ipaddress.py en las versiones de Python 3.8.0 a 3.8.3 calcula incorrectamente el valor del hash. Esto último permite a un atacante remoto causar una denegación de servicio si una aplicación se ve afectada por el rendimiento de un diccionario que contenga objetos IPv4Interface o IPv6Interface.

En la página de bugs de Python exponen que la raíz del error se encuentra en las líneas 1421 y 2095. Ambas líneas, self._ip y self.network.network_address son lo mismo, y en el momento de aplicarles xor se cancelan la una a la otra. Por lo tanto devuelven self._frefixlen.
Como self.prefixlen es una constante, 32 y 64 respectivamente, lleva a un hash constante.

La manera de arreglarlo es trivial, basta con cambiar la línea 1421 por:

return hash((self._ip, self._prefixlen, int(self.network.network_address)))

y la línea 2095 cambiarla por:

return hash((self._ip, self._prefixlen, int(self.network.network_address)))

Para parchear esta vulnerabilidad, OpenSuse han publicado como arreglarlo en esta página.

Más información

Python bugs
https://bugs.python.org/issue41004

Suse
https://www.suse.com/security/cve/CVE-2020-14422/

Androidrookies
https://androidrookies.com/zero-day-vulnerability-in-python-versions-3-8-0-to-3-8-3-causes-hash-collisions-and-lead-to-dos/

Comparte en tus redes: