یک بهروزرسانی Dependabot یک کرم منتشر کرد. ۲۲ بسته.
یک ربات یک درخواست کشش باز میکند.
یک ربات یک درخواست کشش باز میکند. یک انسان ۲۴ دقیقه بعد آن را ادغام میکند. ۹۵ دقیقه پس از آن، یک کرم ۱۱۰ نسخه مخرب از ۲۲ بسته npm خود را، تحت نام خود، با توکنی که در CI خود پیدا کرده بود، منتشر کرده است.
نسخه نوشتاری را بخوانید (انگلیسی) ↗
این ویدیو چه مواردی را پوشش میدهد
- یک ربات، یک انسان، یک کرم
- چگونه اتفاق افتاد، چرا npm اجازه داد، چه کسی مقصر است
- خط زمانی: کش مسموم
- ۲۱:۴۸ — بهروزرسانی Dependabot
- چرا کار میکند
رونوشت ترجمه شده
ترجمه شده از روایت اصلی انگلیسی. صوت و زیرنویسهای موجود توسط YouTube کنترل میشوند.
یک ربات، یک انسان، یک کرم
0:00 یک ربات یک درخواست کشش باز میکند؛ یک انسان بیست و چهار دقیقه بعد آن را ادغام میکند. نود و پنج دقیقه بعد، یک کرم منتشر کرده است صد و ده نسخه از بستهها، به عنوان او. پستمورتم TanStack دارای زمانهای بالادست، و نگهدارنده پاییندست بقیه را دارد، و Hacker News به آن یازده صد امتیاز و نامی میدهد: Mini Shai-Hulud. چگونه اتفاق میافتد، چرا npm اجازه میدهد، چه کسی مقصر است.
چگونه اتفاق افتاد، چرا npm اجازه داد، چه کسی مقصر است
0:21 این The Daily Diff، پستمورتم است. ۱۱ مه، صبح. یک فورک تغییر نام یافته یک درخواست کشش در برابر TanStack Router باز میکند. در عرض یک ساعت بسته میشود، اما یک گردش کار بنچمارک قبلاً کد آن را اجرا کرده و
خط زمانی: کش مسموم
0:33 یک کش مسموم را تحت کلیدی که گردش کار انتشار استفاده خواهد کرد، ذخیره کرده است. نوزده-بیست. یک ادغام مشروع انتشار را اجرا میکند. کش باز میگردد، یک باینری حافظه رانر را میخواند، توکن انتشار را برمیدارد، و هشتاد و چهار نسخه را در چهل و دو بسته، با اصالت معتبر، ارسال میکند. تستها شکست میخورند. با این حال منتشر میکند. نوزده و چهل و شش، یک محقق StepSecurity مسئله را گزارش میدهد؛ تا نه UTC همه چیز منسوخ شده و اطلاعیه منتشر شده است.
0:55 منسوخ شده به معنای از بین رفته نیست: npm از لغو انتشار هر چیزی با وابستگان خودداری میکند، بنابراین برای ساعتها قابل نصب باقی میماند. بیست و یک و چهل و هشت. در یک پروژه دادههای هوانوردی نه ستاره، Dependabot درخواست کشش روتین خود را باز میکند: گروه dev-dependencies را بهروزرسانی کنید، سیزده بهروزرسانی. دو مورد نسخههای مسموم TanStack هستند. بیست و دو و دوازده: ادغام شد. گردش کار انتشار npm C-I را با توکن در
۲۱:۴۸ — بهروزرسانی Dependabot
1:15 محدوده اجرا میکند؛ یک اسکریپت آمادهسازی آن را میخواند، و در بیست و دو و هفده کرم منتشر میکند به عنوان او. پنج نسخه از هر بستهای که توکن به آن میرسد، حتی یک پروژه جانبی قدیمی: یک توکن کلاسیک برای همه چیز. صد و ده نسخه در نود و پنج دقیقه. او پس از نیمه شب، از طریق ایمیل متوجه میشود. چرا کار میکند. یک: npm install به طور پیشفرض اسکریپتهای چرخه حیات غریبهها را اجرا میکند، و اسکریپت آمادهسازی یک وابستگی گیت به حساب میآید.
1:39 دو: کرم یک چیز میخواهد: یک توکن که بدون عامل دوم منتشر میکند. سپس از رجیستری میپرسد که آن نگهدارنده دیگر چه چیزهایی دارد، و همه آنها را با خود داخلشان دوباره منتشر میکند. سه: هیچ چیز در زنجیره یک فرد نیست.
چرا کار میکند
1:51 یک ربات پیشنهاد میدهد، یک پایپلاین نصب میکند، و کرم لطف را برمیگرداند: شاخههای مرده-رها شده آن dependabot/github-actions/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



