Die heutige Morgen- telnyx Kompromittierung ist der jüngste Schritt in einer nun wochenlangen TeamPCP Supply-Chain-Kampagne, die mehrere Ökosysteme umfasst. Trivy. Checkmarx. LiteLLM. Und jetzt Telnyx auf PyPI, vor Stunden um 03:51 UTC am 27. März hochgeladen.
Das Muster ist konsistent: Anmeldeinformationen von einem vertrauenswürdigen Sicherheitstool stehlen, diese Anmeldeinformationen nutzen, um bösartige Versionen von allem, worauf das Tool Zugriff hatte, zu verbreiten, alles sammeln, was in der nächsten Umgebung läuft, wiederholen.
Einordnung in die Kampagne
Ein kurzer Rückblick auf die Aktivitäten von TeamPCP in den letzten zwei Wochen:
19. März: Trivy kompromittiert. Der Open-Source-Schwachstellenscanner von Aqua Security wurde mit einer Backdoor versehen, was zu CVE-2026-33634 (CVSS 9.4) führte. Angreifer exfiltrierten Anmeldeinformationen aus jeder CI/CD-Pipeline, die Trivy ohne Version Pinning ausführte. 44 GitHub-Repositories von Aqua Security wurden mit dem Präfix umbenannt tpcp-docs- und der Beschreibung „TeamPCP Owns Aqua Security.“
20. März: CanisterWorm befällt npm. Mithilfe gestohlener Tokens von Trivy-Nutzern veröffentlichte TeamPCP die CanisterWorm-Backdoor in über 46 npm-Paketen, einschließlich Scopes wie @EmilGroup und @opengov. Der Wurm automatisierte den Token-zu-Kompromittierungs-Prozess: Mit einem gestohlenen npm-Token enumerierte er alle veröffentlichbaren Pakete, erhöhte die Versionen und veröffentlichte sie im gesamten Scope in weniger als 60 Sekunden.
22. März: Ich beobachtete erstmals, wie TeamPCP WAV-Steganographie nutzte, um Payloads in ihrer Kubernetes-Wiper-Variante zu liefern. Ich habe es damals auf Twitter gemeldet: „TeamPCP bettet seine Malware jetzt in .wav-Dateien ein.“
23. März: Checkmarx. Die kics-github-action und ast-github-action GitHub Actions wurden kompromittiert, zusammen mit zwei OpenVSX-Erweiterungen (cx-dev-assist 1.7.0 und ast-results 2.53.0). Die Payload nutzte eine neue C2-Domain, checkmarx[.]zone, die die Marke Checkmarx imitierte. Zwischen 12:58 und 16:50 UTC wurden 35 Tags gekapert; bösartiger Code wurde drei Stunden später entfernt.
24. März: LiteLLM. Die Versionen 1.82.7 und 1.82.8 des LiteLLM PyPI-Pakets wurden veröffentlicht unter Verwendung von Zugangsdaten, die aus der CI/CD-Pipeline von LiteLLM gestohlen wurden, welche ein ungepinntes Trivy ausführte. LiteLLM verzeichnet monatlich etwa 95 Millionen Downloads und wird zunehmend als zentrales LLM-Gateway eingesetzt, das Zugriff auf Anmeldeinformationen für OpenAI, Anthropic, AWS Bedrock, GCP VertexAI und weitere bietet. PyPI hat die Pakete nach etwa drei Stunden unter Quarantäne gestellt. Der C2 war models[.]litellm[.]cloud.
27. März (heute): Telnyx. Zwei bösartige Versionen des offiziellen Telnyx Python SDK sind heute Morgen auf PyPI aufgetaucht. Telnyx wurde im letzten Monat 742.000 Mal heruntergeladen.
Die Telnyx-Payload
Die Injektion befindet sich in telnyx/_client.py, die zur Importzeit ausgeführt wird. Kein Install-Hook zum Deaktivieren, kein Postinstall zum Blockieren. Einfach import telnyx und die Malware wird ausgeführt.
Zwei Pfade je nach Betriebssystem:
Windows: Downloads hangup.wav von 83[.]142[.]209[.]203:8080, dekodiert eine XOR-obfuskierte ausführbare Datei aus den Audio-Frames und legt sie als msbuild.exe im Windows-Autostartordner ab. Sie wird bei jeder Anmeldung stillschweigend ausgeführt, mit einer 12-stündigen Wiederholungs-Sperrfrist, die durch eine versteckte .lock Datei.
Linux/Mac: Ein vollständiges Python-Skript der zweiten Stufe ist als Base64-Blob in _client.py in Zeile 459. Es ruft ab ringtone.wav vom selben C2, dekodiert ein Collector-Skript der dritten Stufe aus den WAV-Frames unter Verwendung derselben XOR-Technik und führt es aus über sys.executable - an stdin weitergeleitet, verschlüsselt dann die Ausgabe mit AES-256-CBC und exfiltriert sie. Der Sitzungsschlüssel wird mit einem öffentlichen RSA-4096-Schlüssel des Angreifers (OAEP) umhüllt, sodass nur der Angreifer entschlüsseln kann, was gestohlen wurde.
Das Exfiltrations-Bundle heißt tpcp.tar.gz, gesendet mit Header X-Filename: tpcp.tar.gz.
Der WAV-Trick
Dies ist der Teil, der genauer betrachtet werden sollte. Die Payload wird nicht als rohe Binärdatei oder Python-Datei geliefert. Sie ist getarnt als eine .wav Audiodatei. Hier ist, was passiert, wenn die Malware abruft hangup.wav (Windows) oder ringtone.wav (Linux) vom 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))])Die WAV-Datei ist eine gültige Audiodatei. Sie besteht MIME-Typ-Prüfungen. Doch die Audiodaten der Frames enthalten eine base64-kodierte Payload. Dekodieren Sie die Frames, verwenden Sie die ersten 8 Bytes als XOR-Schlüssel, XORen Sie den Rest, und Sie erhalten Ihr ausführbares Programm oder Python-Skript.
Inhaltsbasiertes Filtern wird es nicht erkennen. Eine URL, die .wav Abrufe erlaubt, wird es nicht blockieren. Die Datei sieht aus wie Audio, weil sie als Audio strukturiert ist. Der bösartige Inhalt versteckt sich lediglich in den Frame-Daten.
Wir haben diese Technik erstmals am 22. März in der Kubernetes-Payload Version 3.3 von TeamPCP beobachtet. Fünf Tage später findet sie sich im telnyx PyPI-Paket wieder, das sowohl den Windows-Dropper als auch den Linux-Infostealer enthält. Sie fanden sie gut genug, um sie beizubehalten.

Vorgehensweise
Entfernen Sie telnyx>=4.87.1 sofort und auf telnyx==4.87.0.
Wenn Sie eine der bösartigen Versionen installiert haben, behandeln Sie die Umgebung als kompromittiert: Rotieren Sie API-Schlüssel, Datenbank-Zugangsdaten, SSH-Schlüssel und alle Secrets, die von dieser Maschine aus zugänglich sind. Überprüfen Sie unter Windows auf msbuild.exe in %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\ und löschen Sie diese. Überwachen Sie ausgehenden HTTP-Verkehr zu 83[.]142[.]209[.]203:8080.
IOCs
Bösartige telnyx-Versionen:
telnyx==4.87.1(SHA256:7321caa303fe96ded0492c747d2f353c4f7d17185656fe292ab0a59e2bd0b8d9)telnyx==4.87.2(SHA256:cd08115806662469bbedec4b03f8427b97c8a4b3bc1442dc18b72b4e19395fe3)
Netzwerk:
83[.]142[.]209[.]203:8080(C2)hxxp://83[.]142[.]209[.]203:8080/hangup.wav(Windows-Payload)hxxp://83[.]142[.]209[.]203:8080/ringtone.wav(Linux-Payload)hxxp://83[.]142[.]209[.]203:8080/(Exfil-POST)- Exfil-Header:
X-Filename: tpcp.tar.gz
Windows-Persistenz:
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\msbuild.exe%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\msbuild.exe.lock
Die Geschichte entwickelt sich... Bleiben Sie dran für Updates.

