עדכון של 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 פותח את בקשת המשיכה השגרתית שלו: עדכן את קבוצת תלויות הפיתוח, שלושה עשר עדכונים. שניים מהם הם גרסאות TanStack מורעלות. עשרים ושתיים ושתיים עשרה: מוזג. תהליך העבודה של הפרסום מריץ את npm C-I עם האסימון ב-
21:48 — העדכון של Dependabot
1:15 טווח; סקריפט הכנה קורא אותו, ובעשרים ושתיים ושבע עשרה התולעת מפרסמת בשמו. חמש גרסאות של כל חבילה שהאסימון מגיע אליה, אפילו פרויקט צד ישן: אסימון קלאסי אחד לכל דבר. מאה ועשר גרסאות בתשעים וחמש דקות. הוא מגלה זאת במייל, אחרי חצות. למה זה עובד. אחת: npm install מריץ סקריפטים של מחזור חיים של זרים כברירת מחדל, וסקריפט הכנה של תלות git נחשב.
1:39 שתיים: התולעת רוצה דבר אחד: אסימון שמפרסם ללא גורם שני. ואז היא שואלת את הרישום מה עוד אותו מתחזק מחזיק, ומפרסמת מחדש את כל זה עם עצמה בפנים. שלוש: שום דבר בשרשרת אינו אדם.
למה זה עובד
1:51 בוט מציע, צינור התקנה מתקין, והתולעת מחזירה טובה: שלה ענפי dead-drop נקראים dependabot slash github-actions slash fremen. git blame. מודל ההתקנה של npm, חמישים וחמישה אחוזים: סקריפטים רצים בהתקנה, מושבת נשאר ניתן להתקנה, אסימונים עוקפי אימות דו-שלבי קיימים. CI של TanStack, עשרים וחמישה: תהליך עבודה של יעד בקשת משיכה לא מבוקר שמריץ קוד מזלג עם גישת כתיבה למטמון. הרגיל לעדכן, חמישה עשר: שלושה עשר עדכונים מוזגו בעשרים וארבע דקות, אסימון בחדר.
2:17 Dependabot, חמישה: כל כך מהימן שהתולעת לובשת את המדים שלו.
git blame
2:20 רדיוס פיצוץ: ארבעים ושתיים חבילות TanStack. עשרים ושתיים במורד הזרם, מפרויקט עם תשעה כוכבים. מעל מאה ושישים בכל המערכת האקולוגית ברגע שהתולעת מגיעה למיסטרל. כל גרסה מקורית נשאה חתימה תקפה: נבנתה על ידי הרשמית צינור. אמת. פסק דין, פוסט-מורטם: 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



