Aikido

Le package populaire telnyx sur PyPI compromis par TeamPCP

Écrit par
Charlie Eriksen

Le compromis de ce matin telnyx Cette compromission est la dernière étape d'une campagne d'attaque sur la chaîne d'approvisionnement de TeamPCP, qui dure depuis des semaines et traverse plusieurs écosystèmes. Trivy. Checkmarx. LiteLLM. Et maintenant Telnyx sur PyPI, téléchargé il y a quelques heures, le 27 mars à 03:51 UTC.

Le mode opératoire est cohérent : voler les identifiants d'un outil de sécurité de confiance, utiliser ces identifiants pour pousser des versions malveillantes de tout ce à quoi cet outil avait accès, collecter tout ce qui s'exécute dans l'environnement suivant, et répéter.

Où cela s'inscrit dans la campagne

Un rapide récapitulatif de ce que TeamPCP a fait au cours des deux dernières semaines :

19 mars : Trivy compromis. Le scanner de vulnérabilités open source d'Aqua Security a été doté d'une porte dérobée, entraînant la CVE-2026-33634 (CVSS 9.4). Les attaquants ont exfiltré les identifiants de chaque pipeline CI/CD exécutant Trivy sans version pinning. 44 dépôts GitHub d'Aqua Security ont été renommés avec le préfixe tpcp-docs- et la description "TeamPCP Owns Aqua Security."

20 mars : CanisterWorm frappe npm. Utilisant des jetons volés aux utilisateurs de Trivy, TeamPCP a publié la backdoor CanisterWorm sur plus de 46 packages npm, y compris des scopes comme @EmilGroup et @opengov. Le ver a automatisé le processus de token-to-compromise : avec un jeton npm volé, il a énuméré tous les packages publiables, incrémenté les versions et les a publiés sur l'ensemble du scope en moins de 60 secondes.

22 mars : J'ai observé pour la première fois TeamPCP utilisant la stéganographie WAV pour livrer des charges utiles dans leur variante de wiper Kubernetes. Je l'ai signalé sur Twitter à l'époque : « TeamPCP intègre désormais ses malwares dans des fichiers .wav. »

23 mars : Checkmarx. Les kics-github-action et ast-github-action Les GitHub Actions ont été compromises, ainsi que deux extensions OpenVSX (cx-dev-assist 1.7.0 et ast-results 2.53.0). La charge utile a utilisé un nouveau domaine C2, checkmarx[.]zone, usurpant l'identité de la marque Checkmarx. 35 tags ont été détournés entre 12h58 et 16h50 UTC ; le code malveillant a été supprimé trois heures plus tard.

24 mars : LiteLLM. Les versions 1.82.7 et 1.82.8 du package LiteLLM PyPI ont été publiées en utilisant des identifiants volés de la pipeline CI/CD de LiteLLM, qui exécutait Trivy sans version spécifique. LiteLLM gère environ 95 millions de téléchargements par mois et est de plus en plus déployé comme une passerelle LLM centralisée avec accès aux identifiants pour OpenAI, Anthropic, AWS Bedrock, GCP VertexAI, et plus encore. PyPI a mis les packages en quarantaine après environ trois heures. Le C2 était models[.]litellm[.]cloud.

27 mars (aujourd'hui) : Telnyx. Deux versions malveillantes du SDK Python officiel de Telnyx ont été publiées sur PyPI ce matin. Telnyx a été téléchargé 742 000 fois au cours du dernier mois.

La charge utile de Telnyx

L'injection se trouve dans telnyx/_client.py, qui s'exécute au moment de l'importation. Aucun hook d'installation à désactiver, aucun post-installation à bloquer. Juste import telnyx et le malware s'exécute.

Deux chemins selon l'OS :

Windows : Téléchargements hangup.wav depuis 83[.]142[.]209[.]203:8080, décode un exécutable obfusqué par XOR à partir des trames audio, le dépose sous le nom de msbuild.exe dans le dossier Démarrage de Windows. S'exécute silencieusement à chaque connexion avec un délai de ré-déploiement de 12 heures imposé par un fichier caché .lock fichier.

Linux/Mac : Un script Python complet de deuxième étape est codé en dur sous forme de blob base64 dans _client.py à la ligne 459. Il récupère ringtone.wav depuis le même C2, décode un script collecteur de troisième étape à partir des trames WAV en utilisant la même technique XOR, et l'exécute via sys.executable - redirigé vers stdin, puis chiffre la sortie avec AES-256-CBC et l'exfiltre. La clé de session est encapsulée avec une clé publique RSA-4096 de l'attaquant (OAEP), de sorte que seul l'attaquant peut déchiffrer ce qui a été volé.

Le bundle d'exfiltration est nommé tpcp.tar.gz, envoyé avec l'en-tête X-Filename: tpcp.tar.gz.

L'astuce WAV

C'est la partie qui mérite qu'on s'y attarde. La charge utile n'est pas livrée sous forme de binaire brut ou de fichier Python. Elle est déguisée en .wav fichier audio. Voici ce qui se passe lorsque le malware récupère hangup.wav (Windows) ou ringtone.wav (Linux) depuis le 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))])

Le fichier WAV est un fichier audio valide. Il passe les vérifications de type MIME. Cependant, les données des trames audio contiennent une charge utile encodée en base64. Décodez les trames, prenez les 8 premiers octets comme clé XOR, appliquez un XOR sur le reste, et vous obtenez votre exécutable ou script Python.

Le filtrage basé sur le contenu ne le détectera pas. Une URL autorisant .wav les récupérations ne le bloquera pas. Le fichier ressemble à de l'audio car il est structuré comme tel. Le contenu malveillant se cache simplement dans les données des trames.

Nous avons observé cette technique pour la première fois dans la charge utile Kubernetes version 3.3 de TeamPCP le 22 mars. Cinq jours plus tard, elle se trouve dans le package PyPI telnyx, transportant à la fois le dropper Windows et l'infostealer Linux. Ils l'ont suffisamment appréciée pour la conserver.

Que faire

Supprimez telnyx>=4.87.1 immédiatement et épinglez à telnyx==4.87.0.

Si vous avez installé l'une des versions malveillantes, considérez l'environnement comme compromis : faites pivoter les clés API, les identifiants de base de données, les clés SSH et tous les secrets accessibles depuis cette machine. Sous Windows, vérifiez la présence de msbuild.exe dans %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\ et supprimez-le. Surveillez le trafic HTTP sortant vers 83[.]142[.]209[.]203:8080.

IOCs

Versions malveillantes de telnyx :

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

Réseau :

  • 83[.]142[.]209[.]203:8080 (C2)
  • hxxp://83[.]142[.]209[.]203:8080/hangup.wav (Charge utile Windows)
  • hxxp://83[.]142[.]209[.]203:8080/ringtone.wav (Charge utile Linux)
  • hxxp://83[.]142[.]209[.]203:8080/ (Exfiltration POST)
  • En-tête d'exfiltration : X-Filename: tpcp.tar.gz

Persistance Windows :

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

Article en cours de rédaction... Restez informé pour les mises à jour.

Partager :

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

Abonnez-vous pour les actualités sur les menaces.

Démarrez gratuitement dès aujourd'hui.

Commencer gratuitement
Sans carte bancaire
4,7/5
Fatigué des faux positifs ?
Essayez Aikido, comme 100 000 autres.
Commencez maintenant
Obtenez une démonstration personnalisée

Approuvé par plus de 100 000 équipes

Réserver maintenant
Analysez votre application à la recherche d'IDORs et de chemins d'attaque réels

Approuvé par plus de 100 000 équipes

Démarrer l'analyse
Découvrez comment le pentest IA teste votre application

Approuvé par plus de 100 000 équipes

Démarrer les tests

Sécurisez votre environnement dès maintenant.

Sécurisez votre code, votre cloud et votre environnement d’exécution dans un système centralisé unique.
Détectez et corrigez les vulnérabilités rapidement et automatiquement.

Aucune carte de crédit requise | Résultats en 32 secondes.