Семнадцать пакетов, опубликованных 7 июля 2026 года в реестрах npm и PyPI, представляют собой целенаправленную атаку на разработчиков, использующих официальные SDK для платежных систем PaySafe, Skrill и Neteller. Вредоносный код маскируется под легитимные клиентские библиотеки, перехватывает ключи API и токены доступа, после чего отправляет похищенные данные на инфраструктуру, развернутую через ngrok. Аналитики платформы Socket выявили кампанию в течение шести минут после публикации, однако часть пакетов могла попасть в зависимости проектов до блокировки.
Описание
Атака затронула тринадцать пакетов в npm и четыре в PyPI. Каждый npm-пакет содержал четыре вредоносные версии (1.0.0-1.0.3), а PyPI-пакеты - по одной версии 1.0.0. В списке значатся имена, прямо ассоциирующиеся с брендами: paysafe-checkout, paysafe-vault, neteller, skrill-payments, paysafe-js, paysafe-api, paysafe-node, paysafe-cards, paysafe-fraud, paysafe-kyc, skrill, skrill-sdk, paysafe-payments (npm), а также paysafe-kyc, paysafe-payments, paysafe-sdk и paysafe-api (PyPI). Злоумышленники одновременно загрузили пакеты в оба реестра, что указывает на спланированную операцию.
Механизм атаки строится вокруг поддельного класса PaysafeClient, который имитирует поведение реального REST-клиента PaySafe. В npm-пакете paysafe-node, например, конструктор считывает переменные окружения PAYSAFE_API_KEY и PAYSAFE_ENV. Если ключ присутствует, при каждом вызове методов payments.create, payments.get, customers.create и customers.get запускается таймер, который через 11,7 секунды вызывает функцию эксфильтрации. При этом сам класс не выполняет никаких сетевых запросов к настоящим серверам api.paysafe.com - он лишь возвращает заглушку { success: true, method, path }, оставляя разработчика в неведении о фоновой утечке.
Для обхода анализа в изолированных средах вредоносная функция isSandbox проверяет количество ядер процессора: если их меньше двух, выполнение прекращается. Также проверяются имя хоста и имя пользователя - если они содержат подстроки sandbox, analyzer, cuckoo, virus, malware, vmware или vbox, эксфильтрация не запускается. Такая техника противодействия песочницам позволяет обходить автоматизированные системы обнаружения, которые не эмулируют полноценное окружение.
Командный сервер (C2) скрыт за тремя уровнями декодирования. Сначала строка в кодировке base64 расшифровывается с помощью операции XOR с ключом SGf6lmbr7GHUg99Z6R2U3g==. Затем каждый символ полученной строки сдвигается на 17 позиций назад по таблице ASCII. Финальным шагом строка переворачивается. В результате получается домен caliber-spinner-finishing.ngrok-free[.]dev. Использование бесплатного туннельного сервиса ngrok характерно для киберпреступных групп - IP-адрес этого хоста ранее фиксировался как часть инфраструктуры стилера NjRAT.
Согласно анализу вредоносного кода, эксфильтрация активируется только при наличии PAYSAFE_API_KEY. В функцию exfiltrate передаются имя хоста, имя пользователя, текущий рабочий каталог, временная метка и, самое важное, все переменные окружения, в названиях которых встречаются слова KEY, SECRET, TOKEN, PASS, AUTH или API. Значения обрезаются до первых 100 символов. В реальных условиях это означает захват не только ключа PaySafe, но и AWS_SECRET_ACCESS_KEY, GITHUB_TOKEN, NPM_TOKEN и других секретов, хранящихся в среде выполнения. Данные отправляются HTTPS POST-запросом на C2-сервер.
PyPI-пакеты ведут себя аналогично, но не требуют наличия API-ключа - эксфильтрация запускается при любом импорте модуля. Код на Python использует похожие методы обфускации: ключ XOR, обратный сдвиг символов и проверку окружения на наличие признаков песочницы. Вредоносный класс PaysafeClient из PyPI-версии также создаёт задержку в 12 секунд перед отправкой данных, имитируя полезную работу.
Каждое обновление или новая версия вредоносного пакета использует уникальные ключи шифрования, что затрудняет создание сигнатур для традиционных антивирусных средств. Файлы имеют разные хэши, хотя поведенчески идентичны. Аналитики отмечают, что злоумышленник продемонстрировал осведомлённость о методах защиты: он использует собственную схему обфускации, меняет ключи и применяет обход песочниц. Способность одновременно атаковать два экосистемы (npm и PyPI) затрудняет блокировку для команд, которые мониторят только один реестр.
Последствия инцидента значительны. Разработчики, включившие любой из этих пакетов в свои проекты, рисковали полной компрометацией учётных данных, включая доступ к платёжным шлюзам, облачным ресурсам и репозиториям исходного кода. Утечка ключа PaySafe позволяет злоумышленнику совершать операции от имени легитимного мерчанта, а захват токенов GitHub и npm даёт возможность внедрять вредоносный код в другие проекты через цепочку поставок.
Для снижения угрозы необходимо выполнить три шага. Первый - ротация всех секретов на машинах, где выполнялся или импортировался любой из перечисленных пакетов. Особое внимание следует уделить переменным окружения, совпадающим с шаблоном поиска злоумышленника. Второй - проверка деревьев зависимостей проектов на наличие имён из списка кампании и блокировка этих пакетов на уровне корпоративного прокси-сервера реестра. Третий - анализ исходящих HTTPS-соединений с хостов сборки и CI-окружений к доменам вида *.ngrok-free.dev. Такие запросы нетипичны для легитимных платежных SDK и служат явным признаком присутствия вредоносной нагрузки.
Хотя кампания была раскрыта быстро, её продуманность и использование shared-инфраструктуры (ngrok ранее ассоциировался с другими стилерами) позволяют прогнозировать появление новых волн атак от этого же автора. Сочетание финансовой мотивации, технической грамотности в области обфускации и мультиэкосистемного подхода делает такие угрозы особенно опасными для компаний, разрабатывающих платёжные интеграции.
Индикаторы компрометации
Domain
- caliber-spinner-finishing.ngrok-free.dev
URL
- https://caliber-spinner-finishing.ngrok-free.dev:443/
SHA256
- 1314fc888ca5b3ea91a04e1f5b63039ffc7fc3832b8d809a28ad549c6f9d4f23
- 1bae9f2fb9866422f07345501fa2cb4c3a99f2652c8c9decdc27ffbf9714e7bc
- 1bfa32548676d32b7639d3171e2f9feefba5026dc336968c91f4ae2b152c5410
- 1d567795a366b9edcfef7f1fa2d398b7cb41890dd3b2f3f1f9803de0cdba0c89
- 1df8c579ffcbf5527b1856bd1774601a5188b380e442c5a0fbd400bd86a4501b
- 2303a74a5fac917279f1078e03a4bfd6afbb89462f97d7344ed10e6e9e9e92b7
- 2b7696575278e6e223cc44553c687e45afd04df7eb32efbf49b39da64b795982
- 2bc8af4bd2f539630f7800f3491b64c7e2bffe12e955d0d4f03a4f6a4b0018bd
- 2cbfc4e4b1de5e68ab81fba7e1b0c711b4d26197b48ea4db6819c9cea223b0ed
- 2edb3f162f9676196e818d9b795d599ba119a961ffe98c4866351735980d213d
- 313853a82bce61052c00e6a6af85b5069e007a76122c727f31661bc636b12f14
- 390bca9d70efa42cb792f7f677189821a24527cd4298ab2acb954df0abb5c1c3
- 39371ac7061168dd3d890061267b3875bc4b30dca5e28d40dbc27a4396439ff1
- 3a0dd3479eaf85b65e5abd63d6451f98506faddee47cf4bebd9f91296abb29f0
- 447484c76a06918d7f6f6c6f95ee2bced6dd2e9b282c6f5b92b2b7c0976381d5
- 4a4b5c1bc1e948c853cb0978c07c7b8d1540c7b1ded95f8d5ad25c126cb6c7b0
- 50cb7550224d8d227a0625e7f53be86924d8e057e403b6b91b83ea20df834048
- 5242c5086d75a492d14e474de7c8f34b18ec0a8a9ce6d77eec8675a9572d9d23
- 52a57c502e40b3f9897d0ca32bba6f844b4113f5c017627ea9eba660eb47f405
- 5c4faef80c83c7ec0925a4aacb4bddabe82b91066ac41305907ba277cd7b3b85
- 5cd62e708ae4393c99579ec1433571998299bf7e2fde9bafeb9a79f8bdf065e9
- 615805652b2f006e69512b90d0d63883d7ae1ede69d86384fd77bd46235b2369
- 616b41657e9afaa9354fc1a106393373dcbf8aac8455b7d2cbbb44463434528e
- 61b61dd25cd8dcc43cd78418f3e3eb3fd9002d9e49961eefb12c1022ce4c3b63
- 67e4d6a4f53098e48bfa6ecceeaa754592bc249b83404bcfb8542977ae36dac4
- 67eb3bd505ebfffbd73fc3ef0b2976c375df732f0bd0496ed6653c3e2be5a0e5
- 6dc672e3bab8bcf80c66b2f95150067fb47429d4cf65eb95215e5f3abc7cade5
- 6e251c3d2bde8fff0487c1eecd359c4a544a09fd708755020e4b1c53ad6b8dd1
- 727fe9c1dfa39d6590012e0593c9837c628fc2cd22aa0f4e486b7ed1aec02697
- 8a58e3ed713c1c70f421ab56a18cfb6a120c960d227e495b511c2552f25f188b
- 8a70a5c1075f2dea4db94633ddc64b0d03d0385fdeda7c226acc944331febf43
- 9727c804c4354e481d2ff9d4934bd1b2518293a9ca34a14f5c7ae9d0cd30ce94
- 9e9655f54bfac8a937d78ac506722bae1468ead4cc9ee95b35e0f8ef17ee13d9
- 9fd06d823d54183cc91625fdc6decffe8db2863f6499a955656ebdcc089792cf
- a0313822513f9b89479f666888a4784a3fc99b4cc4566213dcda66b03b47120c
- a677c02e545941e43f8b21a5761b035e911b53e2c065fea219e0f3462f282fd8
- af66bc2b516d1ef71af9b6ee9f8f5af0a99fed562b34809cd55071b94c2d1304
- b04daeacd1d1c9020cce2a97fa7af83dbedf4e6d17dd12c0f337f32240399785
- b157a66826d27512c3618817fee924e53d14cabb2c4c7f454affde37350f55f0
- b29973eda4d0c090608c15a976688cad0b2114fdc0dcb89ad37515287ba13aad
- b2ea8d69f6792a87327ffde2ee4551bb6b99617f53e1ba71bf9a70f45dbc57ea
- c2a361a7d8feb95be97c957fc7652d348f4fa9a987bde5f09883f46b65c460f1
- c2a69a33b086364ca51b030b6b15e99be46ce8255ddf62839a4fc7f2b34023de
- c2e4483abea830ba8b8230540ace51788d0712bed9006697ddddb9cbf133c151
- c51c0b6c7817443b021aff44d4416c09fd039849db81860b9b5144e789fa3987
- c6af37a6739f0d919ab7049caf3a85831cab44bdbea27e0d9de7adec80334e2b
- c8b4d17c1f0aa7c50f2fa23d7c328482a4ad2c4da4d600f358ebdf200cbefd83
- cd7255730b6a7a3895d622d37d0e8f984d2d280689acef56ff195d663e7723ad
- ce09810adca70ebec87bc455380ef629ceaa2a0d926149d9115604060167682c
- d1889d81cfa99d52017732da9dc52127d03893037874c8671943cede4b8d1bb2
- d4ed2d87942fbefa5d7b7f19fb6f2e9bc293c96bf577bb97ed3ca56185abcf25
- dabb47d75f2efa6a5540661484efa989ccb338f24938b23152f14f3e424b0cb5
- e076e13a7e112d364f03bd1ead7abaa83249d544491621254860ab0a73adc9b9
- eae055c5736366811d2a4b1f78ff206486e7f7445040122efbe023ecd2d20bcc
- f43cb68850a2506805d60ff466f54eba331e1cc2a513b329f5121e0c39104418
- f7d9865ea3874d2b135eeee0aa0d12fc108d89e1dd706e4e40eb7605b76d35ca