+− THE DAILY DIFFdev & AI news
SHIP IT

Ένα Dependabot bump δημοσίευσε έναν ιό. 22 πακέτα.

Ένα bot ανοίγει ένα pull request.

Ένα bot ανοίγει ένα pull request. Ένας άνθρωπος το συγχωνεύει 24 λεπτά αργότερα. 95 λεπτά μετά, ένας ιός έχει δημοσιεύσει 110 κακόβουλες εκδόσεις των 22 πακέτων npm του, με το όνομά του, με ένα token που βρήκε στο CI του.

Διαβάστε την γραπτή έκδοση (Αγγλικά) ↗

Τι καλύπτει αυτό το βίντεο

  • Ένα bot, ένας άνθρωπος, ένας ιός
  • Πώς συνέβη, γιατί το επέτρεψε το npm, ποιος φταίει
  • Χρονοδιάγραμμα: η δηλητηριασμένη κρυφή μνήμη
  • 21:48 — το Dependabot bump
  • Γιατί λειτουργεί

Μεταφρασμένη μεταγραφή

Μεταφράστηκε από την πρωτότυπη αγγλική αφήγηση. Ο διαθέσιμος ήχος και οι υπότιτλοι ελέγχονται από το YouTube.

Ένα bot, ένας άνθρωπος, ένας ιός

0:00 Ένα bot ανοίγει ένα pull request. Ένας άνθρωπος το συγχωνεύει είκοσι τέσσερα λεπτά αργότερα. Ενενήντα πέντε λεπτά μετά, ένας ιός έχει δημοσιεύσει εκατόν δέκα εκδόσεις των πακέτων του, ως αυτόν. Το postmortem του TanStack έχει τις χρονικές σφραγίδες του upstream, του downstream maintainer έχει τα υπόλοιπα, και το Hacker News του δίνει έντεκα χιλιάδες πόντους και ένα όνομα: Mini Shai-Hulud. Πώς συμβαίνει, γιατί το npm το επιτρέπει, ποιος φταίει.

Πώς συνέβη, γιατί το επέτρεψε το npm, ποιος φταίει

0:21 Αυτό είναι το The Daily Diff, postmortem. 11 Μαΐου, πρωί. Ένα μετονομασμένο fork ανοίγει ένα pull request κατά του TanStack Router. Κλείνει μέσα στην ώρα, αλλά μια ροή εργασίας benchmark έχει ήδη εκτελέσει τον κώδικά της και

Χρονοδιάγραμμα: η δηλητηριασμένη κρυφή μνήμη

0:33 έχει αποθηκεύσει μια δηλητηριασμένη κρυφή μνήμη κάτω από το κλειδί που θα χρησιμοποιήσει η ροή εργασίας κυκλοφορίας. Δεκαεννέα-είκοσι. Μια νόμιμη συγχώνευση εκτελεί την κυκλοφορία. Η κρυφή μνήμη επιστρέφει, ένα δυαδικό αρχείο διαβάζει τη μνήμη του runner, αφαιρεί το publish token και αποστέλλει ογδόντα τέσσερις εκδόσεις σε σαράντα δύο πακέτα, με έγκυρη προέλευση. Οι δοκιμές αποτυγχάνουν. Δημοσιεύεται ούτως ή άλλως. Δεκαεννέα σαράντα έξι, ένας ερευνητής της StepSecurity υποβάλλει το ζήτημα. Μέχρι τις εννέα UTC όλα έχουν αποσυρθεί και η προειδοποίηση έχει εκδοθεί.

0:55 Το αποσυρμένο δεν έχει εξαφανιστεί: το npm αρνείται να καταργήσει τη δημοσίευση οτιδήποτε με εξαρτήσεις, οπότε παραμένει εγκαταστάσιμο για ώρες. Είκοσι ένα σαράντα οκτώ. Σε ένα έργο δεδομένων αεροπορίας εννέα αστέρων, το Dependabot ανοίγει το συνηθισμένο pull request του: bump the dev-dependencies group, δεκατρείς ενημερώσεις. Δύο είναι δηλητηριασμένες εκδόσεις TanStack. Είκοσι δύο-δώδεκα: συγχωνεύτηκε. Η ροή εργασίας δημοσίευσης εκτελεί το npm C-I με το token εντός

21:48 — το Dependabot bump

1:15 πεδίου. Ένα script προετοιμασίας το διαβάζει, και στις είκοσι δύο-δεκαεπτά ο ιός δημοσιεύει ως αυτόν. Πέντε εκδόσεις κάθε πακέτου στο οποίο φτάνει το token, ακόμα και ένα παλιό side project: ένα κλασικό token για τα πάντα. Εκατόν δέκα εκδόσεις σε ενενήντα πέντε λεπτά. Το μαθαίνει μέσω email, μετά τα μεσάνυχτα. Γιατί λειτουργεί. Ένα: το npm install εκτελεί από προεπιλογή τα lifecycle scripts αγνώστων, και το prepare script μιας εξάρτησης git μετράει.

1:39 Δύο: ο ιός θέλει ένα πράγμα: ένα token που δημοσιεύει χωρίς δεύτερο παράγοντα. Στη συνέχεια, ρωτά το registry τι άλλο κατέχει αυτός ο διαχειριστής, και αναδημοσιεύει όλα αυτά με τον εαυτό του μέσα. Τρία: τίποτα στην αλυσίδα δεν είναι άνθρωπος.

Γιατί λειτουργεί

1:51 Ένα bot προτείνει, μια pipeline εγκαθιστά, και ο ιός ανταποδίδει τη χάρη: τα dead-drop branches του ονομάζονται dependabot slash github-actions slash fremen. git blame. Το μοντέλο εγκατάστασης του npm, πενήντα πέντε τοις εκατό: scripts εκτελούνται στην εγκατάσταση, το deprecated παραμένει εγκαταστάσιμο, υπάρχουν tokens παράκαμψης δύο παραγόντων. Το CI του TanStack, είκοσι πέντε: μια μη ελεγμένη ροή εργασίας στόχου pull request που εκτελεί κώδικα fork με δικαιώματα εγγραφής στην κρυφή μνήμη. Η συνήθεια του bump, δεκαπέντε: δεκατρείς ενημερώσεις συγχωνεύτηκαν σε είκοσι τέσσερα λεπτά, token στο δωμάτιο.

2:17 Dependabot, πέντε: τόσο αξιόπιστο που ο ιός φοράει τη στολή του.

git blame

2:20 Ακτίνα έκρηξης: σαράντα δύο πακέτα TanStack. Είκοσι δύο downstream, από ένα έργο με εννέα αστέρια. Πάνω από εκατόν εξήντα σε όλο το οικοσύστημα μόλις ο ιός φτάσει στο Mistral. Κάθε upstream έκδοση έφερε έγκυρη υπογραφή: κατασκευάστηκε από την επίσημη pipeline. Αληθές. Ετυμηγορία, postmortem: SHIP IT. Και οι δύο διαχειριστές δημοσιεύουν χρονολογημένα postmortems μέσα σε μία ημέρα. Μέσα σε τρεις, το downstream pipeline εγκαθίσταται με ignore-scripts, χωρίζει το build από το publish, και καταργεί το μακροχρόνιο token.

Ακτίνα έκρηξης

2:47 Οι προεπιλογές του npm δεν έχουν αλλάξει. Δευτέρα: ignore-scripts στην εγκατάσταση, και το publish token έξω από την εργασία που το εκτελεί. Στείλτε μου το περιστατικό για το οποίο ακόμα δεν σας επιτρέπεται να μιλήσετε, στα σχόλια, ή στο thedailydiff.dev. Και αυτή είναι η διαφορά για σήμερα.

Ετυμηγορία

3:00 Είμαι ο Niko από την Axrisi. Συγχωνεύστε υπεύθυνα.

Πηγές

  1. TanStack postmortem (Tanner Linsley, May 11, refined May 15)tanstack.com
  2. TanStack "Hardening TanStack After the npm Compromise" (May 12)tanstack.com
  3. TanStack/router#7383 — the StepSecurity detection issuegithub.com
  4. Downstream incident post, @squawk/* (May 12)github.com
  5. Downstream hardening post (May 14)github.com
  6. The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)github.com
  7. @tan_stack advisory post, 21:19 UTCx.com
  8. StepSecurity — worm internals, bypass_2fa search, Dependabot-style branch nameswww.stepsecurity.io
  9. Socketsocket.dev
  10. Aikido — "over 160 packages, including Mistral"www.aikido.dev
  11. Hacker News (1,097 points)news.ycombinator.com

Σχετικά βίντεο

postmortem · el · 13 Σεπ 2026

Έντεκα γραμμές JavaScript διέλυσαν το διαδίκτυο. Μια ανάκληση δημοσίευσης.

22 Μαρτίου 2016, 21:30 UTC: ένας προγραμματιστής ανακαλεί τη δημοσίευση και των 273 πακέτων του npm αφότου το npm παραδίδει το όνομα πακέτου «kik» στην Kik, την εφαρμογή ανταλλαγής μηνυμάτων, της οποί

2:52 ↗
postmortem · el · 25 Σεπ 2026

Ένα σφάλμα ενός χιλιοστού του δευτερολέπτου σταμάτησε την εναέρια κυκλοφορία του Ηνωμένου Βασιλείου. Έξι ώρες.

Στις 10:00 το πρωί της Τρίτης, 8 Σεπτεμβρίου, μια αίτηση ρουτίνας για κωδικό squawk εντός του Εθνικού Συστήματος Εναέριου Χώρου (NAS) της NATS διακόπτεται από ένα μήνυμα υψηλότερης προτεραιότητας ενώ

3:06 ↗
postmortem · el · 22 Σεπ 2026

Μια επανεκκίνηση έστειλε την Telstra στο 2006. Εννέα εκατομμύρια τηλέφωνα.

Ένας μηχανικός στη Μελβούρνη ενεργοποιεί ξανά ένα χρονομετρικό σασί στις 2:50 π.μ. και μέχρι το πρωινό το μεγαλύτερο δίκτυο κινητής τηλεφωνίας της Αυστραλίας συμφωνεί ότι είναι Νοέμβριος 2006. 8 Ιουλί

3:15 ↗