Hackeo de la infraestructura de Python: más de 170.000 usuarios comprometidos. ¿Qué tan seguro es su código?

El equipo de Checkmarx Research ha descubierto una sofisticada campaña de ataque que aprovechó una infraestructura Python falsa para apuntar a la cadena de suministro de software, lo que afectó a más de 170.000 usuarios, incluida la organización Top.gg GitHub y varios desarrolladores individuales. Este ataque multifacético involucró técnicas como la apropiación de cuentas mediante cookies de navegador robadas, contribuciones de código malicioso verificadas, el establecimiento de un espejo Python personalizado y la difusión de paquetes dañinos a través del registro PyPi .

  • Asalto silencioso a la cadena de suministro de software : los atacantes orquestaron un asalto silencioso a la cadena de suministro de software, empleando múltiples tácticas para robar información confidencial de víctimas desprevenidas. Esto incluyó la creación de herramientas maliciosas de código abierto con descripciones atractivas para atraer a las víctimas, la mayoría de las cuales probablemente fueron redirigidas desde motores de búsqueda.
  • El uso de un espejo de Python falso : una piedra angular de esta campaña fue la distribución de una dependencia maliciosa a través de una infraestructura de Python falsificada, que estaba vinculada a proyectos populares en GitHub y paquetes legítimos de Python. Los atacantes no sólo secuestraron cuentas de GitHub para difundir paquetes maliciosos de Python, sino que también realizaron ingeniería social para ampliar su alcance.
  • Una carga útil evasiva de varias etapas : el ataque presentó una carga útil compleja de varias etapas diseñada para recolectar datos valiosos, como contraseñas y credenciales, de sistemas infectados antes de filtrar estos datos a la infraestructura de los atacantes. En particular, se implementó un espejo falso de paquetes Python, distribuyendo una versión envenenada del ampliamente utilizado paquete “colorama”.

Una víctima notable compartió su experiencia al encontrar actividad sospechosa relacionada con el paquete “colorama”, lo que finalmente le llevó a darse cuenta de que había sido pirateado. Esta cuenta subraya el sigilo y el engaño empleados en la campaña, en la que los atacantes aprovecharon réplicas falsas de Python y typosquatting para engañar a los usuarios y difundir malware a través de repositorios maliciosos de GitHub.

TÉCNICA DEL ATAQUE

La réplica falsa de Python, que aparece bajo el dominio “files[.]pypihosted[.]org”, imitaba la réplica del paquete oficial de Python y jugó un papel crucial en el éxito del ataque. Al albergar una versión manipulada de “colorama” cargada de código malicioso y utilizar identidades de GitHub robadas para realizar cambios en repositorios acreditados, los atacantes demostraron una comprensión sofisticada de las vulnerabilidades de la cadena de suministro de software.

El ataque a la cadena de suministro de software que aprovechó la infraestructura falsa de Python utilizó una compleja gama de técnicas para comprometer a más de 170.000 usuarios. A continuación se muestra un desglose de las técnicas de ataque clave utilizadas:

  1. Adquisición de cuenta a través de cookies de navegador robadas : los atacantes obtuvieron acceso no autorizado a cuentas de GitHub robando cookies de sesión. Esto les permitió eludir las medidas de autenticación y realizar actividades maliciosas sin necesidad de conocer las contraseñas de las cuentas.
  2. Contribuciones de código malicioso con confirmaciones verificadas : utilizando las cuentas secuestradas, los atacantes contribuyeron con código malicioso a proyectos acreditados. Estas contribuciones a menudo parecían legítimas debido al uso de confirmaciones verificadas, lo que las hacía más difíciles de detectar.
  3. Configuración de una réplica de Python personalizada : un elemento central de la campaña fue el establecimiento de una réplica de paquete de Python falsificada. Este espejo albergaba versiones envenenadas de paquetes populares de Python, incluida una versión manipulada de “colorama” que contenía código malicioso.
  4. Publicación de paquetes maliciosos en el registro PyPi : los atacantes publicaron paquetes dañinos en el índice de paquetes de Python (PyPi), explotando la confianza dentro de la comunidad Python en este repositorio. Estos paquetes a menudo tenían descripciones de clickbait para atraer víctimas, muchas de las cuales eran redirigidas desde motores de búsqueda.
  5. Typosquatting y réplica falsa de Python para la distribución de paquetes : el dominio “files[.]pypihosted[.]org” se registró como parte del ataque, manipulando hábilmente el dominio de la réplica oficial de Python para engañar a los usuarios para que descarguen paquetes maliciosos.
  6. Ingeniería social para aumentar la credibilidad y la visibilidad : al apoderarse de cuentas acreditadas de GitHub, los atacantes pudieron destacar múltiples repositorios maliciosos, aumentando su visibilidad y la probabilidad de que otros usuarios confíen y descarguen desde estas fuentes.
  7. Carga útil maliciosa evasiva de varias etapas : el ataque implementó una carga útil de varias etapas que inicialmente parecía benigna pero estaba diseñada para recolectar y exfiltrar datos valiosos, como contraseñas y credenciales, de los sistemas infectados. Esta carga útil era sofisticada y empleaba técnicas de ofuscación y evasión para evitar la detección.

Cada una de estas técnicas demuestra el profundo conocimiento de los atacantes tanto de la ingeniería social como de las vulnerabilidades técnicas dentro de la cadena de suministro de software. La combinación de estos métodos permitió un ataque altamente efectivo y dañino.

PRESENTANDO UN ‘COLORAMA’ ENVENENADO

Los atacantes alojaron una versión envenenada de “colorama”, un paquete ampliamente utilizado en la comunidad Python con más de 150 millones de descargas mensuales. Así es como ejecutaron esta parte de su sofisticado ataque:

  1. Copiar y modificar “Colorama” : los actores de amenazas comenzaron copiando el paquete legítimo “colorama” e insertando código malicioso en él. Este código fue diseñado para ser parte de la funcionalidad del paquete, lo que dificulta su detección sin una inspección exhaustiva.
  2. Ocultación del código malicioso : la carga dañina se ocultó dentro del paquete “colorama” modificado mediante espacio-relleno. Este método sacaba el código malicioso de la pantalla de los editores de texto, lo que requería que los usuarios se desplazaran horizontalmente para descubrirlo. Esta técnica redujo significativamente la probabilidad de que se detectara contenido malicioso durante una revisión informal.
  3. Uso de un dominio typosquatted para alojamiento : la versión maliciosa modificada de “colorama” estaba alojada en un espejo falso de Python. Se podía acceder a este espejo a través de un dominio que se parecía mucho al servicio oficial de alojamiento de paquetes de Python, aprovechando la typosquatting para engañar a los usuarios. Para este propósito se utilizó el dominio “files[.]pypihosted[.]org”, imitando el legítimo “files.pythonhosted.org”.
  4. Distribución del paquete envenenado : Para difundir el “colorama” envenenado, los atacantes manipularon las dependencias del proyecto. Realizaron cambios en proyectos acreditados en GitHub, modificando los requirements.txtarchivos para incluir la versión del paquete malicioso alojado en su espejo falso. Esto aseguró que cuando el proyecto se instalara o actualizara, el “colorama” envenenado se descargaría y ejecutaría.
  5. Evasión de detección : el uso estratégico de un dominio con errores tipográficos, junto con el método de ocultar código malicioso dentro de un paquete legítimo, hizo que este ataque fuera particularmente evasivo. Los esfuerzos de los atacantes por combinar el paquete malicioso en dependencias normales dificultaron que los usuarios y las herramientas automatizadas identificaran la amenaza.

Al alojar este paquete envenenado “colorama” en su infraestructura Python falsa y vincularlo a proyectos populares, los atacantes pudieron ejecutar un ataque silencioso a la cadena de suministro, comprometiendo los sistemas de desarrolladores y usuarios desprevenidos. Este ataque subraya la importancia de verificar las fuentes de las dependencias de software y la necesidad de estar alerta ante amenazas cibernéticas cada vez más sofisticadas.

La implementación del paquete malicioso en el ataque utilizando la infraestructura falsa de Python implicó un sofisticado proceso de varias etapas. Aquí hay un desglose de las etapas a través de las cuales el paquete malicioso, particularmente el envenenado “colorama”, fue implementado y ejecutado en los sistemas de las víctimas:

ETAPA 1: DESCARGA INICIAL Y EJECUCIÓN

  • Descarga de paquete o repositorio malicioso : el usuario desprevenido clona un repositorio o descarga un paquete que contiene una dependencia maliciosa. Esta dependencia apunta al paquete envenenado “colorama” alojado en el espejo falso de Python de los atacantes (dominio tipográfico “archivos[.]pypihosted.org”).
  • Ejecución de código malicioso inicial : tras la instalación o actualización, el paquete malicioso “colorama” ejecuta su carga útil, que incluye código malicioso adicional. Esta etapa sienta las bases para una mayor explotación.

ETAPA 2: ACTIVACIÓN DE CÓDIGO MALICIOSO

  • Código idéntico con fragmento malicioso : el paquete “colorama” contiene código idéntico a la versión legítima, con la excepción de un breve fragmento malicioso. Este fragmento se ubicó inicialmente dentro de un archivo aparentemente inofensivo, pero se colocó estratégicamente para garantizar su ejecución.
  • Ofuscación y ejecución de más código malicioso : el atacante utilizó importantes espacios en blanco para sacar el código malicioso de la pantalla en los editores de texto, lo que requirió un desplazamiento horizontal para descubrirlo. Este código, una vez ejecutado, recupera otra pieza de código Python de un servidor remoto, que instala las bibliotecas necesarias y descifra los datos codificados.

ETAPA 3: ENTREGA DE CARGA ÚTIL

  • Obteniendo código Python ofuscado adicional : el malware avanza para obtener más código Python ofuscado desde otro enlace externo. Luego, este código se ejecuta utilizando la función “exec” de Python, iniciando la siguiente fase del ataque.

ETAPA 4: COMPROMISO DEL SISTEMA Y RECOLECCIÓN DE DATOS

  • Técnicas avanzadas de ofuscación : técnicas como el uso de cadenas de caracteres que no están en inglés, la compresión y los nombres de variables engañosos complican el análisis y la comprensión del código.
  • Implementación de la carga útil maliciosa final : el código verifica el sistema operativo del host comprometido, selecciona una carpeta aleatoria y un nombre de archivo para el código Python malicioso final y lo recupera de un servidor remoto.
  • Mecanismo de persistencia : el malware modifica el registro de Windows para crear una nueva clave de ejecución, asegurando que el código malicioso se ejecute cada vez que se reinicia el sistema. Esto permite que el malware mantenga su presencia en el sistema comprometido.

ETAPA 5: EXFILTRACIÓN DE DATOS

  • Amplias capacidades de robo de datos : la carga útil final revela la capacidad del malware para apuntar a una amplia gama de aplicaciones y robar información confidencial. Esto incluye datos de navegadores web, Discord, billeteras de criptomonedas, sesiones de Telegram y más.
  • Registro de teclas y robo de archivos : un componente de registro de teclas captura las pulsaciones de teclas de la víctima y un ladrón de archivos busca archivos con palabras clave específicas, dirigiéndose a directorios como Escritorio y Descargas.
  • Exfiltración al servidor del atacante : los datos robados, junto con los archivos comprimidos en archivos ZIP, se cargan en el servidor del atacante. Para la filtración de datos se utilizan diversas técnicas, incluidos servicios anónimos de intercambio de archivos y solicitudes HTTP directas.

Estas etapas ilustran la meticulosa planificación y ejecución del ataque, mostrando la sofisticación técnica de los atacantes y su comprensión tanto de las dependencias del software como del comportamiento humano. El enfoque de varias etapas no solo facilitó el despliegue de la carga maliciosa sino que también ayudó a evadir la detección, lo que hizo que el ataque fuera particularmente dañino.

El ataque que involucró la infraestructura falsa de Python y el paquete envenenado “colorama” también provocó la publicación de varios otros paquetes maliciosos en el Índice de paquetes de Python (PyPI). Estos paquetes formaban parte de la estrategia de los atacantes para distribuir malware a través del ecosistema de paquetes Python. A continuación se muestra una lista de algunos de los paquetes involucrados en esta campaña, junto con sus números de versión y los nombres de usuario de los editores:

  • jzyrljroxlca Versión 0.3.2, publicada por el usuario pypi/xotifol394 el 21-jul-23
  • wkqubsxekbxn Versión 0.3.2, publicada por el usuario pypi/xotifol394 el 21-jul-23
  • eoerbisjxqyv Versión 0.3.2, publicada por el usuario pypi/xotifol394 el 21-jul-23
  • lyfamdorksgb Versión 0.3.2, publicada por el usuario pypi/xotifol394 el 21-jul-23
  • hnuhfyzumkmo Versión 0.3.2, publicada por el usuario pypi/xotifol394 el 21-jul-23
  • hbcxuypphrnk Versión 0.3.2, publicada por el usuario pypi/xotifol394 el 20-jul-23
  • dcrywkqddo Versión 0.4.3, publicada por el usuario pypi/xotifol394 el 20-jul-23
  • mjpoytwngddh Versión 0.3.2, publicada por el usuario pypi/poyon95014 el 21-jul-23
  • eeajhjmclakf Versión 0.3.2, publicada por el usuario pypi/tiles77583 el 21-jul-23
  • yocolor Versión 0.4.6, publicada por el usuario pypi/felpes el 24 de marzo de 2020
  • coloriv Versión 3.2, publicada por el usuario pypi/felpes el 22 de noviembre de 22
  • Colors-it Versión 2.1.3, publicada por el usuario pypi/felpes el 17 de noviembre del 22
  • pylo-color Versión 1.0.3, publicada por el usuario pypi/felpes el 15 de noviembre del 22
  • type-color Versión 0.4, publicada por el usuario felipefelpes el 22-11-01

Estos paquetes, incluidas variaciones del paquete “colorama” y otros con nombres oscuros o clickbait, eran parte de una estrategia más amplia para distribuir malware. Los atacantes utilizaron estos paquetes como vectores para entregar código malicioso a los sistemas de las víctimas desprevenidas, explotando la confianza depositada en el ecosistema PyPI y el uso rutinario de estos paquetes en proyectos Python.

Esta lista proporciona una instantánea de los paquetes maliciosos publicados por los atacantes, lo que ilustra la escala y diversidad de sus esfuerzos para infiltrarse en la cadena de suministro de software. Se insta a los usuarios y desarrolladores a tener precaución y realizar una investigación exhaustiva antes de incorporar paquetes de terceros a sus proyectos.

Esta campaña ejemplifica las estrategias avanzadas que adoptan los actores maliciosos para infiltrarse y comprometer plataformas confiables como PyPI y GitHub. Sirve como un claro recordatorio de la necesidad de ser diligente al instalar paquetes y repositorios, incluso de fuentes aparentemente confiables. La vigilancia, la investigación exhaustiva de las dependencias y el mantenimiento de medidas de seguridad sólidas son fundamentales para mitigar los riesgos que plantean ataques tan sofisticados