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.

