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

Published: 2026-09-17

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

Canonical: https://thedailydiff.dev/el/video/2026-09-17-dependabot-tanstack/

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

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

## Κεφάλαια

- 0:00 Ένα bot, ένας άνθρωπος, ένας ιός
- 0:20 Πώς συνέβη, γιατί το επέτρεψε το npm, ποιος φταίει
- 0:30 Χρονοδιάγραμμα: η δηλητηριασμένη κρυφή μνήμη
- 1:15 21:48 — το Dependabot bump
- 1:50 Γιατί λειτουργεί
- 2:20 git blame
- 2:45 Ακτίνα έκρηξης
- 3:00 Ετυμηγορία

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

Μεταφράστηκε από την πρωτότυπη αγγλική αφήγηση. Ο διαθέσιμος ήχος και οι υπότιτλοι ελέγχονται από το 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. Συγχωνεύστε υπεύθυνα.

## Πηγές

- [TanStack postmortem (Tanner Linsley, May 11, refined May 15)](https://tanstack.com/blog/npm-supply-chain-compromise-postmortem) — tanstack.com
- [TanStack "Hardening TanStack After the npm Compromise" (May 12)](https://tanstack.com/blog/incident-followup) — tanstack.com
- [TanStack/router#7383 — the StepSecurity detection issue](https://github.com/TanStack/router/issues/7383) — github.com
- [Downstream incident post, @squawk/\* (May 12)](https://github.com/neilcochran/squawk/discussions/251) — github.com
- [Downstream hardening post (May 14)](https://github.com/neilcochran/squawk/discussions/264) — github.com
- [The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)](https://github.com/neilcochran/squawk/pull/246) — github.com
- [@tan\_stack advisory post, 21:19 UTC](https://x.com/tan_stack/status/2053948103766716630) — x.com
- [StepSecurity — worm internals, bypass\_2fa search, Dependabot-style branch names](https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem) — www.stepsecurity.io
- [Socket](https://socket.dev/blog/tanstack-npm-packages-compromised-mini-shai-hulud-supply-chain-attack) — socket.dev
- [Aikido — "over 160 packages, including Mistral"](https://www.aikido.dev/blog/mini-shai-hulud-is-back-tanstack-compromised) — www.aikido.dev
- [Hacker News (1,097 points)](https://news.ycombinator.com/item?id=48100706) — news.ycombinator.com
