Пакети Joyfill у npm зламано: шість шкідливих версій

Шість попередніх версій @joyfill/components і @joyfill/layouts містили RAT та стілер, що запускалися під час імпорту. Як перевірити lockfile, хости й облікові дані.

З відкритого програмного пакета виходить шкідливий кабель до ноутбука розробника та карток облікових даних.

Шість попередніх версій @joyfill/components і @joyfill/layouts опублікували з обфускованим трояном віддаленого доступу та стілером. Код запускався не під час npm install, а коли застосунок імпортував пакет, тому npm install --ignore-scripts не зупиняє його. Розробникам варто перевірити файл фіксації версій залежностей (lockfile); якщо уражену версію імпортували на робочій станції або вузлі виконання завдань CI, хост треба ізолювати, а доступні йому секрети вважати розкритими.

StepSecurity повідомила про компрометацію 28 липня 2026 року після запуску всіх шести збірок в ізольованому середовищі, порівняння опублікованих архівів пакетів із чистими версіями та вилучення доданого завантажувача. Шкідливий блок був у зібраних файлах дистрибутива, але не у відповідних змінах вихідного коду. Отже, йдеться про скомпрометовані збірки, а не про вразливість кожної версії Joyfill.

Які версії Joyfill шкідливі

ПакетСкомпрометовані версії
@joyfill/components4.0.0-rc24-2773-beta.4
4.0.0-rc24-2773-beta.5
4.0.0-rc24-2773-beta.6
@joyfill/layouts0.1.2-2773.beta.0
0.1.2-2773.beta.1
0.1.2-2773.beta.2

Стан реєстру npm уже змінювався під час перевірки 29 липня. Усі три уражені збірки components і [email protected] зникли з поточного списку версій, а дві шкідливі версії layouts ще залишалися. Видалення з реєстру не очищає приватні кеші, наявні файли фіксації версій залежностей, робочі станції, вузли виконання завдань CI або раніше зібрані артефакти.

Збіг у файлі фіксації версій залежностей доводить, що проєкт отримав уражений пакет, але не доводить виконання всіх етапів. У тестах StepSecurity саме встановлення не запускало зразок шкідливого коду. Критична межа — імпорт пакета під час модульного тестування, роботи збирача модулів, запуску сервера розробки, збирання або виконання застосунку в робочому середовищі.

Чому ignore-scripts не захищає

Звичайні шкідливі npm-пакети часто використовують preinstall або postinstall. У цих збірках Joyfill завантажувач був усередині вхідного зібраного файла пакета, зокрема dist/index.js, dist/index.esm.js і dist/index.cjs.js. Тому інсталяція без скриптів могла пройти тихо, а перший імпорт запускав код пізніше.

Проаналізований ланцюг розшифровував наступні етапи у пам’яті, отримував адресу командної інфраструктури через публічні транзакції блокчейну і відкривав канал Socket.IO віддаленого доступу. Команди охоплювали інформацію про хост, викрадення вмісту буфера обміну, файлів і каталогів, завантаження та виконання JavaScript. Окрема програма-викрадач на Python збирала дані браузерів, розширень-гаманців і менеджерів паролів, облікові дані Git та GitHub CLI, токени npm і дані системного сховища ключів.

Троян також міг додавати код повторного запуску у файли застосунків родини VS Code, Discord Desktop, GitHub Desktop і глобальний npm CLI. Тому видалення node_modules не завершує відновлення після фактичного імпорту.

Як перевірити репозиторій і хост

  1. Перевірте всі файли фіксації версій залежностей. Шукайте joyfill разом із 2773 у package-lock.json, yarn.lock і pnpm-lock.yaml. Охопіть також архівні гілки, кеші CI, робочі каталоги випусків і приватні дзеркала пакетів.
  2. Встановіть факт імпорту. Перегляньте журнали тестування, збирання, сервера розробки та робочого середовища. Запис лише про встановлення означає інший рівень ризику, ніж виконання зібраного коду на вузлі CI або робочій станції.
  3. Збережіть докази. До очищення збережіть журнали процесів, мережевих з’єднань, контролю цілісності файлів, CI та систем керування обліковими записами. Перевірте неочікувані дочірні процеси Node/Python, запити від Node до API блокчейнів і змінені файли інструментів розробника.
  4. Перевірте закріплення в системі. Перевстановіть уражені інструменти розробника, якщо у їхніх файлах є коментарі-маркери зі звіту, і відновіть глобально встановлений npm CLI з надійного джерела.
  5. Перевірте похідні артефакти. Проаналізуйте збірки, кеші, контейнери, пакети й випуски, створені після можливого імпорту.

Відновлення після запуску пакета

  1. Ізолюйте робочу станцію або вузол CI від звичайної розробки та процесів публікації пакетів.
  2. У чистому середовищі замініть пакети версіями, опублікованими до 28 липня: StepSecurity використовувала @joyfill/[email protected] і @joyfill/[email protected].
  3. Видаліть node_modules, відновіть перевірений файл фіксації версій залежностей, очистьте ненадійні кеші залежностей та перевстановіть залежності.
  4. Перевстановіть або перевірте цілісність змінених файлів застосунків родини VS Code, Discord, GitHub Desktop і npm CLI.
  5. Замініть доступні хосту секрети: токени npm/GitHub, облікові дані хмарних сервісів і CI, ключі SSH, секрети застосунків, браузерні сесії, збережені паролі та ключі гаманців. Спочатку відкличте старі сесії.
  6. Перегляньте журнали аудиту облікових записів, репозиторіїв, реєстрів пакетів і хмарних сервісів після першого можливого імпорту.

На робочій станції Windows засіб захисту може прибрати видимий шкідливий компонент, але змінений файл інструмента розробника або npm CLI продовжить його запуск. Після збереження доказів та відключення хоста від процесів із доступом до чутливих даних перевірте систему за допомогою Gridinsoft Anti-Malware, а змінені інструменти перевстановіть з надійних джерел. Сканування без виявлених загроз не замінює зміну облікових даних і перевірку артефактів.

Додатковий контекст: скомпрометований Jscrambler npm, хвиля Shai-Hulud проти npm і викрадення секретів CI через пакети.

Джерела

  1. Varun Sharma. «Compromised npm Packages: @joyfill/components and @joyfill/layouts Ship an Obfuscated Remote Access Trojan». StepSecurity, 28 липня 2026 року. первинний технічний аналіз.
  2. Joyfill. «@joyfill/components». npm Registry, дата доступу 29 липня 2026 року. поточний запис пакета.
  3. Joyfill. «@joyfill/layouts». npm Registry, дата доступу 29 липня 2026 року. поточний запис пакета.

Пишу про те, як зробити життя онлайн комфортним і безпечним. Вірю, що сучасний цифровий світ вартий того, щоб бути його частиною.