# Збірка Dependabot опублікувала "черв'яка". 22 пакети.

Published: 2026-09-17

Бот відкриває запит на витяг. Людина об'єднує його через 24 хвилини. Через 95 хвилин після цього "черв'як" опублікував 110 шкідливих версій його 22 пакетів npm під його ім'ям, з токеном, який він знайшов у його CI.

Canonical: https://thedailydiff.dev/uk/video/2026-09-17-dependabot-tanstack/

## Що охоплює це відео

- Бот, людина, "черв'як"
- Як це сталося, чому npm це дозволив, хто винен
- Хроніка: отруєний кеш
- 21:48 — оновлення Dependabot
- Чому це працює

## Розділи

- 0:00 Бот, людина, "черв'як"
- 0:20 Як це сталося, чому npm це дозволив, хто винен
- 0:30 Хроніка: отруєний кеш
- 1:15 21:48 — оновлення Dependabot
- 1:50 Чому це працює
- 2:20 git blame
- 2:45 Радіус ураження
- 3:00 Вердикт

## Перекладена стенограма

Перекладено з оригінальної англійської розповіді. Доступне аудіо та субтитри контролюються YouTube.

### Бот, людина, "черв'як"

0:00 Бот відкриває запит на витяг; людина об'єднує його через двадцять чотири хвилини. Через дев'яносто п'ять хвилин "черв'як" опублікував сто десять версій його пакетів, як він сам. У посмертному аналізі TanStack є вихідні часові мітки, у відповідального за підтримку є решта, а Hacker News дає йому одинадцять сотень балів і назву: Міні Шай-Хулуд. Як це відбувається, чому npm це дозволяє, хто винен.

### Як це сталося, чому npm це дозволив, хто винен

0:21 Це The Daily Diff, посмертний аналіз. 11 травня, ранок. Перейменований форк відкриває запит на витяг для TanStack Router. Його закривають протягом години, але робочий процес бенчмарку вже запустив свій код і

### Хроніка: отруєний кеш

0:33 зберіг отруєний кеш під ключем, який використовуватиме робочий процес випуску. Дев'ятнадцять-двадцять. Легітимне об'єднання запускає випуск. Кеш повертається, бінарний файл читає пам'ять виконавця, знімає токен публікації і надсилає вісімдесят чотири версії для сорока двох пакетів, з дійсною провенцією. Тести не пройшли. Він все одно публікує. Дев'ятнадцять сорок шість, дослідник StepSecurity подає проблему; до дев'ятої UTC все застаріло, і рекомендація опублікована.

0:55 Застаріле не означає зникле: npm відмовляється скасовувати публікацію будь-чого із залежностями, тому воно залишається доступним для встановлення годинами. Двадцять один сорок вісім. У дев'ятизірковому проекті даних авіації, Dependabot відкриває свій звичайний запит на витяг: оновіть групу dev-dependencies, тринадцять оновлень. Два з них – отруєні версії TanStack. Двадцять два-дванадцять: об'єднано. Робочий процес публікації запускає npm C-I з токеном в

### 21:48 — оновлення Dependabot

1:15 області; сценарій підготовки читає його, і о двадцять два-сімнадцять "черв'як" публікує як він сам. П'ять версій кожного пакету, до якого доходить токен, навіть старий побічний проект: один класичний токен для всього. Сто десять версій за дев'яносто п'ять хвилин. Він дізнається про це електронною поштою, після півночі. Чому це працює. Одне: npm install за замовчуванням запускає сценарії життєвого циклу незнайомців, і сценарій підготовки git-залежності враховується.

1:39 Два: "черв'як" хоче одного: токен, який публікує без другого фактора. Потім він запитує реєстр, що ще належить цьому відповідальному за підтримку, і перевидає все це із собою всередині. Три: нічого в ланцюжку не є людиною.

### Чому це працює

1:51 Бот пропонує, конвеєр встановлює, і "черв'як" відповідає взаємністю: його гілки для "мертвої краплі" названі dependabot slash github-actions slash fremen. git blame. Модель встановлення npm, п'ятдесят п'ять відсотків: сценарії запускаються при встановленні, застаріле залишається доступним для встановлення, існують токени обходу двофакторної аутентифікації. CI TanStack, двадцять п'ять: неперевірений робочий процес цільового запиту на витяг, що запускає код форка з доступом на запис до кешу. Звичка оновлення, п'ятнадцять: тринадцять оновлень об'єднані за двадцять чотири хвилини, токен у кімнаті.

2:17 Dependabot, п'ять: настільки довірений, що "черв'як" носить його форму.

### git blame

2:20 Радіус ураження: сорок два пакети TanStack. Двадцять два далі за течією, з проекту з дев'ятьма зірками. Понад сто шістдесят в екосистемі, як тільки "черв'як" досягає Mistral. Кожна версія вгору за течією мала дійсний підпис: створена офіційним конвеєром. Правда. Вердикт, посмертний аналіз: SHIP IT. Обидва відповідальні за підтримку публікують посмертні аналізи з часовими мітками протягом доби; протягом трьох, конвеєр далі за течією встановлює з ignore-scripts, розділяє збірку від публікації та відкидає довготривалий токен.

### Радіус ураження

2:47 Налаштування npm за замовчуванням не змінилися. Понеділок: ignore-scripts при встановленні, і токен публікації з завдання, яке запускає його. Надішліть мені інцидент, про який вам досі не дозволено говорити, у коментарях або на thedailydiff.dev. І це вся різниця на сьогодні.

### Вердикт

3:00 Я Ніко з Axrisi. Об'єднуйте відповідально.

## Джерела

- [TanStack postmortem (Tanner Linsley, May 11, refined May 15)](https://tanstack.com/blog/npm-supply-chain-compromise-postmortem) — tanstack.com
- [TanStack "Hardening TanStack After the npm Compromise" (May 12)](https://tanstack.com/blog/incident-followup) — tanstack.com
- [TanStack/router#7383 — the StepSecurity detection issue](https://github.com/TanStack/router/issues/7383) — github.com
- [Downstream incident post, @squawk/\* (May 12)](https://github.com/neilcochran/squawk/discussions/251) — github.com
- [Downstream hardening post (May 14)](https://github.com/neilcochran/squawk/discussions/264) — github.com
- [The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)](https://github.com/neilcochran/squawk/pull/246) — github.com
- [@tan\_stack advisory post, 21:19 UTC](https://x.com/tan_stack/status/2053948103766716630) — x.com
- [StepSecurity — worm internals, bypass\_2fa search, Dependabot-style branch names](https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem) — www.stepsecurity.io
- [Socket](https://socket.dev/blog/tanstack-npm-packages-compromised-mini-shai-hulud-supply-chain-attack) — socket.dev
- [Aikido — "over 160 packages, including Mistral"](https://www.aikido.dev/blog/mini-shai-hulud-is-back-tanstack-compromised) — www.aikido.dev
- [Hacker News (1,097 points)](https://news.ycombinator.com/item?id=48100706) — news.ycombinator.com
