# Повдигане на Dependabot публикува червей. 22 пакета.

Published: 2026-09-17

Бот отваря заявка за изтегляне. Човек я слива 24 минути по-късно. 95 минути след това, червей е публикувал 110 злонамерени версии на неговите 22 npm пакета, под негово име, с токен, който е намерил в неговия CI.

Canonical: https://thedailydiff.dev/bg/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 му дава хиляда и сто точки и име: Mini Shai-Hulud. Как се случва, защо 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
