В мире информационной безопасности автоматическое сканирование артефактов на предмет вредоносного кода является неотъемлемой частью защиты цепочки поставок программного обеспечения (supply chain). Однако огромный поток предупреждений от сканеров создаёт проблему для аналитиков, которые вынуждены вручную обрабатывать сотни потенциальных угроз ежедневно. Для решения этой задачи специалисты компании разработали внутренний сервис RuneAI, который анализирует результаты сканирования THOR Thunderstorm, обогащает слабые сигналы контекстом и выделяет аномалии, заслуживающие внимания экспертов. Наглядным примером эффективности этого подхода стало недавнее обнаружение сложного вредоносного пакета.
Описание
Сервис RuneAI был задействован в рамках стандартного пайплайна проверки пакетов из таких источников, как npm, PyPI и VS Code Marketplace. После сканирования пакета "@etoroloro/my_node_js_module:1.0.1" инструмент THOR Thunderstorm выдал сигнал с низким уровнем уверенности. Тем не менее, RuneAI эскалировал его как подозрительный, что инициировало углублённый анализ. Автоматическая оценка сервиса показала критический уровень риска в 95%. В частности, система выявила несколько опасных паттернов поведения.
К ним относятся использование жёстко заданных (hardcoded) учётных данных Dropbox, доставка вредоносной полезной нагрузки (malicious payload) через этот же сервис, обеспечение устойчивости (persistence) через папку автозагрузки Windows и выполнение непроверенных удалённых команд. Наиболее подозрительный фрагмент кода содержал команды PowerShell для загрузки и распаковки ZIP-архивов с Dropbox с последующим копированием пакетного файла в автозагрузку. После эскалации от RuneAI эксперты приступили к ручному анализу. Исследование подтвердило, что пакет реализует многостадийную цепочку атаки, маскирующуюся под легитимное программное обеспечение.
На первой стадии пакет Node.js устанавливал легитимную библиотеку SQLite, однако использовал технику подмены DLL (DLL side-loading). Вредоносный компонент "sqlite3.dll" загружал "DLLSideload.dll". При этом в папке также оставался файл "sideload.jpg", который, по-видимому, был оставлен злоумышленником по ошибке. Далее основной загрузчик открывал файл "license.xml", который на самом деле являлся JPEG-изображением с присоединённым к его концу зашифрованным вторым этапом вредоносной программы (stage2 payload). Загрузчик искал в файле сигнатуру JPEG для отделения изображения от зашифрованных данных.
Затем следовало дешифрование с использованием кастомной реализации алгоритма AES в режиме ECB. Расшифрованный финальный этап оказался DLL-библиотекой фреймворка Cobalt Strike под названием "beacon.dll". Этот бэкдор предоставлял злоумышленнику полный удалённый доступ к системе. Конфигурация извлечённого образца показала, что командно-административный сервер (C2, Command & Control) располагался на IP-адресе "34.203.197[.]60", который принадлежит инфраструктуре Amazon EC2. Полезная нагрузка использовала HTTPS для связи, а интервал опроса сервера составлял 60000 миллисекунд.
Этот кейс наглядно демонстрирует эффективное разделение труда между автоматическими системами и искусственным интеллектом. Сканер THOR идеально справляется с задачами низкой неопределённости и высокого объёма, применяя тысячи правил к артефактам. Человеческий аналитик, в свою очередь, незаменим для глубокого изучения сложных случаев с высокой неопределённостью. Искусственный интеллект, как показал RuneAI, занимает промежуточную позицию. Он не заменяет ни детерминированное сканирование, ни экспертизу человека, но способен обрабатывать умеренные объёмы несовершенных сигналов, обогащать их контекстом и указывать на аномалии, которые требуют пристального внимания.
Именно слабый сигнал от THOR, усиленный контекстным анализом RuneAI, позволил выявить эту сложную многоэтапную атаку. В результате компания планирует интегрировать подобные оценки на базе искусственного интеллекта в свои продукты. Соответствующие функции сначала появятся в THOR Cloud, а затем будут добавлены в аналитическую консоль ASGARD Analysis Cockpit. Таким образом, внедрение AI-сервисов в процессы триажа и анализа позволяет существенно снизить нагрузку на специалистов по безопасности и повысить вероятность обнаружения изощрённых угроз, которые могли бы затеряться в общем потоке предупреждений.
Индикаторы компрометации
IPv4 Port Combinations
- 34.203.197.60:443
URLs
- https://www.dropbox.com/scl/fi/f0yd861z6rvugtxuerjn1/protected.zip?rlkey=fx4gvjmf16q5owainu5pfld47&st=cn2oooqb&dl=1
- https://www.dropbox.com/scl/fi/wwbvmzsukfamp9ozo0xxj/data.zip?rlkey=w2j3q5jsmeqfyoyneo21g84qa&st=p443mlzs&dl=1
SHA256
- 6d79bbfadf675deed60b259ae272058c809bfdd53476c3673f9cca797c6fd10b
- d61864987b15020173d7a6ac84cfe0787a2b841fbbb9b98eb26b8c7c9acff5b1
- e0a0b3bf0eafc0560b1754c67b0e74e6ad0eeea32f573758f5ba8d7838e5d219
- f08c5b748c91dd45fd73c5e85920f656e361d94b869e2147410b2b528c6ae78f
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 | rule MAL_Etoroloro_Malicious_NodePackage_Dec25 { meta: description = "Detects malicious component of node package named Etoroloro" reference = "Internal Research" author = "Pezier Pierre-Henri" date = "2025-12-12" score = 80 hash = "f08c5b748c91dd45fd73c5e85920f656e361d94b869e2147410b2b528c6ae78f" strings: $s1 = "DLLSideload." $s2 = "Failed to expand path:" wide $op1 = { 41 0f af c0 // imul eax, r8d 48 8d 52 01 // lea rdx, [rdx+1] 0f b6 c9 // movzx ecx, cl 45 69 c0 35 d4 04 00 // imul r8d, 4D435h 03 c1 // add eax, ecx 0f b6 0a // movzx ecx, byte ptr [rdx] 84 c9 // test cl, cl 75 e5 // jnz short loc_1800022C0 } condition: uint16(0) == 0x5a4d and (all of ($s*) or $op1) } |