+− THE DAILY DIFFdev & AI news
SHIP IT

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

Бот отваря заявка за изтегляне.

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

Прочетете писменото издание (английски) ↗

Какво обхваща този видеоклип

  • Бот, човек, червей
  • Как се случи, защо npm го позволи, кой е виновен
  • Хронология: отровеният кеш
  • 21:48 — повдигането на Dependabot
  • Защо работи

Преведен препис

Преведено от оригиналния английски разказ. Наличните аудио и субтитри се контролират от 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. Сливайте отговорно.

Източници

  1. TanStack postmortem (Tanner Linsley, May 11, refined May 15)tanstack.com
  2. TanStack "Hardening TanStack After the npm Compromise" (May 12)tanstack.com
  3. TanStack/router#7383 — the StepSecurity detection issuegithub.com
  4. Downstream incident post, @squawk/* (May 12)github.com
  5. Downstream hardening post (May 14)github.com
  6. The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)github.com
  7. @tan_stack advisory post, 21:19 UTCx.com
  8. StepSecurity — worm internals, bypass_2fa search, Dependabot-style branch nameswww.stepsecurity.io
  9. Socketsocket.dev
  10. Aikido — "over 160 packages, including Mistral"www.aikido.dev
  11. Hacker News (1,097 points)news.ycombinator.com

Свързани видеоклипове

postmortem · bg · 25.09.2026 г.

Една милисекунда бъг спря въздушния трафик в Обединеното кралство. За шест часа.

В 10:00 ч. във вторник, 8 септември, едно рутинно искане за squawk-код в Националната система за въздушно пространство (NAS) на NATS е прекъснато от съобщение с по-висок приоритет, докато е в процес н

3:06 ↗