В конце июня 2026 года исследователи из платформы YesWeHack при изучении нового эксплойта для Joomla столкнулись с необычной цепочкой заражения. Подозрительный репозиторий на GitHub предлагал готовый proof-of-concept (PoC - прототип эксплойта) для критической уязвимости CVE-2026-48908. Вместо рабочего кода репозиторий содержал троянизированные Python-пакеты, которые после установки разворачивали удалённый троян управления (RAT). Кампания, получившая название ChocoPoC, оказалась не единичным инцидентом, а частью систематической атаки на сообщество специалистов по кибербезопасности.
Описание
Злоумышленники использовали психологическое давление: исследователи уязвимостей и пентестеры часто вынуждены быстро проверять свежие PoC, чтобы разработать сигнатуры для систем обнаружения. Время играет решающую роль, и привычка запускать непроверенный код может привести к компрометации рабочей станции. В данном случае вредоносная нагрузка была спрятана в транзитивных зависимостях - пакетах, которые устанавливаются автоматически при выполнении команды pip install. Основной PoC-файл оставался внешне безобидным.
Совместный анализ компаний YesWeHack и Sekoia TDR выявил не менее семи поддельных репозиториев, созданных с ноября 2025 года по июнь 2026 года. Все они маскировались под эксплойты для громких уязвимостей: React2Shell (CVE-2025-55182), FortiWeb (CVE-2025-64446), Ivanti Sentry (CVE-2026-10520) и других. Репозитории публиковались с аккаунтов, зарегистрированных за две-три недели до атаки, а адреса электронной почты авторов были скомпрометированы в предыдущих утечках. Это указывает на использование украденных учётных данных для создания ложного следа.
Цепочка заражения начинается с установки пакета frint, который тянет за собой пакет skytext. Последний содержит скомпилированное нативное расширение - файл gradient.so для Linux или gradient.pyd для Windows. При импорте модуля в коде PoC загружается эта бинарная библиотека. Python автоматически отдаёт приоритет скомпилированным модулям перед обычными Python-скриптами, что и использует злоумышленник. Внутри библиотеки скрыт обфусцированный код, который выполняет антиотладку: проверяет наличие отладчика и аппаратных точек останова через системные вызовы. Затем вредонос расшифровывает пять встроенных Python-сценариев, используя уникальный ключ, зависящий от контекста выполнения.
Ключевая особенность - экологическое шлюзование (environmental key gating). Вредоносная функция вычисляет хеш от имени запущенного скрипта и сравнивает его с заранее заданным значением. Если имя файла не совпадает с EXPLOIT_POC.py или exploit.py (в разных версиях кампании), заражение не активируется. Это позволяет обходить автоматические песочницы и изолированные детонации, где файл обычно называется sample.exe или test.py. Только в среде реального исследователя, запускающего свежий PoC, нагрузка начинает действовать.
После активации один из расшифрованных скриптов обеспечивает закрепление в системе. Он внедряет троянизированную версию пакета "_distutils_hack" в директорию site-packages Python, а также добавляет файлы с расширением .pth. Эти файлы автоматически выполняются при каждом запуске интерпретатора Python. Таким образом, даже если исследователь удалит исходный PoC, вредонос останется активным. Далее запускается скрипт choco.py, который функционирует как загрузчик второй стадии.
Для связи с командным сервером (C2) злоумышленники применили нестандартный метод: они используют публичный API картографического сервиса Mapbox. Загрузчик choco.py обращается к DNS-over-HTTPS (DoH), чтобы разрешить доменное имя api.mapbox.com, а затем отправляет HTTPS-запрос к определённому набору данных (dataset) Mapbox, используя публичный токен. В ответе сервера содержится закодированная в Base64 полезная нагрузка - финальный скрипт RAT. Такой подход маскирует трафик под легитимные обращения к API Mapbox и затрудняет обнаружение сетевыми экранами.
Финальная стадия - полноценный троян удалённого доступа (RAT), написанный на Python. Он способен выполнять произвольные команды оболочки, запускать произвольный Python-код, собирать данные из браузеров (Chrome, Brave, Edge, Firefox), извлекать файлы определённых расширений (.txt, .md, .db), а также менять интервал опроса C2. Команды частично названы на испанском языке: hola (сбор информации о системе), dormir (изменить интервал), browserdata (кража учётных данных). При этом в коде обнаружены ошибки программирования - вызовы несуществующих функций и проверки неопределённых переменных. Это указывает на то, что вредонос не проходил тщательного тестирования и, вероятно, не создавался с использованием генеративных нейросетей.
Сопоставление разных эпизодов кампании показало, что злоумышленники использовали метод ротации учётных записей. Для первой волны (ноябрь 2025 года) применялись пакеты slogsec и logcrypt.cryptography, а также Mapbox-аккаунт с именем mattallahsaed. Вторая волна (май-июнь 2026 года) использовала frint и skytext, а также аккаунт frankley. При этом идентификаторы Mapbox-наборов данных и алгоритмы хеширования оставались одинаковыми. Это даёт основания с высокой уверенностью приписать все инциденты одному оператору.
Количество загрузок вредоносных пакетов, по данным сервисов pepy.tech и pypistats.org, составляет около 2400 для пакета skytext. Пики загрузок совпадают с датами публикаций эксплойтов для реальных уязвимостей: например, всплеск 5 мая 2026 года коррелирует с выходом PoC для уязвимости Linux Copy Fail, добавленной в каталог CISA KEV. Это подтверждает, что исследователи действительно устанавливали эти пакеты, выполняя PoC для проверки актуальных угроз.
Данная кампания представляет собой новую вариацию атаки на цепочку поставок, где мишенью выступают сами специалисты по безопасности. Компрометация рабочей станции исследователя даёт злоумышленнику доступ к конфиденциальным данным клиентов, отчётам пентестов, учётным записям и инфраструктуре, с которой работает специалист. Атака не требует высокой квалификации жертвы - достаточно обычной привычки быстро устанавливать зависимости из непроверенных источников.
Защита от подобных угроз заключается в многоступенчатой проверке: изолированное выполнение PoC в контейнерах или виртуальных машинах без доступа к реальным данным, анализ всех транзитивных зависимостей, проверка свежести аккаунтов на GitHub и PyPI, а также мониторинг сетевого трафика на необычные DNS-запросы или обращения к публичным API. Пока же операторы кампании продолжают использовать новые учётные записи и обновлённые пакеты, что делает ChocoPoC устойчивой и развивающейся угрозой для сообщества исследователей.
Индикаторы компрометации
URL
- https://api.mapbox.com/datasets/v1/frankley/cmor0tcxf008i1mmpd7apt903/features/dm370543acmdopk296nahbtua?access_token=pk.eyJ1IjoiZnJhbmtsZXkiLCJhIjoiY21vNzFzaXNzMDJrMjJxcHJqY3JscnlpYSJ9.fuMfMgsxlOGxRy44A-y0WQ
- https://api.mapbox.com/datasets/v1/mattallahsaed/cmismaye7000s1mp2v8fkn4lp/features/dm370543acmdopk296nahbtua?access_token=pk.eyJ1IjoibWF0dGFsbGFoc2FlZCIsImEiOiJjbWlzbWpncWkwNHRmM2ZzMWd1eTBmanQ4In0.VNFutzqzaSVfDiwQFr7_gQ
- https://github.com/bolubey/CVE-2026-0257
- https://github.com/bolubey/CVE-2026-50751
- https://github.com/lincemorado97/CVE-2025-14847
- https://github.com/lincemorado97/CVE-2025-55182_CVE-2025-66478
- https://github.com/lincemorado97/CVE-2025-64446_CVE-2025-58034
- https://github.com/ogenich/CVE-2026-10520
- https://github.com/ogenich/CVE-2026-48908
SHA256
- 17997e9e0256d0f5d5d21a4852c37f16b338e4bb9c2bec09bdfd822b24aa76b4
- 320b29844892e3c59bc6fcb07e701b2b3230a37cb4a13176174e9e294ec6d43e
- 40569318e89db751ff3886b2617d990d8a343f0d1d8727b7f978a28129ca36bc
- 5abd45d6f4a1705dca55d882f017d4768888dce9ad99cea40b3da35c23de5cae
- 93739477cd379adef95126b22758c0e644282d2028dd297328ce856fa111dd06