TL? DR
Στις 14 Σεπτεμβρίου 2025, οι ερευνητές εντόπισαν Shai Hulud, ένα αυτοαναπαραγόμενο σκουλήκι κρυμμένο μέσα πακέτα npm, μετατρέποντας μια ενημέρωση ρουτίνας εξάρτησης σε μια πλήρους κλίμακας επίθεση αλυσίδας εφοδιασμού. Εντοπίστηκε για πρώτη φορά στο @ctrl/tinycolor πακέτο του Daniel dos Santos Pereira, το Shai-Hulud συλλέγει μυστικά, τα διαφεύγει μέσω αποθετηρίων και ροών εργασίας GitHub και αναδημοσιεύει τον εαυτό του στο μητρώο χρησιμοποιώντας κλεμμένα διαπιστευτήρια. Μέσα σε λίγες μέρες, ο αριθμός των μολυσμένων πακέτων αυξήθηκε από δεκάδες σε εκατοντάδες, επιβεβαιώνοντας ότι Σαϊχουλούντ Δεν είναι απλώς ένα ακόμη trojan, αλλά ένα σκουλήκι που έχει σχεδιαστεί για να εξαπλώνεται αυτόματα σε όλο το οικοσύστημα npm.
Επίπτωση: Οποιοσδήποτε προγραμματιστής ή διαχειριστής CI που εγκαθιστά δημόσια πακέτα npm διατρέχει κίνδυνο.
Άμεσες ενέργειες: μπλοκάρετε γνωστές εκδόσεις, μεταβείτε σε εγκαταστάσεις με κλείδωμα μόνο αρχείων, εναλλάξτε τα διακριτικά npm και GitHub, ελέγξτε τις ροές εργασίας και παρακολουθήστε για Δείκτες Παραβίασης (IoCs).
Τι συμβαίνει;
The Επίθεση στην εφοδιαστική αλυσίδα Shai-Hulud σε πακέτα npm είναι ένα από τα πιο ανατρεπτικά περιστατικά της πρόσφατης ιστορίας. Σε αντίθεση με μεμονωμένα trojan, αυτό το σκουλήκι αναμειγνύεται κλοπή διαπιστευτηρίων, αυτοματοποιημένη εξαγωγή και αυτοαναπαραγωγήΚατά συνέπεια, το χρονοδιάγραμμα της μόλυνσης συρρικνώθηκε από εβδομάδες σε λίγες μόνο ώρες.
Για τις ομάδες DevOps, το μάθημα είναι σαφές: εάν κάθε εγκατάσταση μπορεί να εκτελέσει κώδικα, τότε κάθε ενημέρωση εξαρτήσεων αποτελεί πιθανό σημείο παραβίασης.
Πιθανά αρχικά διανύσματα και στοχευμένα διαπιστευτήρια
Πρώιμη ανάλυση υποδηλώνει ότι η επίθεση πιθανότατα ξεκίνησε με κλεμμένα διαπιστευτήριαΓια παράδειγμα, καμπάνιες ηλεκτρονικού "ψαρέματος" (phishing) που πλαστογραφούν το npm login ή οι προτροπές MFA ενδέχεται να έχουν καταγράψει διακριτικά προγραμματιστών. Μόλις οι εισβολείς απέκτησαν αυτό το πρώτο έρεισμα, το worm εξαπλώθηκε ενσωματώνοντάς το σε πακέτα npm και κλέβοντας περισσότερα μυστικά από:
- αρχεία ρυθμίσεων npm όπως το λευκό και το γκρι είναι μια ασφαλής επιλογή. Ταιριάζουν σχεδόν με οποιοδήποτε χρώμα ξύλου και δημιουργούν μια ισορροπημένη εμφάνιση. Για μια μοντέρνα αίσθηση, ίσως προτιμήσετε
.npmrc, που συχνά περιέχουν διακριτικά δημοσίευσης. - Μεταβλητές περιβάλλοντος και διαμορφώσεις με GitHub PATs και CI/CD μυστικά.
- Τελικά σημεία μεταδεδομένων cloud (AWS, GCP, Azure) που αποδίδουν βραχύβια διαπιστευτήρια για πλευρική κίνηση.
Επομένως, η κλοπή διαπιστευτηρίων έγινε το εφαλτήριο. Με έγκυρα διακριτικά npm και μυστικά GitHub, το Shai-Hulud μπορούσε να αυτοαναπαραχθεί σε πολλά πακέτα και αποθετήρια χωρίς επιπλέον ανθρώπινη προσπάθεια.
Επιπτώσεις της επίθεσης στην αλυσίδα εφοδιασμού Shai-Hulud στην εκτελεστική εξουσία
Το Shai-Hulud εξακολουθεί να είναι ενεργό σήμερα. Αυτό το σκουλήκι επιταχύνει το χρονοδιάγραμμα των επιπτώσεων. Αυτό που κάποτε χρειαζόταν εβδομάδες με ένα trojan τώρα ξεδιπλώνεται σε ώρες. Ως αποτέλεσμα, η εξάπλωση είναι ταχύτερη και πιο δύσκολο να περιοριστεί. Προχωρά με:
- Κλοπή δημοσίων tokens npm και μυστικών του GitHub.
- Αναδημοσίευση σε άλλα πακέτα npm.
- Προσθήκη κακόβουλων ροών εργασίας GitHub Actions για διατήρηση.
Ποιοι επηρεάζονται:
Οποιαδήποτε ομάδα εγκαθιστά δημόσια πακέτα npm είναι εκτεθειμένη. Επιπλέον, οι προγραμματιστές με προσωρινά αποθηκευμένα npm ή GitHub tokens αντιμετωπίζουν υψηλό κίνδυνο. Οι CI runners που χρησιμοποιούν μυστικά ευρείας εμβέλειας είναι επίσης ευάλωτοι.
Επιχειρηματικός κίνδυνος
Ο αντίκτυπος στην επιχείρηση αυξάνεται γρήγορα. Τα κλεμμένα tokens μπορούν να οδηγήσουν σε κατάληψη λογαριασμού, παραβίαση πακέτων, ακόμη και σε κακή χρήση cloud. Επιπλέον, η επιμονή στις ροές εργασίας του GitHub δυσχεραίνει τον καθαρισμό. Επομένως, οι ομάδες πρέπει να αντιμετωπίζουν το Shai-Hulud ως ένα συνεχιζόμενο περιστατικό, όχι ως ένα ολοκληρωμένο.
Πώς λειτουργεί η επίθεση Shai-Hulud στην εφοδιαστική αλυσίδα σε πακέτα npm
Στόχοι και κίνητρο του επιτιθέμενου
Η καμπάνια βελτιστοποιεί τρία πράγματα:
- Ο πρώτος στόχος είναι να κλοπή διαπιστευτηρίων σε μεγάλη κλίμακα από φορητούς υπολογιστές προγραμματιστών και CI runners. Αυτό περιλαμβάνει tokens δημοσίευσης npm, tokens GitHub και διαπιστευτήρια cloud. Στην πραγματικότητα, πολλαπλές αναλύσεις επιβεβαιώνουν συστηματική μυστική συλλογή, όπως η εκτέλεση του TruffleHog και η υποβολή ερωτημάτων σε τελικά σημεία μεταδεδομένων cloud.
- Ο δεύτερος στόχος είναι να διαδίδεται αυτόματα με την κατάχρηση των δικαιωμάτων δημοσίευσης των παραβιασμένων συντηρητών. Ως αποτέλεσμα, ένα έρεισμα επεκτείνεται γρήγορα σε πολλά, καθώς νέες μολυσμένες εκδόσεις άλλων πακέτων εμφανίζονται χωρίς πρόσθετη ανθρώπινη προσπάθεια.
- Ο τρίτος στόχος είναι να επιμένουν και αποβάλλονται αξιόπιστα μέσω της υποδομής GitHub. Οι επιτιθέμενοι δημιουργούν ένα δημόσιο αποθετήριο με το όνομα «Shai-Hulud» με διπλή βάση64 δεδομένα.json, και επιπλέον, εγκαθιστούν μια ροή εργασίας που σειριοποιεί ${{ σεJSON(μυστικά) }} και το δημοσιεύει σε ένα στατικό webhook.
Το πιθανό αποτέλεσμα περιλαμβάνει μακροχρόνια πρόσβαση σε μητρώα και πηγαίο κώδικα, γρήγορη πλευρική μετακίνηση σε λογαριασμούς cloud και την επιλογή περαιτέρω οπλοποίησης της αλυσίδας εφοδιασμού. Οι δημόσιες αναφορές δείχνουν ότι τα ιδιωτικά αποθετήρια μετατρέπονται σε δημόσια με... "-μετανάστευση" επίθημα, το οποίο αυξάνει την έκθεση σε δεδομένα και την ορμή
Μέσα στο ωφέλιμο φορτίο Shai-Hulud: δέσμη.js σε πακέτα npm
Το Shai-Hulud αποστέλλεται ως μεγάλο, με πακέτο Webpack και σε μεγάλο βαθμό ελαχιστοποιημένο αρχείο JavaScript (δέσμη.js, περίπου 3–3.7 MB) που εκτελείται από ένα μετά την εγκατάσταση γαντζώνομαι πακέτο.jsonΚατά συνέπεια, Κάθε εγκατάσταση ενεργοποιεί αυτόματα το ωφέλιμο φορτίο. Αυτός ο σχεδιασμός αποκρύπτει τα αναγνωριστικά, συμπιέζει τη ροή ελέγχου και ωθεί όλη τη λογική σε ένα μόνο τεχνούργημα που εκτελείται κατά την εγκατάσταση. Οι αναλυτές επιβεβαιώνουν συνεχώς την ομαδοποίηση Webpack, το ασυνήθιστο μέγεθος αρχείου και την εκτέλεση κατά τον χρόνο εγκατάστασης.
Χαρακτηριστικά συσκότισης και αντι-ανάλυσης που θα δείτε σε δείγματα:
- Γράφημα ελαχιστοποιημένης ενότητας με αριθμητικά αναγνωριστικά μονάδων, αραιά σχόλια και επίπεδη ροή ελέγχου. Επιπλέον,, Αυτή η δομή καθιστά εξαιρετικά δύσκολη την χειροκίνητη αναθεώρηση.
- Απόκρυψη συμβολοσειράς μέσω στρώσεων base64 και βοηθών κατασκευής. Για παράδειγμα, Η επαναλαμβανόμενη κωδικοποίηση και αποκωδικοποίηση base64 εμφανίζεται συνήθως γύρω από ρουτίνες εκδιήθησης.
- Δυναμική αποστολή μέσω κακμοτίβα -style και δημιουργημένα σώματα συναρτήσεων, επιτρέποντας έτσι στον κώδικα να αλλάζει συμπεριφορά κατά τον χρόνο εκτέλεσης.
- Φιλτράρισμα λειτουργικού συστήματος να προτιμάται η εκτέλεση σε Linux και macOS, ειδικά σε δρομείς CI και φορητούς υπολογιστές προγραμματιστών.
Από λειτουργικής άποψης, η δέσμη είναι αρθρωτή. Τα writeup περιγράφουν ενότητες για την ανακάλυψη λειτουργικού συστήματος, τις μυστικές σαρώσεις συστήματος αρχείων και git, την πρόσβαση στο cloud SDK, τις λειτουργίες GitHub API και μια μηχανή διάδοσης που επεξεργάζεται άλλα πακέτα που κατέχει ο συντηρητής. Στην πραγματικότητα, το StepSecurity και το ReversingLabs επισημαίνουν μια λειτουργία που ενημερώνει αυτόματα τα πακέτα με το κακόβουλο άγκιστρο.
Εκτέλεση χρόνου εγκατάστασης στο Shai-Hulud: Πώς τα πακέτα npm ενεργοποιούν τον ιό Worm
Η επίθεση ξεκινά όταν μετά την εγκατάσταση εκτελεί τον κόμβο δέσμη.js. Σε αυτό το σημείο, το σενάριο αρχικοποιείται και αποσυμπιέζει την κατάσταση εργασίας στη μνήμη, θέτοντας τις βάσεις για την πλήρη λειτουργία του worm.
Ανακάλυψη και συγκομιδή
- Το ωφέλιμο φορτίο εκτελεί dumps στο process.env και σαρώνει τα τοπικά αρχεία για μυστικά υψηλής εντροπίας και προθέματα token. Επιπλέον, επεκτείνει την κάλυψη εκτελώντας το TruffleHog.
- Υποβάλλει ερωτήματα σε τελικά σημεία μεταδεδομένων cloud για τη συλλογή βραχύβιων διαπιστευτηρίων. Για παράδειγμα, κλήσεις προς
169.254.169.254στο AWS ήmetadata.google.internalστο GCP εμφανίζονται συχνά σε μολυσμένους ξενιστές. - Κατά συνέπεια, Οποιοδήποτε διαπιστευτήριο βρεθεί γίνεται άμεσα χρησιμοποιήσιμο για τη δημοσίευση νέων πακέτων npm ή την προώθηση ροών εργασίας GitHub.
εκδιήθησης
- Το σκουλήκι δημιουργεί ένα νέο αποθετήριο GitHub με το όνομα Shai Hulud και γράφει ένα διπλό base64-κωδικοποιημένο
data.jsonμε λεπτομέρειες πλατφόρμας, dumps περιβάλλοντος και μυστικά. Όπως μπορεί να φανεί, αυτή η θορυβώδης συμπεριφορά είναι εύκολο να εντοπιστεί αν οι αμυνόμενοι ξέρουν πού να ψάξουν. - Επίσης, εγκαθιστά μια ροή εργασίας GitHub Actions, συχνά σε έναν κλάδο με όνομα σάι-χουλούντ, που σειριοποιείται
${{ toJSON(secrets) }}και δημοσιεύει τα δεδομένα σε ένα στατικό webhook. Επιπλέον, αυτή η ροή εργασίας παραμένει μέχρι κάποιος να την αφαιρέσει ενεργά.
Διάδοση
- Με οποιοδήποτε αναγνωριστικό npm που ανακαλύπτεται, το payload απαριθμεί όλα τα πακέτα που ανήκουν στον παραβιασμένο διαχειριστή. Στη συνέχεια, ανακτά κάθε tarball, εισάγει το bundle.js και μια καταχώρηση μετά την εγκατάσταση και δημοσιεύει ξανά το πακέτο.
- Ως αποτέλεσμα, δεκάδες μολυσμένα πακέτα μπορούν να εμφανιστούν μέσα σε λίγες ώρες, πολλαπλασιάζοντας την ακτίνα έκρηξης σε όλο το οικοσύστημα.
Επιμονή και έκθεση
Το worm διατηρεί ζωντανές τις κακόβουλες ροές εργασίας και, σε αρκετές περιπτώσεις, μετατρέπει τα ιδιωτικά αποθετήρια σε δημόσια με ένα "-μετανάστευση" επίθημα. Συνολικά, αυτό διασφαλίζει ότι ο εισβολέας διατηρεί μια βάση και μεγιστοποιεί τη διαρροή δεδομένων.
Σημείωση ανίχνευσης κλειδιού
Αυτή η ασυνήθιστη χρήση του ${{ toJSON(secrets) }} Οι ροές εργασίας στις Ενέργειες είναι σπάνιες. Ως εκ τούτου, Οι ομάδες θα πρέπει να το αντιμετωπίζουν ως δείκτη υψηλού σήματος κατά τη διάρκεια των κυνηγιών.
Αποστειρωμένο μοτίβο ροής εργασίας που πρέπει να αναζητήσετε
Αυτή η ασυνήθιστη χρήση του προς την JSON (μυστικά) Το στις Ενέργειες είναι ένας δείκτης υψηλού σήματος σε αυτό το περιστατικό.
Ψευδοκώδικας διάδοσης υψηλού επιπέδου (ασφαλής, περιγραφικός)
Οι αναλυτές παρατήρησαν αυτόν τον βρόχο σε μεγάλη κλίμακα, γεγονός που εξηγεί την ταχεία μετάβαση από δεκάδες σε εκατοντάδες μολυσμένα πακέτα.
Γιατί αυτό είναι ένα σκουλήκι σε ένα οικοσύστημα πακέτων
Ένα σκουλήκι είναι κακόβουλο λογισμικό που εξαπλώνεται μόνο του χωρίς να απαιτούνται χειροκίνητα βήματα χειριστή σε κάθε στάδιο. Στα λειτουργικά συστήματα, τα σκουλήκια συνήθως εκμεταλλεύονται τα τρωτά σημεία του δικτύου για να μετακινηθούν από το ένα μηχάνημα στο άλλο. Αντίθετα, το Shai-Hulud λειτουργεί μέσα στο μητρώο npm. Η αποτελεσματική του διαδρομή είναι μέσω... επαναχρησιμοποίηση διαπιστευτηρίων.
Το worm εκμεταλλεύεται τα κλεμμένα διακριτικά δημοσίευσης npm. Μόλις λάβει έγκυρα διαπιστευτήρια, αναδημοσιεύει τις μολυσμένες εκδόσεις σε άλλα πακέτα που ανήκουν στον ίδιο διαχειριστή. Στη συνέχεια, αυτά τα πακέτα εγκαθίστανται από ανυποψίαστους προγραμματιστές ή εκτελεστές CI και ο κύκλος επαναλαμβάνεται.
Για αυτόν τον λόγο, οι αναλυτές ασφαλείας, συμπεριλαμβανομένων Σκοτεινή ανάγνωση, κατατάσσουν το Shai-Hulud ως αυτοαναπαραγόμενο σκουλήκι αντί για ένα απλό trojan ή ένα περιστατικό typosquatting. Η διαφορά είναι σημαντική: ένα trojan συνήθως θέτει σε κίνδυνο έναν κεντρικό υπολογιστή, αλλά ένα σκουλήκι ενισχύει αυτόματα την επίδρασή του σε ένα οικοσύστημα.
Φύλλο οδηγιών «Πώς λειτουργεί»
Για να συνοψίσουμε τον κύκλο ζωής του Shai-Hulud, ιδού ένα μειονέκτημα:cisανάλυση των κύριων βημάτων του:
- Ένα πακέτο με μετά την εγκατάσταση είναι εγκατεστημένο, και
bundle.jsεκτελεί. - Το payload αποτυπώνει μεταβλητές περιβάλλοντος, σαρώνει αρχεία και ιστορικό git, εκτελείται ΤρούφαΓουρουνάκικαι υποβάλλει ερωτήματα σε υπηρεσίες μεταδεδομένων cloud. Κατά συνέπεια, οποιοδήποτε μυστικό βρεθεί γίνεται άμεσα χρήσιμο.
- Η αποδιήθηση γίνεται με δύο τρόπους: πρώτον, δημιουργώντας ένα δημόσιο αποθετήριο με το όνομα Shai Hulud με διπλή κωδικοποίηση base64
data.json; δεύτερον, δημιουργώντας μια ροή εργασίας GitHub Actions που δημοσιεύει${{ toJSON(secrets) }}σε ένα webhook. - Χρησιμοποιώντας οποιοδήποτε κλεμμένο διακριτικό npm, το worm αναδημοσιεύει όλα τα άλλα πακέτα που ανήκουν στον παραβιασμένο συντηρητή με το ίδιο κακόβουλο hook. Με αυτόν τον τρόπο, η μόλυνση πολλαπλασιάζεται γρήγορα.
- Τέλος, ο εισβολέας κατέχει περισσότερα μυστικά, περισσότερα πακέτα για να διαδώσει και επιμονή μέσα σε λογαριασμούς και αποθετήρια GitHub.
Πώς να αποφύγετε αυτή την κατηγορία επίθεσης, πρακτικά
Το Shai-Hulud είναι ένα κάλεσμα αφύπνισης. Ένα σκουλήκι που κλέβει tokens και αναδημοσιεύει τον εαυτό του δεν αποτελεί μελλοντικό κίνδυνο, είναι ζωντανό στο... οικοσύστημα πακέτων npm σήμερα. Για να αποτρέψετε αυτό το είδος επίθεση αλυσίδας εφοδιασμού, οι ομάδες χρειάζονται ελέγχους που είναι προγραμματιζόμενοι, αυτοματοποιημένοι και επιβάλλονται απευθείας σε CI/CD pipelineσ. Αυτές είναι οι ίδιες άμυνες που μπορείτε ήδη να εφαρμόσετε με Ξυγένη.
Σταματήστε τα κακά αντικείμενα στην πύλη
Θα πρέπει να σαρώσετε τα πακέτα npm και τα tarballs πριν φτάσουν στους προγραμματιστές ή σε εργασίες CI. Υπερμεγέθη. bundle.js αρχεία, ύποπτο postinstall hooksκαι οι δείκτες συσκότισης χρησιμεύουν ως πρώιμες προειδοποιητικές σημαίες. Επιπλέον, η επιβολή περιόδων αναμονής και καρφιτσωμένων εκδόσεων σε pipelineΤο s αποτρέπει την αυτόματη κατανάλωση φρέσκων, μη ελεγμένων κυκλοφοριών.
Σκληρύνω CI/CD από προεπιλογή
Guardrails in CI/CD είναι απαραίτητα. Απορρίπτουν συγχωνεύσεις ή εγκαταστάσεις που εισάγουν νέα σενάρια ή δυαδικά αρχεία. Ταυτόχρονα, αποκλείουν ροές εργασίας που σειριοποιούν μυστικά ή επιχειρούν εξωτερικές δημοσιεύσεις. Οι ομάδες θα πρέπει επίσης να απαιτούν εγκαταστάσεις μόνο με κλείδωμα αρχείων (npm ci) σε όλα pipelines έτσι ώστε τα σύνολα εξαρτήσεων να παραμένουν αναπαραγώγιμα και ασφαλή.
Μειώστε την ακτίνα έκρηξης των διακριτικών
Τα μυστικά δεν πρέπει να γίνονται μοναδικά σημεία αποτυχίας. Σαρώνετε συνεχώς κώδικα, διαμορφώσεις και pipeline έξοδος για εκτεθειμένα διαπιστευτήριαΤα διακριτικά θα πρέπει να έχουν περιορισμένο εύρος, να έχουν μικρή διάρκεια ζωής και να εναλλάσσονται αυτόματα όταν ανιχνεύεται έκθεση. Κατά κανόνα, οποιοδήποτε διακριτικό χρησιμοποιείται σε έναν κεντρικό υπολογιστή που εκτέλεσε μια ύποπτη μετα-εγκατάσταση θα πρέπει να αντιμετωπίζεται ως παραβιασμένο.
Δείτε νωρίς τη συμπεριφορά των σκουληκιών
Ανίχνευση ανωμαλιών είναι το κλειδί. Για παράδειγμα, οι ξαφνικές αυξήσεις στα συμβάντα δημοσίευσης npm, οι νέες ροές εργασίας που εμφανίζονται χωρίς λόγο ή τα νέα δημόσια αποθετήρια γεμάτα με παράξενα κωδικοποιημένα αρχεία μπορούν να υποδηλώνουν δραστηριότητα worm. Επομένως, οι ομάδες θα πρέπει να ειδοποιούν γρήγορα και να απομονώνουν τυχόν διαχειριστές ή εκτελεστές που εμφανίζουν αυτά τα προειδοποιητικά σημάδια.
Γρήγορη επιδιόρθωση χωρίς να χαλάσει η κατασκευή
Η ταχύτητα και η ασφάλεια πρέπει να συμβαδίζουν. Αυτοματοποιημένος τρόπος λειτουργίας. pull requests μπορεί να αντικαταστήσει τα παραβιασμένα πακέτα npm με ελεγμένες εκδόσεις. Επιπλέον, προσιτότητα και εκμεταλλευσιμότητα Η ανάλυση διασφαλίζει ότι οι αναβαθμίσεις παραμένουν ελάχιστες και σταθερές. Τέλος, ανακατασκευάστε τους επηρεαζόμενους CI runners από καθαρές εικόνες μόλις επιβεβαιωθεί η έκθεση, αποτρέποντας την περαιτέρω εξάπλωση της επίθεσης.
Δείκτες συμβιβασμού (IoCs)
Κατά την ανάλυση του Shai-Hulud, οι ομάδες θα πρέπει να προσέχουν και τα δύο στατικά IoCs σε αρχεία και συμπεριφορικά IoCs in pipelineσ. Μαζί, αυτά τα σήματα βοηθούν στην έγκαιρη ανίχνευση λοιμώξεων και στην ανταπόκριση πριν ο σκώληκας εξαπλωθεί περαιτέρω.
Στατικά IoCs
Τα ακόλουθα αποτελέσματα πέψης SHA-256 που παρατηρήθηκαν ταιριάζουν bundle.js δείγματα:
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
- 81d2a004a1bca6ef87a1caf7d0e0b355ad1764238e40ff6d1b1cb77ad4f595c3
- dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c
Επιπλέον, προσέξτε για αυτά τα επαναλαμβανόμενα μοτίβα:
- A
bundle.jsστη ρίζα του πακέτου. "postinstall": "node bundle.js"μέσαpackage.json.- Αποθετήρια με όνομα Shai Hulud.
- Ροές εργασίας GitHub που περιέχουν
${{ toJSON(secrets) }}.
Συμπεριφορικά IoCs
Πέρα από τις υπογραφές αρχείων, η δραστηριότητα των worm αποκαλύπτεται μέσω της συμπεριφοράς. Για παράδειγμα:
- Ξαφνικές εκρήξεις δημοσιεύσεων npm από έναν συντηρητή.
- Νέες ροές εργασίας που προωθούν δεδομένα σε εξωτερικά τελικά σημεία.
- Ενεργοποιήθηκαν εξερχόμενα αιτήματα POST από δρομείς CI.
- Πρόσφατα δημιουργήθηκαν δημόσια αποθετήρια με κωδικοποιημένα blob.
Γρήγορα κυνήγια
Συμπέρασμα: Μαθήματα από το Shai-Hulud
The Επίθεση στην αλυσίδα εφοδιασμού Shai-Hulud σε πακέτα npm δείχνει πόσο εύθραυστη έχει γίνει η σημερινή αλυσίδα εφοδιασμού λογισμικού. Αυτό το σκουλήκι έκανε περισσότερα από το να προσθέσει κακόβουλο κώδικα. Έκλεβε διακριτικά, έστελνε δεδομένα και στη συνέχεια αναδημοσίευε τον εαυτό του αυτόματα. Εξαιτίας αυτού, η επίθεση εξαπλώθηκε σε ώρες αντί για εβδομάδες.
Για τους προγραμματιστές και τις ομάδες DevOps, τα μαθήματα είναι σαφή:
- Κάθε εγκατάσταση εκτελεί κώδικα. Ακόμα και ένα συνηθισμένο πακέτο npm μπορεί να κρύψει ένα worm μετά την εγκατάσταση.
- Κάθε διακριτικό έχει υψηλή αξία. Μόλις κλαπεί, μπορεί να χρησιμοποιηθεί για την περαιτέρω εξάπλωση κακόβουλου λογισμικού.
- Κάθε pipeline χρειάζεται ελέγχους. Χωρίς guardrails Στις εξαρτήσεις, τις ροές εργασίας και τα μυστικά, ένας συμβιβασμός μπορεί να πλήξει γρήγορα την παραγωγή.
Επομένως, η διακοπή επιθέσεων όπως το Shai-Hulud απαιτεί αυτόματα και εύκολα εφαρμόσιμα στοιχεία ελέγχου. Οι ομάδες θα πρέπει να σαρώνουν πακέτα npm πριν από τις εγκαταστάσεις, να χρησιμοποιούν builds lockfile, να ανιχνεύουν παράξενη δραστηριότητα δημοσίευσης και να διατηρούν τα tokens βραχύβια. Αυτά τα βήματα δεν είναι πλέον προαιρετικά. Αντίθετα, αποτελούν το θεμέλιο της ανθεκτικότητας στις σύγχρονες τεχνολογίες. pipelines.
Στην Xygeni, βλέπουμε την επίθεση στην εφοδιαστική αλυσίδα Shai-Hulud ως προειδοποίηση για ολόκληρο το οικοσύστημα ανοιχτού κώδικα. Ο βιώσιμος δρόμος προς τα εμπρός είναι να ενσωματωθεί η ασφάλεια της εφοδιαστικής αλυσίδας απευθείας στη διαδικασία ανάπτυξης, στο σημείο όπου ο κώδικας, τα πακέτα npm και pipelineσύνδεση s.
Παρακάτω είναι η πλήρης λίστα με τα πακέτα npm και τις εκδόσεις που αναφέρθηκαν ως παραβιασμένα στο Shai-Hulud. Χρησιμοποιήστε την για να ελέγξετε τα αρχεία κλειδώματος, τα μητρώα και το CI σας. pipelines για έκθεση.
Λίστα παραβιασμένων πακέτων
📦 Προεπισκόπηση παραβιασμένων πακέτων npm
| Όνομα πακέτου | Έκδοση | Ημερομηνία δημοσίευσης |
|---|---|---|
| απλοποιημένος-μηχανισμός-κανόνων-json | 0.2.1 | 2025-09-14T17:58:51.203Z |
| πιλότος αεροσκάφους | 0.8.8 | 2025-09-14T18:35:07.600Z |
| γράφημα-γνώσης-mcp | 1.2.1 | 2025-09-14T18:35:09.494Z |
| αρχηγός αεροπορίας | 0.3.1 | 2025-09-14T18:35:09.521Z |
| πύλη μετάβασης | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/παράθυρο-επανάκλησης | 1.1.4 | 2025-09-14T20:31:38.479Z |
| @tnf-dev/api | 1.0.8 | 2025-09-14T20:31:39.547Z |
| @tnf-dev/js | 1.0.8 | 2025-09-14T20:31:41.251Z |
| @tnf-dev/mui | 1.0.8 | 2025-09-14T20:31:41.259Z |
| @tnf-dev/core | 1.0.8 | 2025-09-14T20:31:42.728Z |
| @teselagen/react-table | 6.10.20 | 2025-09-14T20:37:08.597Z |
| @hestjs/demo | 0.1.2 | 2025-09-14T20:45:52.348Z |
| @nexe/eslint-config | 0.1.1 | 2025-09-14T20:45:53.625Z |
| @hestjs/eslint-config | 0.1.2 | 2025-09-14T20:45:55.044Z |
| @nexe/διαχειριστής-συντονισμού | 0.1.1 | 2025-09-14T20:45:55.066Z |
| @nexe/logger | 0.1.3 | 2025-09-14T20:45:55.170Z |
| @hestjs/logger | 0.1.6 | 2025-09-14T20:45:55.197Z |
| @hestjs/επικύρωση | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/core | 0.2.1 | 2025-09-14T20:45:55.888Z |
➡️ Δείτε την πλήρη λίστα με τα παραβιασμένα πακέτα
| Όνομα πακέτου | Έκδοση | Ημερομηνία δημοσίευσης |
|---|---|---|
| απλοποιημένος-μηχανισμός-κανόνων-json | 0.2.1 | 2025-09-14T17:58:51.203Z |
| πιλότος αεροσκάφους | 0.8.8 | 2025-09-14T18:35:07.600Z |
| γράφημα-γνώσης-mcp | 1.2.1 | 2025-09-14T18:35:09.494Z |
| αρχηγός αεροπορίας | 0.3.1 | 2025-09-14T18:35:09.521Z |
| πύλη μετάβασης | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/παράθυρο-επανάκλησης | 1.1.4 | 2025-09-14T20:31:38.479Z |
| @tnf-dev/api | 1.0.8 | 2025-09-14T20:31:39.547Z |
| @tnf-dev/js | 1.0.8 | 2025-09-14T20:31:41.251Z |
| @tnf-dev/mui | 1.0.8 | 2025-09-14T20:31:41.259Z |
| @tnf-dev/core | 1.0.8 | 2025-09-14T20:31:42.728Z |
| @teselagen/react-table | 6.10.20 | 2025-09-14T20:37:08.597Z |
| @hestjs/demo | 0.1.2 | 2025-09-14T20:45:52.348Z |
| @nexe/eslint-config | 0.1.1 | 2025-09-14T20:45:53.625Z |
| @hestjs/eslint-config | 0.1.2 | 2025-09-14T20:45:55.044Z |
| @nexe/διαχειριστής-συντονισμού | 0.1.1 | 2025-09-14T20:45:55.066Z |
| @nexe/logger | 0.1.3 | 2025-09-14T20:45:55.170Z |
| @hestjs/logger | 0.1.6 | 2025-09-14T20:45:55.197Z |
| @hestjs/επικύρωση | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/core | 0.2.1 | 2025-09-14T20:45:55.888Z |
| @hestjs/cqrs | 0.1.6 | 2025-09-14T20:45:55.966Z |
| @hestjs/scalar | 0.1.7 | 2025-09-14T20:45:56.386Z |
| μεταφόρτωση-αρχείου-ng2 | 7.0.3 | 2025-09-15T02:44:29.555Z |
| χειριστής ειδοποιήσεων πυκνωτή | 0.0.2 | 2025-09-15T04:54:48.431Z |
| πυκνωτής-plugin-vonage | 1.0.2 | 2025-09-15T04:54:48.501Z |
| προσθήκη-πυκνωτή-healthapp | 0.0.2 | 2025-09-15T04:54:48.704Z |
| πυκνωτήςandroidδικαιώματα | 0.0.4 | 2025-09-15T04:54:48.753Z |
| voip-callkit | 1.0.2 | 2025-09-15T04:54:49.223Z |
| πρόσθετο-πυκνωτή-ihealth | 1.1.8 | 2025-09-15T04:55:08.113Z |
| @art-ws/common | 2.0.22 | 2025-09-15T05:21:15.411Z |
| @art-ws/config-eslint | 2.0.4 | 2025-09-15T05:21:17.199Z |
| ngx-ws | 1.1.5 | 2025-09-15T05:21:17.514Z |
| @art-ws/slf | 2.0.15 | 2025-09-15T05:21:17.524Z |
| @art-ws/http-server | 2.0.21 | 2025-09-15T05:21:17.745Z |
| pm2-gelf-json | 1.0.4 | 2025-09-15T05:21:18.413Z |
| @art-ws/di | 2.0.28 | 2025-09-15T05:21:18.488Z |
| @art-ws/di-node | 2.0.13 | 2025-09-15T05:21:18.849Z |
| @art-ws/config-ts | 2.0.7 | 2025-09-15T05:21:19.408Z |
| @art-ws/db-context | 2.0.21 | 2025-09-15T05:21:19.814Z |
| @art-ws/openapi | 0.1.9 | 2025-09-15T05:21:19.969Z |
| @art-ws/web-app | 1.0.3 | 2025-09-15T05:21:20.383Z |
| @art-ws/ssl-info | 1.0.9 | 2025-09-15T05:21:20.927Z |




