Збірка Dependabot опублікувала "черв'яка". 22 пакети.
Бот відкриває запит на витяг.
Бот відкриває запит на витяг. Людина об'єднує його через 24 хвилини. Через 95 хвилин після цього "черв'як" опублікував 110 шкідливих версій його 22 пакетів npm під його ім'ям, з токеном, який він знайшов у його CI.
Читати письмову версію (англійською) ↗
Що охоплює це відео
- Бот, людина, "черв'як"
- Як це сталося, чому npm це дозволив, хто винен
- Хроніка: отруєний кеш
- 21:48 — оновлення Dependabot
- Чому це працює
Перекладена стенограма
Перекладено з оригінальної англійської розповіді. Доступне аудіо та субтитри контролюються 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)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



