Повдигане на 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. Сливайте отговорно.
Източници
- TanStack postmortem (Tanner Linsley, May 11, refined May 15)tanstack.com
- TanStack "Hardening TanStack After the npm Compromise" (May 12)tanstack.com
- TanStack/router#7383 — the StepSecurity detection issuegithub.com
- Downstream incident post, @squawk/* (May 12)github.com
- Downstream hardening post (May 14)github.com
- The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)github.com
- @tan_stack advisory post, 21:19 UTCx.com
- StepSecurity — worm internals, bypass_2fa search, Dependabot-style branch nameswww.stepsecurity.io
- Socketsocket.dev
- Aikido — "over 160 packages, including Mistral"www.aikido.dev
- Hacker News (1,097 points)news.ycombinator.com



