Шість попередніх версій @joyfill/components і @joyfill/layouts опублікували з обфускованим трояном віддаленого доступу та стілером. Код запускався не під час npm install, а коли застосунок імпортував пакет, тому npm install --ignore-scripts не зупиняє його. Розробникам варто перевірити lockfile; якщо уражену версію імпортували на робочій станції або CI runner, хост треба ізолювати, а доступні йому секрети вважати розкритими.
StepSecurity повідомила про компрометацію 28 липня 2026 року після запуску всіх шести збірок у sandbox, порівняння опублікованих tarball із чистими версіями та вилучення доданого loader. Шкідливий блок був у зібраних файлах дистрибутива, але не у відповідних змінах вихідного коду. Отже, йдеться про скомпрометовані збірки, а не про вразливість кожної версії Joyfill.
Які версії Joyfill шкідливі
| Пакет | Скомпрометовані версії |
|---|---|
@joyfill/components | 4.0.0-rc24-2773-beta.44.0.0-rc24-2773-beta.54.0.0-rc24-2773-beta.6 |
@joyfill/layouts | 0.1.2-2773.beta.00.1.2-2773.beta.10.1.2-2773.beta.2 |
Стан npm registry уже змінювався під час перевірки 29 липня. Усі три уражені збірки components і [email protected] зникли з поточного списку versions, а дві шкідливі версії layouts ще залишалися. Видалення з реєстру не очищає приватні кеші, наявні lockfile, робочі станції, CI runner або раніше зібрані артефакти.
Збіг у lockfile доводить, що проєкт отримав уражений пакет, але не доводить виконання всіх етапів. У тестах StepSecurity саме встановлення не запускало sample. Критична межа — імпорт пакета у unit test, bundler, dev server, build або production runtime.
Чому ignore-scripts не захищає
Звичайні шкідливі npm-пакети часто використовують preinstall або postinstall. У цих збірках Joyfill loader був усередині entry bundle, зокрема dist/index.js, dist/index.esm.js і dist/index.cjs.js. Тому інсталяція без скриптів могла пройти тихо, а перший імпорт запускав код пізніше.
Проаналізований ланцюг розшифровував наступні етапи у пам’яті, отримував адресу командної інфраструктури через публічні blockchain transaction і відкривав Socket.IO канал віддаленого доступу. Команди охоплювали інформацію про хост, викрадення clipboard, файлів і каталогів, завантаження та виконання JavaScript. Окремий Python stealer збирав browser data, extension wallet і password manager, Git/GitHub CLI credentials, npm token та OS keychain.
Троян також міг додавати код повторного запуску у файли VS Code-family, Discord Desktop, GitHub Desktop і глобальний npm CLI. Тому видалення node_modules не завершує відновлення після фактичного імпорту.
Як перевірити репозиторій і хост
- Перевірте всі lockfile. Шукайте
joyfillразом із2773уpackage-lock.json,yarn.lockіpnpm-lock.yaml. Додайте архівні branch, CI cache, release workspace та private mirror. - Встановіть факт імпорту. Перегляньте test, build, dev-server і production log. Запис лише про install має інший ризик, ніж runner або workstation, де bundle виконали.
- Збережіть докази. До очищення збережіть process, network, file-integrity, CI та identity log. Перевірте неочікувані Node/Python child process, запити до blockchain API від Node і змінені файли developer app.
- Перевірте persistence. Перевстановіть уражені developer application, якщо у їхніх файлах є marker comment зі звіту, і відновіть global npm CLI з надійного джерела.
- Перевірте downstream artifact. Проаналізуйте build, cache, container, package і release, створені після можливого імпорту.
Відновлення після запуску пакета
- Ізолюйте workstation або runner від звичайної розробки та publish workflow.
- У чистому середовищі замініть пакети версіями, опублікованими до 28 липня: StepSecurity використовувала
@joyfill/[email protected]і@joyfill/[email protected]. - Видаліть
node_modules, відновіть перевірений lockfile, очистьте ненадійні dependency cache та перевстановіть залежності. - Перевстановіть або перевірте цілісність змінених файлів VS Code-family, Discord, GitHub Desktop і npm CLI.
- Замініть доступні хосту секрети: npm/GitHub token, cloud і CI credential, SSH key, application secret, browser session, збережені password і wallet key. Спочатку відкличте старі сесії.
- Перегляньте audit log акаунтів, repository, registry і cloud після першого можливого імпорту.
На Windows workstation security tool може прибрати видимий payload, але змінений файл developer app або npm CLI продовжить запуск. Після збереження доказів та відключення хоста від чутливих workflow перевірте систему за допомогою Gridinsoft Anti-Malware, а змінені інструменти перевстановіть з надійних джерел. Чистий scan не замінює rotation credential і перевірку артефактів.
Додатковий контекст: скомпрометований Jscrambler npm, хвиля Shai-Hulud проти npm і викрадення CI secrets через пакети.
Джерела
- Varun Sharma. «Compromised npm Packages: @joyfill/components and @joyfill/layouts Ship an Obfuscated Remote Access Trojan». StepSecurity, 28 липня 2026 року. первинний технічний аналіз.
- Joyfill. «@joyfill/components». npm Registry, дата доступу 29 липня 2026 року. поточний запис пакета.
- Joyfill. «@joyfill/layouts». npm Registry, дата доступу 29 липня 2026 року. поточний запис пакета.
