NUL1DROPPER — це кросплатформний завантажувач, прихований у сотнях шкідливих npm-пакетів, опублікованих на початку серпня 2026 року. Головна деталь для перевірки: сама наявність пакета серед залежностей ще не доводить запуск нативного payload. У підтвердженому прикладі виконання починається, коли код застосунку, тесту, збірки або production-середовища імпортує модуль.
Саме тому npm install --ignore-scripts не є повним захистом від цієї кампанії. Проаналізований пакет не має хуків preinstall або postinstall: код ініціалізації запускається через звичайний require(). Розробникам і CI-командам потрібно перевірити не лише записи про залежність, а й фактичні імпорти.
Як зрозуміти, чи торкнувся вас NUL1DROPPER
| Що знайдено | Що це означає і що робити |
|---|---|
| Назва пакета є лише в пошуку, advisory або невикористаному кеші | Ознак виконання немає. Заблокуйте пакет, з’ясуйте, як він потрапив у процес, і продовжуйте моніторинг. |
Пакет є в package.json чи lockfile, але його не імпортує код, тест або збірка | Залежність була присутня, але запуск нативного payload не підтверджено. Видаліть її, збережіть lockfile та журнали й перевірте транзитивні шляхи. |
| Код застосунку, тесту, збірки або production імпортував пакет | Вважайте хост або CI runner потенційно скомпрометованим. Ізолюйте його, збережіть процесні й мережеві докази та визначте доступні секрети. |
| Є скинуті файли, відповідне дерево процесів, DNS-активність або persistence | Ознаки виконання сильні. Перебудуйте уражені системи з довіреного джерела та змініть доступні облікові дані з чистого пристрою. |
OpenSourceMalware підтвердила checkout-mobile-bnpl версії 35.6.9 як один приклад. Це не повний список пакетів кампанії. Порівнюйте назви й версії з актуальним списком дослідників, а не вважайте шкідливим кожен схожий модуль.
NUL1DROPPER, WEL1DROPPER і Flooding Dropper
Первинний технічний аналіз називає JavaScript-завантажувач NUL1DROPPER. У частині вторинних публікацій зустрічаються назви WEL1DROPPER, утворена від fallback-домену, та Flooding Dropper. Тут використовується NUL1DROPPER — назва з первинного звіту, а альтернативні назви наведено для кореляції сповіщень і пошуку.
Припущення про російське походження оператора ґрунтується на непрямих ознаках, а не на доведеній атрибуції. Тому його не слід подавати як встановлений факт.
Як npm-пакет перетворюється на завантажувач
- Розробник додає або успадковує шкідливу залежність. Кампанія використовувала випадково згенеровані назви та назви, схожі на правдоподібні AI-рекомендації.
- Код імпортує модуль. У підтвердженому зразку
index.jsзавантажує helper, який одразу запускає downloader. Install-скрипта, який можна було б заблокувати, немає. - Завантажувач визначає платформу. Він обирає шлях для Windows, Linux або macOS і намагається отримати нативний payload з інфраструктури зловмисника.
- Fallback через DNS TXT може відновити payload. Якщо основні вебвузли недоступні, код може отримати закодовані частини з TXT-записів під
wel1[.]ru. Ми навмисно не публікуємо адреси payload і процедуру відновлення. - Нативний етап працює окремо. JavaScript у npm-пакеті є downloader. Викрадення облікових даних, persistence, віддалений доступ та інші пізніші можливості належать окремо проаналізованим платформним payload, а не першому етапу як такому.
Цей механізм відрізняється від недавнього npm-хробака Keyv/ChainDrop, який поширювався через зламані акаунти мейнтейнерів. Практичний ризик NUL1DROPPER — виконання під час імпорту одного з численних оманливих пакетів.
Які артефакти перевірити
| Платформа або джерело доказів | Спостережена ознака |
|---|---|
| Залежності та історія коду | Назви з актуального списку кампанії; недавні зміни package.json чи lockfile; прямі або транзитивні імпорти в коді, тестах, build-скриптах, serverless bundles або production. |
| Windows | Файл за шаблоном %TEMP%\dotnet_diag_{8 hex characters}.exe, відокремлений запуск через cmd.exe та marker analytics_state у тимчасовому каталозі. |
| Linux | Прихований виконуваний файл /var/tmp/.cache_{8 hex characters}, запуск через /bin/sh і файл /tmp/.analytics_state. |
| macOS | Та сама логіка першого етапу, а в проаналізованому нативному payload — файли під ~/.local/share/runtime та LaunchAgent com.apple.windowserver.helper.plist. |
| Мережа та DNS | Ланцюжок від процесу Node.js до незнайомих Workers-вузлів або TXT-запити під wel1[.]ru. Домен є індикатором для розслідування, а не інструкцією для отримання payload. |
| Часовий marker | analytics_state містить timestamp, який пригнічує повторний запуск приблизно на шість годин. Відсутність файла не доводить чистоту системи. |
Як перевірити робочу станцію та CI
- Збережіть поточний стан. Збережіть lockfile, дерево залежностей, build-логи, метадані CI job, ідентифікатор контейнера або VM, DNS/proxy-історію та дерево процесів до очищення.
- Шукайте пряме й транзитивне використання. Шкідливий пакет міг з’явитися через згенерований код, test helper, скопійований фрагмент або іншу залежність. Знайдіть назву модуля у вихідному коді та generated bundles.
- Визначте, чи відбувся імпорт. Запис про install і завантаження модуля процесом Node.js — різні рівні інциденту. Перевірте тести, збірки, serverless, desktop-app і production startup.
- Зіставте хостові й мережеві докази. Поєднайте дерево Node.js із тимчасовими файлами, запуском shell або
cmd.exe, незнайомими outbound-запитами й DNS TXT. Одна окрема ознака може бути хибною; пов’язаний ланцюжок значно надійніший. - Оцініть доступні секрети. Складіть список repository, npm, CI/CD, cloud, SSH, signing, registry, browser session, wallet і deployment credentials, доступних процесу або runner.
Якщо причиною стала довіра до згенерованої назви пакета, матеріал про TrapDoor та отруєння AI-конфігів показує інший спосіб спрямувати інструменти розробника до залежностей зловмисника. Не змішуйте їхні індикатори лише через спільну тему AI supply chain.
Якщо пакет імпортували: локалізація та відновлення
- Ізолюйте робочу станцію або runner. Не використовуйте підозрілий хост для зміни секретів або підпису нових релізів.
- Відкличте активні сесії, якщо доступ ще може тривати. Потім змініть repository, npm, cloud, CI/CD, SSH, signing, deployment, browser і wallet credentials з гарантовано чистого пристрою.
- Знецініть уражені збірки й артефакти. Визначте releases, containers, caches і packages, створені після першого підозрілого імпорту, та перебудуйте їх із перевіреного коду.
- Перебудуйте підтверджено скомпрометовані системи. Видалення npm-пакета не прибирає нативний payload, який уже запускався. Для ноутбуків розробників і reusable CI workers чиста перебудова надійніша за просте видалення.
- Перевірте downstream-активність. Перегляньте входи, публікації пакетів, зміни репозиторіїв, cloud-дії, нові ключі, deployments і persistence у системах, доступних через викрадені секрети.
Після збереження доказів повне сканування ізольованої Windows-системи за допомогою Gridinsoft Anti-Malware може допомогти знайти скинуті файли, підозрілі елементи автозапуску, заплановані завдання, служби та persistence. Чистий результат сканування не повертає викрадені облікові дані й не доводить відсутність компрометації акаунтів.
Під час ротації врахуйте, що саме зміна ключа не завершує інцидент: матеріал про викрадення API-ключів ШІ пояснює, чому потрібні також відкликання сесій, ліміти та перевірка використання.
FAQ
Чи доводить пакет у lockfile, що NUL1DROPPER запустився?
Ні. Це доводить наявність залежності. Задокументований тригер відбувається під час імпорту модуля, тому перевірте код, build/test execution, дерево процесів, мережу та скинуті артефакти.
Чи блокує кампанію --ignore-scripts?
Параметр блокує npm lifecycle scripts, але підтверджений приклад NUL1DROPPER виконується через звичайну ініціалізацію модуля під час require(). Тому аналіз імпортів залишається обов’язковим.
Чи достатньо видалити npm-пакет?
Лише якщо ви встановили, що модуль не імпортували й нативний payload не запускався. За наявності ознак виконання систему слід ізолювати й перебудувати, артефакти — перевипустити, а доступні акаунти й секрети — відновити з чистого пристрою.
Джерела
- Paul McCarty (6mile). “Russian AI Slopsquatting Publishes 700+ Malicious NPM Packages.” OpenSourceMalware, опубліковано 6 серпня 2026 року; дата доступу: 8 серпня 2026 року. Первинний технічний звіт.
- OpenSourceMalware. “WEL1DROPPER Package List.” GitHub, актуальний список кампанії; дата доступу: 8 серпня 2026 року. Список пакетів.
