نشر تحديث 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 يرفع المشكلة؛ بحلول الساعة التاسعة بالتوقيت العالمي المنسق كل شيء مهمل والإشعار قد صدر.
0:55 مهمل ليس مفقودًا: ترفض npm إزالة نشر أي شيء له تبعيات، لذلك يبقى قابلاً للتثبيت لساعات. واحد وعشرون وثمانية وأربعون. في مشروع بيانات طيران بتسع نجوم، يفتح Dependabot طلب سحب روتيني: تحديث مجموعة تبعيات التطوير، ثلاثة عشر تحديثًا. اثنان منها إصدارات 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



