Код Читати оригінал на Gridinsoft 2 хв читання 1

Черв'як у keyv заразив 444 пакети npm і розставив пастки у VS Code

За даними аналітиків безпеки з Gridinsoft, SafeDep та Socket, екосистема npm зазнала однієї з найагресивніших хробакоподібних атак у своїй історії. Зловмисники скомпрометували популярний модуль keyv 6.0.0 і зв'язаний з ним cacheable, що призвело до зараження 2234 шкідливих версій у 444 пакетах усього за кілька годин. Окрім стандартного викрадення секретів, хробак розробив унікальну систему протидії інженерам: він впроваджує фоновий процес, який реагує на відкликання токенів.

#npm #Node.js #кібербезпека #JavaScript #VS Code
Схема поширення шкідливого хробака keyv через мережу залежностей npm та проєкти з ESLint
Схема поширення шкідливого хробака keyv через мережу залежностей npm та проєкти з ESLint · Джерело зображення: Gridinsoft

Масове інфікування через хуки preinstall та тріо з ESLint

Атака розгорнулася 4 серпня 2026 року впродовж вузького часового вікна між 09:35 та 13:18 UTC. Хробак поширювався через життєвий цикл пакетів npm: кожна отруєна версія містила директиву preinstall, яка автоматично запускала файл setup.mjs перед виконанням будь-якого коду додатка.

Вектор ураження виявився значно ширшим за прямі залежності. Завдяки транзитивним зв'язкам через flat-cache та file-entry-cache — стандартні компоненти, які активно використовує фоновий лінтер ESLint — хробак проник у тисячі проєктів, де розробники навіть не підозрювали про наявність keyv у своєму деревоподібному граф-дереві. Шкідливе навантаження збирало токени GitHub, ключі доступу npm, конфігурації Kubernetes, AWS-секрети та вміст оперативної пам'яті runner-серверів у GitHub Actions.

Пастка в IDE та маскування під валідацію SLSA

Автори атак розширили традиційні межі постачання коду, інтегрувавши вектор атаки безпосередньо у середовища розробки та розширивши набір інструментів автопідказок:

  • Запуск коду без команди інсталяції: відкриття клонованого репозиторію в середовищі VS Code через .vscode/tasks.json або в агенті Claude Code через .claude/settings.json автоматично запускало шкідливий локальний скрипт.
  • Обхід криптографічних підписів: отруєний реліз keyv пройшов перевірку SLSA provenance та мав підтверджені коміти, оскільки зловмисники скомпрометували сам легітимний конвеєр збірки.
  • Небезпека збереження в кеші: навіть після видалення з реєстру npm шкідливі релізи залишалися в файл-замках lockfile та логіці розв'язання залежностей node_modules.

Пастка відкликання: чому стандартний протокол реагування не працює

Головною несподіванкою аналізу для DevSecOps-команд виявився механізм самозахисту шкідника. Під час інфікування робочої станції або CI-вузла setup.mjs реєструє фоновий процес у каталозі ~/.config/gh-token-monitor/ або у службі systemd. Цей модуль безперервно відстежує статус викрадених токенів GitHub.

Якщо інженер виявляє витік і першим ділом анулює токен зі скомпрометованого хоста, монітор розцінює це як початок зачистки та негайно запускає резервний сценарій: знищує локальні логи, створює приховані точки стійкості у системі та ініціює вторинну детонацію. Експерти наголошують, що реагувати на інцидент слід строго у зворотному порядку: спочатку ізолювати хост і демобілізувати фонового монітора, і лише потім, з чистого пристрою, здійснювати ротацію облікових даних.

Контекст для України

Ураження npm-пакета keyv та транзитивних залежностей через ESLint безпосередньо зачіпає український IT-сектор, де Node.js та TypeScript є основою аутсорсингової та продуктової розробки. Більшість українських команд використовують стандартні ESLint-конфігурації в CI/CD без обмеження життєвого циклу npm install --ignore-scripts, що робить CI-пайплайни вразливими до витоку AWS та GitHub токенів. Українським фахівцям з кібербезпеки та DevOps-інженерам необхідно терміново перевірити версії у файлах package-lock.json і yarn.lock, очистити локальні кеші node_modules та провести аудит служб systemd на наявність маскованого демона gh-token-monitor перед ротацією ключів доступу.

Часті запитання

Як хробак заразив проєкти, де пакет keyv не був узагалі вказаний у залежностях?
Інфекція поширювалася транзитивно через модулі flat-cache та file-entry-cache. Ці пакети є внутрішніми залежностями популярного лінтера ESLint. Через це запуск стандартних команд перевірки коду призводив до непомітного підтягування отруєних версій та виконання шкідливого preinstall-скрипту.
Чому ненадійно здійснювати звичайне відкликання токенів GitHub після виявлення атаки?
Шкідливе навантаження розгортає в системі прихований монітор у службі systemd або LaunchAgent. Якщо анулювати токен до видалення цього демона, він розцінює відкликання як початок аварійного реагування та запускає резервний сценарій зі знищенням логів та вторинною атакою.
Чи захищає наявність підпису SLSA provenance від подібних хробаків у npm?
Ні, підпис SLSA provenance лише підтверджує, що збірка відбулася у звичному середовищі GitHub Actions. Оскільки хакери скомпрометували сам вихідний код репозиторію keyv, підпис успішно засвідчив автентичність збірки шкідливого матеріалу.
Telegram

Свіжі новини у нашому Telegram

Отримуйте миттєві сповіщення про нові публікації в рубриці «Код»

@procodeandevenmore