El 46% de los paquetes de Python en el repositorio de PyPI contienen código potencialmente inseguro

Un grupo de investigadores de la Universidad de Turku (Finlandia) publicó los resultados de un análisis de paquetes en el repositorio PyPI para detectar el uso de construcciones potencialmente peligrosas que podrían generar vulnerabilidades. Durante el análisis de 197 mil paquetes se identificaron 749 mil posibles problemas de seguridad. El 46% de los paquetes tiene al menos uno de estos problemas. Entre los problemas más comunes se encuentran las deficiencias relacionadas con el manejo de excepciones y el uso de funciones que permiten la sustitución de código.

De los 749 mil problemas identificados, 442 mil (41%) fueron catalogados como problemas menores, 227 mil (30%) como problemas moderados y 80 mil (11%) como peligrosos. Algunos paquetes se destacan entre la multitud y contienen miles de problemas: por ejemplo, el paquete PyGGI identificó 2589 problemas, principalmente relacionados con el uso de la construcción "try-except-pass", y el paquete appengine-sdk encontró 2356 problemas. También hay una gran cantidad de problemas presentes en los paquetes genie.libs.ops, pbcore y genie.libs.parser.

Cabe señalar que los resultados se obtuvieron en base a un análisis estático automatizado, que no tiene en cuenta el contexto de aplicación de determinadas estructuras. El desarrollador del kit de herramientas Bandit, que se utilizó para escanear el código, expresó la opinión de que debido al número bastante alto de falsos positivos, los resultados del escaneo no pueden considerarse directamente vulnerabilidades sin una revisión manual adicional de cada problema.

Por ejemplo, el analizador considera que el uso de generadores de números aleatorios y algoritmos hash poco fiables, como MD5, es un problema de seguridad, mientras que en el código dichos algoritmos pueden utilizarse para fines que no afectan a la seguridad. El analizador también considera como un problema cualquier procesamiento de datos externos en funciones inseguras como pickle, yaml.load, subprocess y eval, pero este uso no implica necesariamente una vulnerabilidad y de hecho el uso de estas funciones se puede implementar sin una amenaza a la seguridad. .

Entre las pruebas utilizadas en el estudio:

  • Usar funciones potencialmente inseguras exec, mktemp, eval, mark_safe, etc.
  • Configuración insegura de los derechos de acceso a los archivos.
  • Conexión de un enchufe de red a todas las interfaces de red.
  • Uso de contraseñas y claves estrictamente especificadas en el código.
  • Usando un directorio temporal predefinido.
  • Usar pasar y continuar en controladores de excepciones de estilo general;
  • Lanzamiento de aplicaciones web basadas en el marco web Flask con el modo de depuración habilitado.
  • Usar métodos de deserialización de datos inseguros.
  • Utiliza funciones hash MD2, MD4, MD5 y SHA1.
  • Uso de cifrados DES y modos de cifrado inseguros.
  • Uso de una implementación HTTPSConnection insegura en algunas versiones de Python.
  • Especificando el esquema file:// en urlopen.
  • Usar generadores de números pseudoaleatorios al realizar tareas criptográficas.
  • Utilizando el protocolo Telnet.
  • Uso de analizadores XML inseguros.

Además, se puede señalar que se detectaron 8 paquetes maliciosos en el directorio PyPI. Antes de la eliminación, los paquetes problemáticos se descargaron más de 30 mil veces. Para ocultar la actividad maliciosa y evitar las advertencias de analizadores estáticos simples en los paquetes, los bloques de código se codificaron usando Base64 y se ejecutaron después de decodificarlos usando una llamada de evaluación.

Los paquetes noblesse, genesisbot, are, sufrir, noblesse2 y noblessev2 contienen código para interceptar números de tarjetas de crédito y contraseñas almacenados en los navegadores Chrome y Edge, así como transferir tokens de cuenta desde la aplicación Discord y enviar datos del sistema, incluidas capturas de pantalla del contenido de la pantalla. Los paquetes pytagora y pytagora2 incluían la capacidad de cargar y ejecutar código ejecutable de terceros.

Fuente: opennet.ru

Añadir un comentario