Aikido

El popular paquete telnyx comprometido en PyPI por TeamPCP

Escrito por
Charlie Eriksen

Esta mañana telnyx el compromiso es el último movimiento en lo que ya es una campaña de cadena de suministro de TeamPCP de varias semanas que abarca múltiples ecosistemas. Trivy. Checkmarx. LiteLLM. Y ahora Telnyx en PyPI, subido hace horas a las 03:51 UTC del 27 de marzo.

El patrón es consistente: robar credenciales de una herramienta de seguridad de confianza, usar esas credenciales para introducir versiones maliciosas de aquello a lo que esa herramienta tenía acceso, recopilar lo que se esté ejecutando en el siguiente entorno y repetir.

Dónde encaja esto en la campaña

Un breve resumen de lo que TeamPCP ha hecho en las últimas dos semanas:

19 de marzo: Trivy comprometido. El escáner de vulnerabilidades de código abierto de Aqua Security fue comprometido con una puerta trasera, lo que resultó en CVE-2026-33634 (CVSS 9.4). Los atacantes exfiltraron credenciales de cada pipeline de CI/CD que ejecutaba Trivy sin fijación de versión. 44 repositorios de GitHub de Aqua Security fueron renombrados con el prefijo tpcp-docs- y la descripción "TeamPCP Owns Aqua Security."

20 de marzo: CanisterWorm afecta a npm. Utilizando tokens robados de usuarios de Trivy, TeamPCP publicó la puerta trasera CanisterWorm en más de 46 paquetes npm, incluyendo ámbitos como @EmilGroup y @opengov. El gusano automatizó el compromiso de token: dado un token npm robado, enumeró todos los paquetes publicables, actualizó las versiones y los publicó en todo el ámbito en menos de 60 segundos.

22 de marzo: Observé por primera vez a TeamPCP utilizando esteganografía WAV para entregar cargas útiles en su variante de wiper de Kubernetes. Lo señalé en Twitter en ese momento: "TeamPCP ahora está incrustando su malware en archivos .wav."

23 de marzo: Checkmarx. Los kics-github-action y ast-github-action GitHub Actions fueron comprometidas, junto con dos extensiones de OpenVSX (cx-dev-assist 1.7.0 y ast-results 2.53.0). La carga útil utilizó un nuevo dominio C2, checkmarx[.]zone, suplantando la marca Checkmarx. 35 etiquetas fueron secuestradas entre las 12:58 y las 16:50 UTC; el código malicioso fue eliminado tres horas después.

24 de marzo: LiteLLM. Las versiones 1.82.7 y 1.82.8 del paquete LiteLLM de PyPI fueron publicadas utilizando credenciales robadas de la pipeline de CI/CD de LiteLLM, que ejecutaba Trivy sin fijar. LiteLLM registra aproximadamente 95 millones de descargas al mes y se está desplegando cada vez más como una pasarela LLM centralizada con acceso a credenciales para OpenAI, Anthropic, AWS Bedrock, GCP VertexAI y más. PyPI puso en cuarentena los paquetes después de unas tres horas. El C2 era models[.]litellm[.]cloud.

27 de marzo (hoy): Telnyx. Dos versiones maliciosas del SDK oficial de Python de Telnyx llegaron a PyPI esta mañana. Telnyx ha sido descargado 742k veces durante el último mes.

La carga útil de Telnyx

La inyección se encuentra en telnyx/_client.py, que se ejecuta en el momento de la importación. Sin hook de instalación que deshabilitar, sin postinstalación que bloquear. Simplemente import telnyx y el malware se ejecuta.

Dos rutas dependiendo del SO:

Windows: Descargas hangup.wav desde 83[.]142[.]209[.]203:8080, decodifica un ejecutable ofuscado con XOR de los fotogramas de audio, lo instala como msbuild.exe en la carpeta de Inicio de Windows. Se ejecuta silenciosamente en cada inicio de sesión con un periodo de enfriamiento de 12 horas para la reinstalación, impuesto por un archivo oculto .lock archivo.

Linux/Mac: Un script completo de Python de segunda etapa está incrustado como un blob base64 en _client.py en la línea 459. Obtiene ringtone.wav del mismo C2, decodifica un script colector de tercera etapa de los fotogramas WAV utilizando la misma técnica XOR, lo ejecuta a través de sys.executable - redirigido a stdin, luego cifra la salida con AES-256-CBC y la exfiltra. La clave de sesión se envuelve con una clave pública RSA-4096 del atacante (OAEP), por lo que solo el atacante puede descifrar lo que fue robado.

El paquete de exfiltración se llama tpcp.tar.gz, enviado con la cabecera X-Filename: tpcp.tar.gz.

El truco WAV

Esta es la parte en la que vale la pena detenerse. La carga útil no se entrega como un binario en bruto o un archivo Python. Está disfrazada como un .wav archivo de audio. Esto es lo que sucede cuando el malware obtiene hangup.wav (Windows) o ringtone.wav (Linux) del C2:

with wave.open(wf, 'rb') as w:
    b = base64.b64decode(w.readframes(w.getnframes()))
    s, m = b[:8], b[8:]
    payload = bytes([m[i] ^ s[i % len(s)] for i in range(len(m))])

El archivo WAV es un archivo de audio válido. Pasa las comprobaciones de tipo MIME. Pero los datos de los fotogramas de audio contienen una carga útil codificada en base64. Decodifica los fotogramas, toma los primeros 8 bytes como clave XOR, aplica XOR al resto y tendrás tu ejecutable o script de Python.

El filtrado basado en contenido no lo detectará. Una URL que permite .wav las solicitudes no lo bloquearán. El archivo parece audio porque está estructurado como audio. El contenido malicioso simplemente se esconde en los datos de los fotogramas.

Vimos por primera vez esta técnica en la carga útil de Kubernetes versión 3.3 de TeamPCP el 22 de marzo. Cinco días después, está en el paquete telnyx de PyPI, transportando tanto el dropper de Windows como el infostealer de Linux. Les gustó lo suficiente como para mantenerlo.

¿Qué hacer?

Eliminar telnyx>=4.87.1 inmediatamente y fijar a telnyx==4.87.0.

Si ha instalado alguna de las versiones maliciosas, considere el entorno comprometido: rote las claves API, las credenciales de la base de datos, las claves SSH y cualquier secreto accesible desde esa máquina. En Windows, compruebe si existe msbuild.exe ES %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\ y elimínelo. Monitorice el tráfico HTTP saliente hacia 83[.]142[.]209[.]203:8080.

IOCs

Versiones maliciosas de telnyx:

  • telnyx==4.87.1 (SHA256: 7321caa303fe96ded0492c747d2f353c4f7d17185656fe292ab0a59e2bd0b8d9)
  • telnyx==4.87.2 (SHA256: cd08115806662469bbedec4b03f8427b97c8a4b3bc1442dc18b72b4e19395fe3)

Red:

  • 83[.]142[.]209[.]203:8080 (C2)
  • hxxp://83[.]142[.]209[.]203:8080/hangup.wav (Payload de Windows)
  • hxxp://83[.]142[.]209[.]203:8080/ringtone.wav (Payload de Linux)
  • hxxp://83[.]142[.]209[.]203:8080/ (POST de exfiltración)
  • Cabecera de exfiltración: X-Filename: tpcp.tar.gz

Persistencia en Windows:

  • %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\msbuild.exe
  • %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\msbuild.exe.lock

Noticia en desarrollo... Manténgase atento a las actualizaciones.

Compartir:

https://www.aikido.dev/blog/telnyx-pypi-compromised-teampcp-canisterworm

Suscríbase para recibir noticias sobre amenazas.

Empieza hoy, gratis.

Empieza gratis
Sin tarjeta
4.7/5
¿Cansado de los falsos positivos?

Prueba Aikido como otros 100k.
Empiece ahora
Obtenga un recorrido personalizado

Con la confianza de más de 100k equipos

Reservar ahora
Escanee su aplicación en busca de IDORs y rutas de ataque reales

Con la confianza de más de 100k equipos

Empezar a escanear
Vea cómo el pentesting de IA prueba su aplicación

Con la confianza de más de 100k equipos

Empezar a probar

Asegura tu plataforma ahora

Protege tu código, la nube y el entorno de ejecución en un único sistema central.
Encuentra y corrije vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.