Los paquetes no eran señuelos vacíos. Según Kaspersky, implementaban las funciones prometidas en sus páginas de PyPI, pero su objetivo real era entregar archivos maliciosos de forma encubierta. The Hacker News informó del mismo hallazgo: paquetes aparentemente funcionales diseñados para instalar ZiChatBot con sigilo en Windows y Linux.
uuid32-utilscolorinaltermncolorLa atribución exige matices. En Securelist, Kaspersky afirma que envió las muestras a su Kaspersky Threat Attribution Engine y que los paquetes podrían estar relacionados con malware tratado en un informe de inteligencia sobre OceanLotus. En su índice público de investigación, la compañía es más directa y atribuye la actividad de ZiChatBot en PyPI a OceanLotus APT.
Un resumen público describe esa atribución como de confianza moderada.
La imagen pública respaldada por los informes es la de una cadena de infección multiplataforma. El índice de investigación de Kaspersky señala que los paquetes wheel maliciosos de PyPI apuntaban tanto a Windows como a Linux e incluían un dropper que entregaba el malware bautizado como ZiChatBot.
Un resumen público detalla la siguiente fase como la extracción de un dropper DLL o .SO desde el wheel, la persistencia mediante el Registro de Windows o crontab en Linux, y el despliegue posterior de ZiChatBot. Por eso el riesgo no se limita a servidores de aplicaciones: también afecta a estaciones de desarrollo, entornos virtuales, runners de CI y posibles imágenes de contenedor donde alguien hubiera instalado esos paquetes.
La campaña deja una lección incómoda para cualquier equipo que use dependencias de código abierto: que una librería funcione no significa que sea confiable. Kaspersky indicó que los wheels maliciosos sí cumplían las funciones anunciadas en PyPI mientras entregaban archivos ocultos con fines maliciosos.
El giro técnico más llamativo fue el uso de una plataforma legítima de colaboración como capa de mando y control. Según los informes sobre los hallazgos de Kaspersky, ZiChatBot no se comunicaba con un servidor C2 dedicado; usaba una serie de API REST de Zulip, una aplicación pública de chat para equipos, como infraestructura de C2.
La documentación de Zulip muestra que sus API permiten operaciones que encajan con un diseño de C2 basado en chat: enviar mensajes, obtener mensajes, subir archivos, editar o eliminar mensajes, construir filtros de conversación conocidos como narrows y trabajar con temas de canales. La documentación de bots de Zulip también describe bots capaces de interceptar, ver y procesar mensajes enviados por usuarios, y luego enviar nuevas respuestas.
En términos sencillos, las instrucciones del operador pueden representarse como mensajes de chat o mensajes acotados a un tema, mientras el malware consulta los mensajes relevantes y publica resultados por el mismo servicio. Las fuentes públicas incluidas no revelan el espacio de trabajo concreto de Zulip, credenciales de bot, secuencia exacta de endpoints ni conjunto de comandos de ZiChatBot; por eso la descripción prudente es que ZiChatBot abusó de funciones legítimas de la API REST de Zulip para C2, en vez de depender de infraestructura C2 propia de los atacantes.
El uso de Zulip no implica que Zulip haya sido comprometido. Los informes citados describen abuso de funciones normales de API REST y mensajería tipo bot, no una brecha del servicio de chat.
Tampoco implica que la infraestructura de PyPI haya sido vulnerada. El informe de Kaspersky habla de paquetes wheel maliciosos subidos a PyPI y señala que el malware fue retirado después del repositorio.
Para los equipos de defensa, la lectura práctica es clara: el tráfico hacia un servicio legítimo de colaboración puede ser sospechoso si sale de un host, proceso, job de CI o cuenta de servicio que no tiene razón para hablar con ese servicio. Las listas de bloqueo centradas solo en dominios controlados por atacantes pueden quedarse cortas; la investigación debe mirar el contexto del proceso y el uso esperado del negocio, no solo la reputación del destino.
El primer paso es el inventario de paquetes. Busque en equipos de desarrollo, runners de compilación, entornos virtuales, archivos de bloqueo de dependencias e imágenes de contenedor referencias a uuid32-utils, colorinal y termncolor.
Revise líneas de tiempo de instalación desde julio de 2025 en adelante, el periodo señalado por Kaspersky para la subida de los wheel maliciosos. Si aparece alguno de esos paquetes en registros o artefactos, conviene preservar el entorno para análisis en lugar de limitarse a desinstalar y seguir adelante.
En Windows, compruebe entradas de persistencia inesperadas en el Registro; en Linux, revise crontab en busca de tareas sospechosas. Esa revisión coincide con el resumen público de la cadena de infección de la campaña.
Analice telemetría de red y procesos en busca de actividad de API de Zulip originada por intérpretes de Python, procesos de instalación de paquetes, workers de CI, servidores o cuentas de servicio que normalmente no usan Zulip. La pregunta clave no es si Zulip es legítimo en general, sino si ese host y ese proceso concretos tienen un motivo legítimo para llamar a sus API.
Por último, no trate el funcionamiento aparente de una librería como prueba de confianza. En esta campaña, los paquetes habrían cumplido lo que prometían mientras también actuaban como droppers de archivos maliciosos.
La campaña de PyPI vinculada a OceanLotus giró en torno a paquetes wheel maliciosos subidos desde julio de 2025, con uuid32-utils, colorinal y termncolor entre los nombres citados públicamente. Esos paquetes entregaban ZiChatBot en sistemas Windows y Linux, y su rasgo operativo distintivo fue usar API REST de Zulip para mando y control en lugar de un servidor C2 dedicado operado por atacantes.
Comments
0 comments