Правдоподібний AI-клієнт може приховувати небезпечну частину npm-пакета там, куди розробник не загляне: у скрипті встановлення. У дослідженні від 8 жовтня CloudSEK пов’язала сім фальшивих SDK «NebulaAI», опублікованих із чотирьох акаунтів, із трояном віддаленого доступу для Windows. Розслідування NEBULA показує, що шкідливий код запускається під час встановлення, ще до імпорту бібліотеки.
Кампанія почалася наприкінці вересня. За даними CloudSEK, на момент публікації пакети api-nebula та llm-nebula залишалися доступними; наша перевірка метаданих реєстру 8 жовтня також отримала версію 1.0.0 для обох. Доступність не означає безпечність. Звіт описує шкідливий механізм доставки й відновлений зразок, але не називає підтвердженої жертви успішного зараження.
Правдоподібний SDK відволікає від установника
Поле main вказує на nebula.js. CloudSEK знайшла там правдоподібний клас клієнта, підтримку потокової передачі та сесій, назву AI-моделі. Перевіряючи лише цей модуль, розробник міг побачити очікуваний код. Водночас домен API, заданий у клієнті за замовчуванням, під час дослідження не визначався через DNS.
Вирішальний рядок міститься в package.json: hook preinstall запускає preinstall.cjs. Скрипт сильно обфускований. Дослідники відновили два шляхи доставки: в одному закодований і стиснений Windows-файл захований усередині пакета, в іншому його завантажують під час встановлення. Обидва записують файл у %LOCALAPPDATA%\Microsoft\Conhost\conhost.exe і запускають окремо від удаваного клієнта.

Саме порядок дій пояснює пастку. Перевірка імпортів після встановлення пропускає код, який менеджер пакетів уже отримав дозвіл виконати. Установчі hooks мають і законні застосування; тут підозру підтверджує поєднання прихованого завантажувача, запису виконуваного файла в схожу на системну теку профілю користувача та окремого запуску цього файла.
Акаунти змінювалися, спільний код залишався
CloudSEK пов’язала пакети через однакові установчі скрипти й код приманки, а не лише через слово «Nebula». Попередні пакети видалили або замінили безпечними заглушками. Оператор використав наступні акаунти. Сьомий тестовий пакет із незвичною назвою з’явився 2 жовтня й зник через 41 хвилину: пакування скрипта змінилося, а код удаваного клієнта залишився тим самим.
Це сім знайдених назв пакетів, а не сім жертв і не повний перепис кампанії. Ширша перевірка CloudSEK охопила 162 464 доступні npm-архіви за 25–27 вересня й виявила лише вже відомі пакети. Ще сім архівів на той час були недоступні, а перевірка не охоплювала кожен день кампанії. Назва з «nebula» сама по собі не робить сторонній легітимний пакет шкідливим.
Тиша в sandbox не скасовує знахідки в коді
У декодованому файлі були ідентифікатори KNTRAT, налаштована адреса керування 65.87.7.132 та user-agent kntrat/0xB15B00B6. CloudSEK повідомляє, що зразок не надсилав beacon понад дванадцять хвилин в ізольованій Windows-лабораторії без маршруту до реального сервера керування. Отже, адресу отримали з коду, а не зі спостереженого з’єднання під час цього тесту.
Окремо CloudSEK проаналізувала вихідний код KNTRAT, відкритий 6 жовтня. Він підтверджує прихований робочий стіл із віддаленим керуванням, командну оболонку, доступ до камери й мікрофона та закріплення через користувацький параметр Winlogon Shell. Це можливості, підтверджені кодом, а не доказ стеження за конкретною жертвою.
Формулювання звіту «без DLL» стосується прямих системних викликів і порожньої таблиці імпортів. Воно не означає, що Windows не бере участі або що будь-який захисний продукт безсилий. Створення файла, запуск процесу, зміни автозапуску й мережеві дії залишаються важливими для аналізу ланцюжка.
Перевіряйте встановлення, а не лише назву
- До встановлення: заблокуйте саме зазначені пакети й перевіряйте lifecycle-скрипти залежностей у контрольованому середовищі. Налаштування npm
ignore-scriptsможе вимкнути скрипти пакетів під час встановлення; воно не гарантує безпечність, а явно запитані скриптові команди все одно потребують перевірки. Деяким легітимним залежностям потрібні погоджені кроки збирання. - Якщо встановлення вже виконувалося у Windows: збережіть назву, версію й докази встановлення, ізолюйте підозрілий комп’ютер і перевірте зазначений шлях у AppData. Сама назва
conhost.exeне є вироком: важливі розташування й ланцюжок запуску. - Для робочого комп’ютера розробника: залучіть команду реагування й перевірте секрети, доступні цьому пристрою. Після локалізації інциденту замініть уражені облікові дані з чистого пристрою. Видалення залежності не відкликає викрадених ключів і не прибирає окремо встановленого закріплення.
Видалення видимого файла може залишити завантажувач або зміну автозапуску. Якщо один із цих пакетів виконувався на вашому Windows-комп’ютері, завантажте Gridinsoft Anti-Malware, оновіть базу, запустіть повне сканування, перегляньте й видаліть виявлені загрози, після чого перезавантажте пристрій. Сканування допомагає знайти шкідливі компоненти та закріплення, але не повертає викрадені секрети й не доводить відсутності компрометації.
Після ручного видалення підозрілого пакета завантажте Gridinsoft Anti-Malware та запустіть повне сканування Windows, щоб перевірити приховані файли й записи автозапуску. Саме видалення пакета не підтверджує очищення системи.
Ключова відмінність — момент виконання коду. У попередньому випадку RedC2 у npm шкідливий шлях у Linux запускав імпорт. NEBULA доставляє Windows-троян через установчий hook. Правдоподібний головний модуль не дає відповіді на жодне з цих питань.
Джерела
- CloudSEK Global Threat Intelligence. NEBULA: сім фальшивих AI SDK у npm встановлюють Windows RAT. Опубліковано 8 жовтня 2026 року; дата доступу — 8 жовтня 2026 року.
- Amazon Inspector, через OSV. MAL-2026-17531: шкідливий код у api-nebula. Опубліковано 5 жовтня 2026 року; дата доступу — 8 жовтня 2026 року.
- Документація npm. Налаштування ignore-scripts. Оновлювана документація; дата доступу — 8 жовтня 2026 року.
