Если вы используете Python-пакет telnyx для работы с телефонией и мессенджингом — проверьте версию прямо сейчас. Две версии официального SDK оказались заражены вредоносным кодом, который ворует учётные данные и устанавливает бэкдор.
Telnyx — платформа для программируемой телефонии, SMS и сетевых сервисов. Её Python SDK (telnyx на PyPI) скачивают более 1 миллиона раз в месяц (~30 000 загрузок в день). 27 марта 2026 года исследователи из SafeDep обнаружили, что версии 4.87.1 и 4.87.2 содержат вредоносный код, которого нет в исходном репозитории на GitHub. Инциденту присвоен CVE-2026-33634 (CVSS 9.4). Обе заражённые версии уже карантинированы PyPI.
Главное: Версии telnyx 4.87.1 и 4.87.2 на PyPI содержат вредоносный код — 74 строки, внедрённые в файл _client.py. Пакет скачивают более 1 млн раз в месяц. Вредонос использует стеганографию в WAV-файлах для доставки полезной нагрузки. На Windows устанавливается бэкдор, на Linux/macOS — крадутся учётные данные. Безопасная версия — 4.87.0. Атака связана с группировкой TeamPCP — это уже третье звено в цепочке после компрометации Trivy, Checkmarx и litellm.
Supply chain attack (атака на цепочку поставок) — тип атаки, при которой злоумышленник компрометирует не конечную цель, а один из компонентов, от которого она зависит: библиотеку, SDK или инструмент сборки. Разберём, как именно сработала атака и что делать, если вы используете telnyx.
Как произошла компрометация
Последняя чистая версия пакета — 4.87.0 — была опубликована 26 марта через штатный CI/CD-пайплайн (GitHub Actions + Rye). У неё есть соответствующий тег v4.87.0 в репозитории.
Версии 4.87.1 и 4.87.2 не имеют ни тегов, ни релизов на GitHub. Workflow публикации не запускался после v4.87.0. Метаданные PyPI показывают, что заражённые версии были загружены через twine/6.2.0, тогда как легитимный пайплайн использует rye publish.
Вывод: атакующий получил украденный PyPI API-токен и загрузил троянизированные версии напрямую, минуя CI/CD. У проекта не был настроен PyPI Trusted Publisher (OIDC), который привязывает загрузку к конкретному репозиторию и воркфлоу, делая украденные токены бесполезными.
Как работает вредоносный код
В файл telnyx/_client.py было внедрено ровно 74 строки кода в трёх местах: импорты в начале файла, base64-закодированная переменная с полезной нагрузкой и функции атаки после легитимных классов. Код выполняется автоматически при import telnyx — никакого взаимодействия с пользователем не требуется.
WAV-стеганография
Ключевая особенность атаки — использование стеганографии. Вредонос скачивает с C2-сервера файлы, замаскированные под WAV-аудио (ringtone.wav для Linux/macOS, hangup.wav для Windows). Исполняемый код спрятан в аудиофреймах и извлекается через XOR-деобфускацию. Импорт модуля wave в SDK для телефонии — единственный «красный флаг», который мог выдать атаку при code review.
Windows: бэкдор через автозагрузку
Функция setup() проверяет os.name == 'nt', затем скачивает бинарник из WAV-файла и сохраняет его как msbuild.exe в папку автозагрузки Windows. Имя файла имитирует легитимный инструмент Microsoft Build Engine. Бэкдор запускается при каждом входе в систему с кулдауном повторной установки 12 часов.
Linux/macOS: кража учётных данных
Функция FetchAudio() запускает второй этап из base64-закодированной переменной (4 436 символов). Скрипт собирает учётные данные, API-ключи, SSH-ключи и секреты, шифрует их связкой AES-256-CBC + RSA-4096 с хардкодированным публичным ключом и отправляет на C2-сервер через HTTP POST.
Баг атакующего
Любопытная деталь: в версии 4.87.1 атака на Windows не работала. Атакующий вызвал Setup() с заглавной буквы, тогда как функция определена как setup() со строчной. Это вызывало NameError, прерывавший выполнение модуля до запуска FetchAudio(). Версия 4.87.2 — по сути патч-релиз атакующего, исправляющий эту опечатку.
Связь с TeamPCP: цепочка атак
RSA-4096 публичный ключ, зашитый в вредоносный код, побайтово совпадает с ключом из компрометации пакета litellm. Это позволяет с высокой уверенностью атрибутировать атаку группировке TeamPCP. Группировка использует инфраструктуру CanisterWorm, размещённую на блокчейне Internet Computer Protocol (ICP) — без единой точки отказа.
Компрометация telnyx — третье крупное звено в каскадной атаке TeamPCP:
- 27 февраля — атака на репозиторий Trivy (сканер уязвимостей от Aqua Security) через вредоносный PR
- 19–20 марта — заражённый Trivy v0.69.4 опубликован, CanisterWorm распространился на 46+ npm-пакетов
- 23 марта — скомпрометированы Checkmarx GitHub Actions
- 24 марта — заражены версии litellm 1.82.7 и 1.82.8 на PyPI (~97 млн загрузок/мес)
- 27 марта — заражены версии telnyx 4.87.1 и 4.87.2 на PyPI
Что делать
- Проверьте версию telnyx в ваших проектах
- Если установлена 4.87.1 или 4.87.2 — немедленно откатитесь на 4.87.0
- Проверьте наличие файла
msbuild.exeв папке автозагрузки Windows - Проверьте сетевые соединения с IP 83.142.209.203
- Если обнаружены IoC — считайте все учётные данные, API-ключи и SSH-ключи скомпрометированными
- Проверьте CI/CD на использование других скомпрометированных пакетов TeamPCP: Trivy, Checkmarx Actions, litellm
- Включите Trusted Publishers для всех ваших PyPI-пакетов
Индикаторы компрометации (IoC)
CVE-2026-33634 (CVSS 9.4) — GitHub issue #235
FAQ
Какие версии telnyx заражены?
Вредоносный код содержится в версиях 4.87.1 и 4.87.2. Обе уже карантинированы PyPI. Последняя безопасная версия — 4.87.0. При этом в 4.87.1 из-за опечатки атакующего ни один из векторов атаки фактически не срабатывал.
Как атакующие получили доступ к PyPI?
Через украденный PyPI API-токен. GitHub-репозиторий telnyx не был скомпрометирован — атакующие загрузили пакеты напрямую на PyPI через twine, минуя CI/CD. У проекта не был настроен Trusted Publisher (OIDC), который предотвратил бы такую атаку.
Кто стоит за атакой?
Атака атрибутирована группировке TeamPCP. Это та же группа, которая ранее скомпрометировала сканер уязвимостей Trivy, GitHub Actions Checkmarx и PyPI-пакет litellm. RSA-ключ в вредоносном коде побайтово совпадает с ключом из предыдущих атак. Инфраструктура CanisterWorm размещена на блокчейне ICP, что делает её устойчивой к блокировке.
Что делать, если я уже установил заражённую версию?
Немедленно откатитесь на версию 4.87.0. Проверьте систему на наличие IoC. Если обнаружены признаки компрометации — считайте все учётные данные, API-ключи и SSH-ключи на этой машине скомпрометированными и выполните их ротацию. Также проверьте CI/CD на использование Trivy, Checkmarx Actions и litellm.
Выводы
Атака на telnyx — не изолированный инцидент. Это часть каскадной кампании TeamPCP, которая за месяц скомпрометировала Trivy, Checkmarx, litellm и теперь telnyx. Единственная надёжная защита — PyPI Trusted Publishers (OIDC), привязывающий загрузку к конкретному GitHub-репозиторию.
Этот инцидент в очередной раз показывает: доверять пакетам из PyPI «на слово» нельзя, даже если это официальный SDK крупной платформы. Настройте Trusted Publishers, пиньте версии зависимостей, проверяйте хеши при установке. Проверьте свои проекты прямо сейчас.
Источники: SafeDep, Aikido, The Hacker News, JFrog Security Research