Новая кампания TeamPCP: вредоносные пакеты для SAP и кража данных через среду разработчика

information security

Атаки на цепочки поставок софта становятся всё более изощрёнными. Группа TeamPCP, ранее известная по компрометации библиотек для Bitwarden и Checkmarx, запустила новую операцию под кодовым названием "Mini Shai Hulud". Её цель - разработчики, использующие пакеты для SAP. Злоумышленники модифицировали легитимные модули экосистемы SAP, например "@cap-js/sqlite" и "@cap-js/postgres", чтобы внедрить в них вредоносный код. Установка таких пакетов через менеджер зависимостей npm автоматически запускала скрытый скрипт, который загружал среду выполнения Bun и исполнял зашифрованную полезную нагрузку.

Описание

Особенность этой атаки - многоступенчатая архитектура. На первом этапе жертва устанавливает скомпрометированный пакет, даже не подозревая, что вместе с ним получает вредоносную программу. На втором этапе вредоносная нагрузка превращается в инструмент для кражи учётных данных и дальнейшего распространения. Она собирает токены доступа к GitHub, npm, облачным сервисам AWS, Azure и GCP, а также данные о конфигурации Kubernetes. Кроме того, программа способна извлекать секреты из памяти сборочных конвейеров непрерывной интеграции и доставки.

К 30 апреля 2026 года список скомпрометированных пакетов пополнился. Специалисты Wiz обнаружили вредоносные версии модулей "intercom-client" для npm (версия 7.0.5) и "lightning" для PyPI (версии 2.6.2 и 2.6.3). Анализ показал, что эти пакеты содержат ту же вредоносную функциональность, что и ранее скомпрометированные пакеты SAP. Это подтверждает системный характер атаки: злоумышленники не ограничиваются одной экосистемой, а расширяют охват, поражая как JavaScript-сообщество, так и пользователей Python.

Команда исследователей безопасности подробно изучила механизмы кражи данных. Вредоносная программа использует собственные каналы передачи информации. Раньше в операциях TeamPCP применялся резервный метод эксфильтрации - отправка данных на сервер управления и только при его недоступности через GitHub. В новой версии алгоритм изменился: теперь GitHub стал основным каналом. Программа создаёт на GitHub репозиторий с названием вида "слово-слово-число" и описанием "Checkmarx Configuration Storage" и отправляет туда зашифрованный пакет с украденными данными. При этом используется более современный протокол GraphQL, а не классический REST.

Ещё одно новшество - атака на окружения разработчиков, использующих популярные редакторы кода. Если программа не находит персональный токен доступа к GitHub, она пытается заразить сам репозиторий жертвы. Для этого в папки проекта добавляются специальные файлы конфигурации. Например, файл ".claude/settings.json" настраивает запуск вредоносного скрипта при каждом новом сеансе в среде Claude Code от компании Anthropic. Аналогично файл ".vscode/tasks.json" активирует код при открытии папки в редакторе Visual Studio Code. Таким образом, злоумышленники используют доверие разработчиков к привычным инструментам, чтобы распространить инфекцию дальше.

Важное дополнение - возможность кражи паролей из браузеров. В предыдущих атаках TeamPCP такой функции не было. Теперь программа умеет извлекать сохранённые пароли из Chrome, Safari, Edge, Brave и Chromium. Это значительно расширяет объём потенциально украденных данных, особенно у тех разработчиков, кто использует менеджеры паролей, встроенные в браузер.

Отдельного внимания заслуживает механизм отказоустойчивости. Если вредоносная программа не может найти локальные токены для эксфильтрации, она начинает поиск по всему GitHub. Программа сканирует коммиты, содержащие сигнатуру "OhNoWhatsGoingOnWithGitHub", за которой следует двойное base64-кодирование токена доступа. Найдя такой коммит, она извлекает и проверяет токен, а затем использует его для отправки украденных данных в другой, уже подконтрольный злоумышленникам репозиторий. Это означает, что даже если организация не создавала новых репозиториев и не обновляла пакеты, её секреты всё равно могут оказаться скомпрометированными, если какой-то другой репозиторий в экосистеме стал жертвой.

Атрибуция новой кампании группе TeamPCP подтверждена несколькими факторами. Во-первых, в обоих случаях используется один и тот же открытый ключ RSA для шифрования украденных данных. Это значит, что только владелец соответствующего частного ключа может расшифровать информацию, и доступ к ней получают лишь сами злоумышленники. Во-вторых, вредоносная программа проверяет системные настройки языка и локали. Если значение начинается с "ru" (русский), программа немедленно завершает работу и ничего не похищает. Такая проверка присутствовала и в предыдущих операциях TeamPCP. В-третьих, используется тот же метод внедрения через npm-хук установки пакета, что и при атаке на Bitwarden.

Хотя в названии операции есть отсылки к прошлым кампаниям "Shai Hulud" (название песчаного червя из вселенной "Дюны"), эксперты не могут с полной уверенностью утверждать, что это та же группа. Однако сходство техник и кода очень велико. Сейчас кампания остаётся активной, хотя количество скомпрометированных пользователей и созданных репозиториев пока значительно меньше, чем в предыдущих волнах. Это может означать, что злоумышленники либо тестируют новые методы, либо готовят более масштабную атаку. Разработчикам, особенно работающим с SAP и облачными средами, стоит внимательно проверять устанавливаемые пакеты, а также следить за активностью в своих репозиториях GitHub на наличие подозрительных коммитов и файлов конфигурации. Кампания TeamPCP в очередной раз показывает, что атаки на цепочку поставок становятся всё более целенаправленными и используют сразу несколько векторов для кражи данных.

Индикаторы компрометации

Npm packages

  • @cap-js/sqlite – v2.2.2
  • @cap-js/postgres – v2.2.2
  • @cap-js/db-service – v2.10.1
  • mbt – v1.2.48

MD5

  • 04d8a99447b16f6839fff3b978f88d7e
  • 35baf8316645372eea40b91d48acb067
  • 45dc9c02f82b4370ca92785282d43a86
  • 6fb87d243b011b5445f379f80e1a6b4d
  • 8cd683f78735c9bfc32600c73d3d9abe
  • b523a69b27064d1715d1f0aaffcfae63
  • d468f16eafccbc54a994f3d675ace8ae
  • e32eaf0c3cde9616831a1e92d42b0058

SHA1

  • 0af7415d65753f6aede8c9c0f39be478666b9c12
  • 307d0fa7407d40e67d14e9d5a4c61ac5b4f20431
  • 4b04304f6d51392e3f43856c94ca95800518a694
  • 6bc859aaee1f8885eec2a3016226e877e5adba08
  • 7b6a28e92149637e5d7c7f4a2d3e54acd507c929
  • bc95cc5dda788295aa0c9456791520599ef99526
  • ca4a5bb85778ffcd2153ace88fe2d882c8ceeb23
  • e80824a19f48d778a746571bb15279b5679fd61c

SHA256

  • 1d9e4ece8e13c8eaf94cb858470d1bd8f81bb58f62583552303774fa1579edee
  • 258257560fe2f1c2cc3924eae40718c829085b52ae3436b4e46d2565f6996271
  • 4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34
  • 6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95
  • 80a3d2877813968ef847ae73b5eeeb70b9435254e74d7f07d8cf4057f0a710ac
  • 86282ebcd3bebf50f087f2c6b00c62caa667cdcb53558033d85acd39e3d88b41
  • a1da198bb4e883d077a0e13351bf2c3acdea10497152292e873d79d4f7420211
  • eb6eb4154b03ec73218727dc643d26f4e14dfda2438112926bb5daf37ae8bcdb
Комментарии: 0