Imagen Principal

Investigadores de ciberseguridad han descubierto código vulnerable en paquetes de Python obsoletos que podría allanar el camino para un ataque de compromiso de la cadena de suministro en el Python Package Index (PyPI) mediante una técnica de toma de control de dominio (domain takeover).

La empresa de seguridad de la cadena de suministro de software ReversingLabs identificó la vulnerabilidad en archivos de arranque (“bootstrap files”) proporcionados por una herramienta de automatización de compilación y despliegue llamada zc.buildout.

El Riesgo de Toma de Dominio por Paquetes Legacy

El problema radica en un script de arranque antiguo (bootstrap.py) que se utilizaba con zc.buildout para inicializar el entorno. Este script tenía la capacidad de instalar la utilidad de empaquetado “Distribute,” un fork de corta duración del proyecto Setuptools. Para ello, el script de instalación de Distribute (distribute_setup.py) se descarga desde el dominio python-distribute[.]org.

El riesgo surge porque este dominio ha estado disponible para la venta o gestionado para generar ingresos publicitarios desde 2014. El fork Distribute se volvió obsoleto en 2013, cuando sus características se reincorporaron a Setuptools.

Sin embargo, muchos paquetes de Python han continuado incluyendo el script de arranque que intenta instalar Distribute por defecto o al especificar una opción de línea de comandos. Dado que el dominio está disponible para su adquisición, un atacante podría comprarlo, alojar código malicioso y comprometer a los usuarios que ejecuten inadvertidamente el script de arranque vulnerable.

Alcance de la Vulnerabilidad y Riesgos Adicionales

La vulnerabilidad fue identificada en varios paquetes populares, incluyendo:

  • Tornado
  • pypiserver
  • slapos.core
  • roman
  • xlutils
  • testfixtures

Aunque algunos de estos paquetes han eliminado el script de arranque, el paquete slapos.core aún lo contiene. El script, escrito en Python 2, no se ejecuta automáticamente durante la instalación del paquete, pero su presencia crea una “superficie de ataque innecesaria” que puede ser explotada si los desarrolladores son engañados para ejecutar el script.

Precedentes Reales y Amenazas Actuales

La amenaza de toma de dominio no es puramente teórica. En 2023, se documentó un caso similar en el ecosistema npm, donde el paquete fsevents fue comprometido después de que un actor malicioso tomara control de un recurso de almacenamiento en la nube no reclamado (fsevents-binaries.s3-us-west-2.amazonaws[.]com) para distribuir ejecutables maliciosos (CVE-2023-45311, CVSS: 9.8).

El problema subyacente, según los investigadores, es el patrón de programación de descargar y ejecutar código desde un dominio codificado, un comportamiento común en el malware tipo downloader. La falta de desmantelamiento formal del módulo Distribute permitió que estos scripts vulnerables persistieran.

Amenaza en PyPI: El caso “spellcheckers”

Este descubrimiento de ReversingLabs coincide con otra amenaza reciente en PyPI. HelixGuard descubrió un paquete malicioso llamado “spellcheckers” que afirmaba ser una herramienta de corrección ortográfica basada en OpenAI Vision. El paquete contenía código malicioso diseñado para conectar a un servidor externo y descargar un troyano de acceso remoto (RAT). Este RAT permitía la ejecución remota de comandos de Python, otorgando control total sobre el host de la víctima. El paquete fue descargado 955 veces antes de ser eliminado de PyPI.

Conclusiones

Los hallazgos de ReversingLabs y HelixGuard subrayan la fragilidad de la cadena de suministro de software y la necesidad de una gestión rigurosa de dependencias, especialmente en ecosistemas de paquetes como PyPI. La persistencia de código legacy y la dependencia de dominios obsoletos representan un riesgo significativo que puede ser explotado por atacantes para inyectar código malicioso y comprometer sistemas de desarrollo y producción.

Referencias

  • Vulnerabilidad: Scripts de arranque de zc.buildout y la dependencia del dominio python-distribute[.]org.
  • CVE Precedente: CVE-2023-45311 (vulnerabilidad de toma de subdominio en npm package fsevents).
  • Paquetes Afectados: tornado, pypiserver, slapos.core, roman, xlutils, testfixtures.
  • Malware en PyPI: Paquete “spellcheckers” (eliminado de PyPI).