В начале апреля 2026 года мир информационной безопасности столкнулся с ярким примером высокоцелевой и многоступенчатой кибератаки, где в качестве вектора начального доступа был использован реестр пакетов npm. Вместо привычного широкомасштабного загрязнения цепочки поставок, злоумышленники сосредоточились на конкретной организации - эстонской криптовалютной бирже и платёжном шлюзе Guardarian. Инцидент демонстрирует, как одна уязвимая зависимость в системе управления контентом может привести к полному компрометированию производственной инфраструктуры, включая базы данных, секретные ключи и личные данные сотрудников.
Описание
В течение двух часов, 3 апреля, аккаунт под именем "umarbek1233" опубликовал в npm девять вредоносных пакетов, маскирующихся под плагины для популярной CMS Strapi. Все пакеты, имевшие версию 3.6.8, содержали скрипт "postinstall", который исполнялся автоматически в момент установки. Этот скрипт разворачивал многофазного агента для управления командным сервером, который начинал тотальный сбор чувствительной информации с поражённой системы. Агент последовательно извлекал переменные окружения, учётные данные баз данных PostgreSQL, JWT-секреты, ключи API, содержимое Redis, секреты Docker, токены Kubernetes, SSH-ключи и данные криптокошельков. Завершался процесс установкой постоянного обратного подключения к серверу злоумышленника с опросом каждые пять секунд.
Главной и подтверждённой жертвой стала компания Guardarian. Атакующий успешно эксфильтрировал логин и пароль ("user_strapi" / "1QKtYPp18UsyU2ZwInVM") для производственной базы данных, критически важные JWT-секреты для админки и аутентификации, детали интеграций с API CoinMarketCap и ChangeNow, а также подтвердил активное подключение к Redis. Более того, в ходе атаки были собраны корпоративные адреса электронной почты сотрудников, которые затем использовались в атаках подбора учётных данных. Аналитики, изучившие открытый директорий на C2-сервере, обнаружили полный набор инструментов злоумышленника, включая скрипты для эксплуатации уязвимостей, перехвата трафика и кражи данных.
Ключевой особенностью инцидента стала небрежность самих атакующих, позволившая детально изучить их методы. Их командный сервер с IP-адресом 144.31.107[.]231 имел открытый листинг директории на порту 8888, где в свободном доступе находились 52 файла. Среди них - исходный код C2-сервера, цепочки эксплуатации для уязвимости CVE-2023-22621 (Server-Side Template Injection в шаблонах писем Strapi), прокси-серверы для перехвата TLS-трафика к Elasticsearch, скрипты для подбора паролей с указанием имён сотрудников Guardarian и лог эксфильтрации объёмом 8.8 МБ, содержащий данные с более чем 14 поражённых контейнеров. Этот архив данных беспрецедентно подробно раскрывает тактику, технику и процедуры (TTP) группировки.
Атака не ограничилась кражей статических секретов. Используя доступ к базе данных, злоумышленники активно эксплуатировали CVE-2023-22621, внедряя вредоносные шаблоны в механизм сброса пароля Strapi для выполнения произвольного кода. Также был развёрнут сложный атакующий комплекс для перехвата учётных данных Elasticsearch путём подмены DNS и использования самоподписанного сертификата. В инструментарии обнаружены скрипты для эскалации привилегий внутри контейнеров, например, через уязвимость в подсистеме OverlayFS, и для латерального перемещения по сети, включая сканирование портов и зондирование служб. Всё это указывает на высокий уровень подготовки и целенаправленный характер операции, конечной целью которой, вероятно, был прямой финансовый ущерб или хищение криптовалютных средств.
Расследование выявило несколько серьёзных промахов в операционной безопасности (OPSEC) злоумышленников. Помимо открытого директория, весь обмен данными с C2 вёлcя по незашифрованному HTTP-протоколу. В скриптах были в открытом виде прописаны украденные пароли и ключи API. Анализ пути "/opt/hexstrike_ssrf/" на сервере указывает на возможное название инструментария или группировки - "HEXSTRIKE". Учётная запись npm "umarbek1233" и связанный с ней временный email "cla4d@sharebot[.]net" носят признаки одноразового использования, однако само имя "Umarbek" может указывать на центральноазиатский регион. Внутри скриптов для подбора паролей фигурируют сотрудники Guardarian: "alex.t@", "dmitrii.s@", "felipe.s@guardarian[.]com", а также сотрудник партнёрской компании ChangeNow.
Этот инцидент служит суровым напоминанием для всех компаний, особенно работающих в финансовом и криптовалютном секторах. Атаки через цепочку поставок программного обеспечения становятся всё более изощрёнными и целевыми. Критически важно внедрять строгие практики управления зависимостями, включая сканирование на наличие уязвимостей и проверку репутации пакетов, особенно при использовании в производственных средах. Шифрование секретов, сегментация сети, минимальные привилегии для контейнеров и постоянный мониторинг аномальной активности - это не рекомендации, а обязательные элементы современной стратегии защиты. История с Guardarian показывает, что одна ошибка в конфигурации или доверие к непроверенному пакету могут открыть путь для полномасштабного вторжения, последствия которого выходят далеко за рамки единичного скомпрометированного сервера.
Индикаторы компрометации
IPv4
- 128.140.36.22
- 128.140.36.223
- 138.201.100.98
- 65.21.203.242
- 65.21.78.244
IPv4 Port Combinations
- 144.31.107.231:22
- 144.31.107.231:4444
- 144.31.107.231:8888
- 144.31.107.231:9999
SHA1
- 9639769d81d0573e7241d0c5957ef1a900c74ca6
SHA256
- 27001f1a29590cf6645741769a0ae44dc9ee3c6bc948843c14824b17f49a72ff
- 77b23d754585a5eb5f67cf5dbbc123c4bd9203861018f1b52d13736fa8423b5a
- b42c4f7b912ccba6f8e3812b68fb664ac52d887e68a4ae5c7d7977912dd81a6c
- f4aa76c95b3855e16ffd7083834664ee13bd45d91ddacd472f94ec15979e21e3
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | rule HEXSTRIKE_NPM_C2Agent { meta: author = "GHOST - Breakglass Intelligence" date = "2026-04-03" description = "Detects HEXSTRIKE npm supply chain C2 agent (postinstall.js)" tlp = "WHITE" hash = "b42c4f7b912ccba6f8e3812b68fb664ac52d887e68a4ae5c7d7977912dd81a6c" strings: $s1 = "guard-" ascii $s2 = "/c2/" ascii $s3 = "/beacon" ascii $s4 = "/envdump" ascii $s5 = "/redis-full" ascii $s6 = "/docker" ascii $s7 = "/keyfile" ascii $s8 = "/poll" ascii $s9 = "Math.random().toString(36).slice(2, 8)" ascii $s10 = "144.31.107.231" ascii $env1 = "/app/.env" ascii $env2 = "/home/strapi/.env" ascii $env3 = "kubernetes.io/serviceaccount/token" ascii $cmd1 = "KEYS *" ascii $cmd2 = "find / -maxdepth" ascii condition: filesize < 20KB and ( ($s10 and 2 of ($s*)) or (4 of ($s*) and 1 of ($env*)) or ($s9 and $s2 and $s3) ) } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | rule HEXSTRIKE_SSTI_Exploit { meta: author = "GHOST - Breakglass Intelligence" date = "2026-04-03" description = "Detects HEXSTRIKE CVE-2023-22621 SSTI injection scripts" tlp = "WHITE" strings: $s1 = "plugin_users-permissions_email" ascii $s2 = "reset_password" ascii $s3 = "core_store" ascii $s4 = "global.process.mainModule.require" ascii $s5 = "SSTI_TEMPLATE_INJECTED" ascii $s6 = "hexstrike" ascii nocase $s7 = "1QKtYPp18UsyU2ZwInVM" ascii $s8 = "ssti-env" ascii $s9 = "STEALTH_SSTI_SET" ascii condition: filesize < 10KB and ( ($s1 and $s2 and $s4) or ($s5 or $s9) or ($s7 and ($s1 or $s3)) ) } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | rule HEXSTRIKE_C2Server { meta: author = "GHOST - Breakglass Intelligence" date = "2026-04-03" description = "Detects HEXSTRIKE C2 server (Python)" tlp = "WHITE" strings: $s1 = "hexstrike_ssrf" ascii $s2 = "exfil.log" ascii $s3 = "cmd.txt" ascii $s4 = "/shell.sh" ascii $s5 = "BaseHTTPRequestHandler" ascii $s6 = "C2 Server on" ascii condition: filesize < 5KB and $s5 and 2 of ($s*) } |