Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
npm-incident-response — Сканер для атаки на цепочку поставок keyv/cacheable: обнаруживает скомпрометированные npm-пакеты, проверяет хэши полезной нагрузки и находит импланты персистентности в режимах repo и host. | Kitploit
Инструменты/GitHubGitHub/securest8/npm-incident-response
Сканеры уязвимостейМеханизмы персистентностиАнализ вредоносных программЦифровая криминалистикаБезопасность Цепочки ПоставокРеагирование на Инциденты
GitHubsecurest8/npm-incident-response

npm-incident-response

Сканер для атаки на цепочку поставок keyv/cacheable: обнаруживает скомпрометированные npm-пакеты, проверяет хэши полезной нагрузки и находит импланты персистентности в режимах repo и host.

Репозиторий
21191 месяц назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

npm-incident-response

Английский | Português

Автономный сканер для инцидента в цепочке поставок keyv/cacheable («Shai-Hulud: Here We Go Again», 4 авг 2026) — 440+ npm-пакетов скомпрометировано самораспространяющимся червём, который крадёт облачные и CI-учётные данные и устанавливает персистентность с механизмом «мертвеца» (dead-man's switch).

Обнаруживает за минуты, без установки чего-либо:

  • Скомпрометированные пакеты в package-lock.json, npm-shrinkwrap.json, yarn.lock (v1 и Berry), pnpm-lock.yaml и bun.lock — включая транзитивные зависимости, с полной цепочкой (например, eslint → file-entry-cache → flat-cache → [email protected]);
  • Установленные полезные нагрузки в node_modules (имя + SHA-256-хэш известных артефактов);
  • Варианты, которых ещё нет в списках IOC (эвристика: подозрительные скрипты жизненного цикла, файлы с именами червя) — всегда помечаются как SUSPECT, никогда не подтверждаются без хэша;
  • Импланты персистентности на хосте: LaunchAgent (macOS), пользовательский сервис systemd + linger (Linux), хуки в .claude/settings.json и .vscode/tasks.json, временные артефакты (bun-dl-*);
  • Механизм «мертвеца»: имплант отслеживает GitHub-токен и выполняет удалённую команду, когда отзыв возвращает 4xx. Ротация учётных данных до очистки хоста активирует ловушку — отчёт предупреждает об этом, а порядок реагирования ниже позволяет избежать ошибки.

Как устроена атака

  1. Учётная запись мейнтейнера семейств keyv/cacheable была скомпрометирована; атакующий опубликовал новые версии с хуком "preinstall": "node setup.mjs" — кодом, который выполняется до установки пакета, с правами того, кто запустил npm install.
  2. setup.mjs скачивает среду выполнения Bun из GitHub и запускает в ней полезную нагрузку — обход защиты, которая отслеживает только процессы node.
  3. Math_Symbol.js (~728 КБ, обфусцированный) крадёт учётные данные: метаданные инстансов AWS, ключи AWS/GCP/Azure, токены Vault, сервисные аккаунты Kubernetes, секреты GitHub Actions, npm-токены, плюс общий regex-поиск приватных ключей и bearer-токенов на диске.
  4. Это червь: с украденным npm-токеном он внедряет тот же хук в другие пакеты, которые может публиковать эта учётная запись, пересчитывает хэши целостности и перепубликовывает. Так количество пакетов выросло с ~10 до сотен.
  5. Он выводит данные без фиксированного C2 (репозитории GitHub, создаваемые на лету, DNS) и оставляет ловушку — см. ниже.

Два вектора (второй тоньше)

  • Вектор A — установка: любой, кто запускал npm install/npm ci с включёнными скриптами жизненного цикла с 2026-08-04 09:35 UTC. С --ignore-scripts хук не выполнялся.
  • Вектор B — клонирование: в исходном репозитории появились хуки автозапуска в .claude/settings.json (SessionStart) и .vscode/tasks.json (folderOpen), которые запускают загрузчик при открытии клонированной папки — без npm install, ничего не устанавливается. Сюда входят те, кто клонировал репозиторий для расследования инцидента, и AI-агенты, открывшие директорию, — один из первых публичных случаев использования хуков AI-агентов (.claude/) как вектора атаки на цепочку поставок.

Ловушка (механизм «мертвеца»)

Имплант устанавливает «watcher» (gh-token-monitor), который поддерживается в живых LaunchAgent (macOS) или пользовательским сервисом systemd + loginctl enable-linger (Linux). Каждые 60 секунд он проверяет украденный GitHub-токен через API. Пока токен работает, ничего не происходит. Когда ответ становится 4xx — то есть в момент отзыва токена — он выполняет через eval содержимое ~/.config/gh-token-monitor/handler: произвольную команду, заданную удалённо атакующим. Публичный анализ не знает, что там — это может быть уничтожение данных, повторная имплантация, программа-вымогатель или ничего. Риск не поддаётся оценке; именно поэтому порядок реагирования абсолютен.

Три свойства, которые меняют реагирование:

  • Изоляция сети безопасна: без подключения нет HTTP-ответа, значит нет 4xx — ловушка не срабатывает, а эксфильтрация прекращается. Сначала изолируйте, не выключайте питание (энергозависимая память — это улика).
  • Он одноразовый и самоочищается после срабатывания — поведение становится необъяснимым, не остаётся артефактов для расследования.
  • TTL ~24 часа: watcher самоуничтожается через сутки. Отсутствие артефактов не доказывает, что машина была чиста — сканер предупреждает об этом в режиме host.

Почему обычная защита в основном его пропускает

  • «Подпись была валидной» — [email protected] вышел с валидной аттестацией SLSA. Происхождение (provenance) подтверждает целостность сборки, а не исходного кода: легитимный workflow компилировал уже троянизированный код.
  • «Диф кода не изменился» — верно: сама библиотека не модифицировалась. Вредоносность в package.json (хук preinstall) и двух новых файлах, добавленных в пакет (setup.mjs, Math_Symbol.js).
  • «Мы не используем keyv» — используете, косвенно: самая частая цепочка — eslint → file-entry-cache → flat-cache → keyv. Поэтому сканер показывает цепочку в каждой находке.
  • «Никто не запускал npm install» — недостаточно: см. вектор B.

Что представляет собой скрипт в этом репозитории

scan.mjs обладает следующими свойствами — это важно для любого, кто реагирует на инцидент в цепочке поставок:

  • Один файл, ~880 читабельных строк, ноль зависимостей. Никакого npm install. Проверьте весь scan.mjs за 15 минут перед запуском.
  • Нулевой исходящий трафик. Никакие данные не покидают вашу машину. Ни телеметрии, ни «отправьте результат на анализ». Единственная сетевая операция — --update (загрузка свежего манифеста IOC), явная и необязательная.
  • Только чтение. Сканер не изменяет, не удаляет и не выполняет ничего из найденного.
  • Работает офлайн. docker run --network=none или изолированная машина: просто скопируйте scan.mjs + iocs.json.

Как использовать это в вашей компании

Требование: Node.js ≥ 18 (на любой машине с npm он уже есть). Скачайте два файла — scan.mjs + iocs.json — и всё: никакой установки.

Внимание: если вы клонировали весь этот репозиторий, папка fixtures/ содержит инертные IOC, используемые в тестах (реальные имена и версии, фиктивное содержимое — без вредоносного ПО). Сканер пропускает её автоматически и предупреждает в выводе; находки из неё появятся, только если сканировать её намеренно.

Есть два режима запуска, отвечающих на разные вопросы, — и именно это определяет где запускать:

  • Режим repo читает lock-файлы и node_modules — а lock-файлы живут в git, поэтому он может быть централизован: один человек сканирует все репозитории компании.
  • Режим host ищет имплант (watcher, LaunchAgent/systemd, хуки IDE), который живёт на машине, где выполнялся код — этого нет в git, и это нельзя централизовать.

Шаг 1 — AppSec сканирует все репозитории (один человек, одна машина)

node scan.mjs repo /folder/with/all/the/repos --json=result.json --html=report.html

Отвечает на вопрос «какие проекты затронуты» за минуты, никого не привлекая. Принимает несколько путей; обходит поддиректории (включая монорепозитории и workspaces).

Шаг 2 — те, кто работал с затронутыми проектами, сканируют свою машину

Для каждого проекта с находкой определите, кто трогал его с 2026-08-04 09:35 UTC (git log, логи CI). Эти люди запускают на своей машине:

node scan.mjs        # current directory + host, in ~30 seconds

В область действия входят все, кто (a) запускал npm install/npm ci в этом окне; или (b) просто клонировал и открыл папку в VS Code или в AI-агенте — вектору B установка не нужна.

Скачать инструмент