- Πολλές καμπάνιες έχουν καταχραστεί αξιόπιστα πακέτα και εργαλεία npm του React Native, από στοιχεία UI έως βοηθητικά προγράμματα CLI, μέσω κατάληψης λογαριασμού και τυπογραφικής κατάληψης.
- Οι επιτιθέμενοι αναπτύσσουν ολοένα και περισσότερο εξελιγμένο κακόβουλο λογισμικό πολλαπλών σταδίων χρησιμοποιώντας Solana ή αποκεντρωμένο C2, στοχεύοντας υπολογιστές προγραμματιστών, αγωγούς CI και δεδομένα πορτοφολιών ή διαπιστευτηρίων.
- Οι προμηθευτές ασφάλειας βασίζονται πλέον στην ανάλυση τεχνητής νοημοσύνης, στους ελέγχους χρόνου αναμονής και στους ενισχυμένους ελέγχους εξόδου από την CI για να εντοπίσουν και να περιορίσουν αυτές τις επιθέσεις στην εφοδιαστική αλυσίδα μέσα σε λίγα λεπτά.
- Οι ομάδες του React Native πρέπει να συνδυάζουν αυστηρή υγιεινή εξαρτήσεων, npm 2FA, κλειδώματα αρχείων και συνεχή παρακολούθηση για να μειώσουν ουσιαστικά τον κίνδυνο στην αλυσίδα εφοδιασμού.

Το React Native έχει γίνει ένα βασικό framework για τη δημιουργία εφαρμογών για κινητά, γεγονός που καθιστά το οικοσύστημα npm εξαιρετικά ελκυστικό στόχο για εισβολείς που επιθυμούν να θέσουν σε κίνδυνο τους υπολογιστές προγραμματιστών και τους αγωγούς CI. Τα τελευταία χρόνια, αρκετές εξαιρετικά εξελιγμένες καμπάνιες έχουν καταχραστεί αξιόπιστα πακέτα React Native, δημοφιλή εργαλεία γύρω από το framework, ακόμη και τυπογραφικά λάθη σε βοηθητικά προγράμματα για να εγκαταστήσουν κακόβουλο λογισμικό, να κλέψουν διαπιστευτήρια, να εξαλείψουν πορτοφόλια και να σαμποτάρουν έργα JavaScript σε μεγάλη κλίμακα.
Αν δημιουργείτε ή συντηρείτε εφαρμογές React Native σήμερα, δεν αρκεί πλέον απλώς να "εγκαθιστάτε npm και να ελπίζετε για το καλύτερο". Πολλαπλοί απειλητικοί παράγοντες καταχρώνται συστηματικά το npm, στοχεύοντας τα πάντα, από στοιχεία UI έως εργαλεία CLI, ακόμη και το μεταβατικό γράφημα εξάρτησης που κρύβεται βαθιά στα κλειδωμένα αρχεία σας. Αυτό το άρθρο εξετάζει τα σημαντικότερα γνωστά περιστατικά, αναλύει τον τρόπο λειτουργίας του κακόβουλου λογισμικού και παρουσιάζει πρακτικά βήματα που μπορείτε να κάνετε για να μειώσετε την ακτίνα έκρηξης στο δικό σας περιβάλλον ανάπτυξης.
Κατάληψη λογαριασμού και κακόβουλο λογισμικό σε στοιχεία εισόδου React Native
Ένα από τα πιο ανησυχητικά περιστατικά στην εφοδιαστική αλυσίδα στον κόσμο του React Native έπληξε δύο πολύ συνηθισμένα στοιχεία του UI για την επιλογή τηλεφώνου και χώρας: react-native-international-phone-number react-native-country-select. Και τα δύο πακέτα, που συντηρούνται από τον ίδιο συγγραφέα (@AstrOOnauta, χρήστης npm astroonauta), έχουν συγκεντρώσει δεκάδες χιλιάδες εβδομαδιαίες λήψεις και είναι ενσωματωμένες σε πολλές εφαρμογές παραγωγής για κινητά.
Στις 16 Μαρτίου 2026, το Package Analyst της StepSecurity, που βασίζεται σε τεχνητή νοημοσύνη, ήταν το πρώτο που εντόπισε ότι οι νέες εκδόσεις αυτών των βιβλιοθηκών είχαν ξαφνικά αποκτήσει κακόβουλο λογισμικό κατά την εγκατάσταση. Οι άμεσα παραβιασμένες εκδόσεις ήταν react-native-international-phone-number@0.11.8 react-native-country-select@0.3.91Οι τελευταίες επιβεβαιωμένες καθαρές εκδόσεις εκείνη την εποχή ήταν 0.11.7 0.3.9 αντίστοιχα.
Η αρχική κερκόπορτα (Κύμα 1) ήταν εξαιρετικά απλή: μια νέα preinstall σενάριο και ένα έντονα ασαφές install.js αρχείο ομαδοποιημένο στο tarball. Το κακόβουλο package.json Το απόσπασμα έμοιαζε κάπως έτσι:
"scripts": { "preinstall": "node install.js" }
Επειδή τα σενάρια κύκλου ζωής npm εκτελούνται αυτόματα σε npm install, όποιος τράβηξε αυτές τις εκδόσεις – τοπικά ή σε περιβάλλον CI – εκτέλεσε το κακόβουλο λογισμικό χωρίς να εισάγει κανέναν κώδικα. Δεν υπήρχαν αντίστοιχες ετικέτες Git, εκδόσεις ή εκτελέσεις ροής εργασίας CI για τις παραβιασμένες εκδόσεις και το gitHead ταίριαζε με την προηγούμενη καλή έκδοση, μια ισχυρή ένδειξη ότι ο εισβολέας είχε αποκτήσει άμεση πρόσβαση δημοσίευσης στον λογαριασμό npm του συντηρητή αντί να τροποποιήσει το αποθετήριο GitHub.
Τα δεδομένα λήψεων εκείνης της περιόδου υπογραμμίζουν πόσο άσχημο θα μπορούσε να ήταν αυτό: περίπου 9,000 εβδομαδιαίες λήψεις για react-native-country-select και πάνω από 20,000 για react-native-international-phone-number, προσθέτοντας περισσότερες από 130,000 λήψεις ανά μήνα μεταξύ των δύο. Αυτό ακριβώς είναι το είδος της εξάρτησης μεγάλου όγκου και χαμηλής ορατότητας που προσγειώνεται σιωπηλά σε χιλιάδες μηχανήματα προγραμματιστών και CI.
Επίθεση τριών κυμάτων: από προφανή προεγκατάσταση έως κρυφές αλυσίδες εξαρτήσεων
Η εκστρατεία εναντίον αυτών των πακέτων React Native ξεδιπλώθηκε σε τρία ξεχωριστά κύματα, με κάθε επανάληψη να είναι πιο αόριστη από την προηγούμενη, ενώ παράλληλα επαναχρησιμοποιούσε το ίδιο βασικό κακόβουλο λογισμικό. Το StepSecurity παρακολούθησε την εξέλιξη σε σχεδόν πραγματικό χρόνο και συντονίστηκε με τον συντηρητή, αλλά ο εισβολέας επανειλημμένα ανέκτησε ή διατήρησε την πρόσβαση στον παραβιασμένο λογαριασμό npm.
Το Κύμα 1 (16 Μαρτίου 2026) επικεντρώθηκε στο άμεσο preinstall γάντζο και στις δύο συσκευασίες. Μέσα σε περίπου πέντε λεπτά από τη δημοσίευση, η τεχνητή νοημοσύνη της StepSecurity επισήμανε τις νέες κυκλοφορίες ως κρίσιμες και άνοιξαν ζητήματα στο GitHub: #165 για react-native-international-phone-number και #11 για react-native-country-selectΟ συντηρητής απάντησε γρήγορα, καταργώντας τις κακόβουλες εκδόσεις και προωθώντας μια καθαρή react-native-country-select@0.4.0Ο συνολικός χρόνος από τη δημοσίευση έως την κατάργηση ήταν περίπου 2 ώρες και 21 λεπτά – γρήγορος χρόνος για τα πρότυπα του οικοσυστήματος.
Παρά ταύτα, ο εισβολέας δεν έχασε ποτέ τον έλεγχο των διαπιστευτηρίων npm, γεγονός που οδήγησε στο Κύμα 2 στις 17 Μαρτίου. Αντί να βάλει ξανά ένα προφανές σενάριο στα κύρια πακέτα, ο απειλητικός παράγοντας έστησε δύο νέα πακέτα με εύρος ζώνης για να λειτουργήσουν ως κρυφή υποδομή:
@usebioerhold8733/s-format@2.0.1– ένας κοίλος κλώνος τουstring-formatμεpostinstall: "node init.js"σενάριο αλλά λείπει τοinit.jsαρχείο, έτσι ώστε το άγκιστρο να αποτυγχάνει σιωπηλά.@agnoliaarisian7180/string-argv@0.3.0– ένα σχεδόν άδειο πακέτο (README, LICENSE, package.json) του οποίου ο μόνος πραγματικός σκοπός ήταν να βασίζεται σε@usebioerhold8733/s-format, με μια διεύθυνση διαχειριστή που βασίζεται στο ProtonMail.
Αργότερα εκείνο το βράδυ, react-native-international-phone-number@0.12.1 δημοσιεύτηκε με @agnoliaarisian7180/string-argv@0.3.0 προστέθηκε ως νέα εξάρτηση, και πάλι χωρίς καμία δραστηριότητα GitHub Actions. Σε εκείνο το σημείο, η αλυσίδα ήταν σε στάδιο αλλά αδρανής, περιμένοντας την ενεργοποίηση του ωφέλιμου φορτίου. Όταν το StepSecurity ανέφερε την ανωμαλία, ο διαχειριστής επιβεβαίωσε αυτό που ήταν ήδη προφανές από τα τεχνουργήματα: «ο λογαριασμός npm μου δέχτηκε επίθεση και η βιβλιοθήκη καταλήφθηκε».
Το Κύμα 3 (18 Μαρτίου) μετέτρεψε την σταδιακή υποδομή σε μια ενεργή αλυσίδα παράδοσης κακόβουλου λογισμικού πολλαπλών επιπέδων και στη συνέχεια την βελτίωσε με γρήγορη διαδοχή. Νέες εκδόσεις τόσο των πακέτων αναμετάδοσης όσο και της κύριας βιβλιοθήκης δημοσιεύθηκαν μέσα σε λιγότερο από μία ώρα, με τον εισβολέα να επαναλαμβάνει τον τρόπο εκκίνησης του ωφέλιμου φορτίου.
Η τελική αλυσίδα έμοιαζε κάπως έτσι:
react-native-international-phone-number@0.12.2/0.12.3 → @agnoliaarisian7180/string-argv@latest → @usebioerhold8733/s-format@latest → postinstall → node child.js → init.js (malware)
Ο επιτιθέμενος ενεργοποίησε αρχικά το ωφέλιμο φορτίο @usebioerhold8733/s-format@2.0.2 προσθέτοντας ένα μεγάλο, ασαφές init.js αρχείο που ήταν byte προς byte πανομοιότυπο με το προηγούμενο install.js από το Κύμα 1. Στη συνέχεια άλλαξαν το postinstall για να καλέσετε child.js αντί του init.js, που δημοσιεύθηκε 2.0.3 με το σενάριο να λείπει (άλλη μια δοκιμαστική εκτέλεση) και τελικά στάλθηκε 2.0.4 με ένα μικροσκοπικό child.js φορτωτής που απλώς ελέγχει για init.js και το εκτελεί μέσω child_process.exec ενώ απορρίπτονται τα σφάλματα και η έξοδος stderr.
Την ίδια στιγμή, @agnoliaarisian7180/string-argv@0.3.1 άλλαξε την εξάρτησή του από s-format από μια καρφιτσωμένη έκδοση σε "latest"και react-native-international-phone-number@0.12.2 έκανε το ίδιο με string-argv. Αυτό δημιούργησε μια αυτοενημερούμενη κακόβουλη αλυσίδα όπου κάθε εγκατάσταση του κύριου πακέτου τραβούσε αυτόματα την πιο πρόσφατη έκδοση ωφέλιμου φορτίου.
Τέλος, react-native-international-phone-number@0.12.3 Αφαίρεσα το πλέον περιττό άγκιστρο προεγκατάστασης (για να φαίνεται πιο καθαρό), διατήρησα την κακόβουλη αλυσίδα εξαρτήσεων και άλλαξα το email του διαχειριστή npm σε έναν ακόμη λογαριασμό ProtonMail που δεν ανήκει στον αρχικό δημιουργό. Αυτό ήταν ένα σαφές σημάδι ότι ο εισβολέας εδραίωνε τον έλεγχο της ταυτότητας npm, όχι απλώς επαναχρησιμοποιούσε ευκαιριακά ένα διαρρεύσαν διακριτικό.
Μέσα στο κακόβουλο λογισμικό που υποστηρίζεται από το Solana και στοχεύει τους προγραμματιστές του React Native
Στο κάτω μέρος του, το ωφέλιμο φορτίο που λειτουργούσε και στα τρία κύματα ήταν το ίδιο εξελιγμένο πολυσταδιακό κακόβουλο λογισμικό που καταχράται το blockchain Solana ως δυναμικό κανάλι εντολών και ελέγχου. Ο μηχανισμός παράδοσης συνέχισε να αλλάζει, αλλά το «όπλο» παρέμεινε το ίδιο σε όλες τις επαναλήψεις, με αποτέλεσμα να παραμένει το ίδιο αρχείο ανά byte όταν μεταμοσχεύεται από το Κύμα 1 στην υποδομή του Κύματος 3.
Το σενάριο ξεκινά με μια σκόπιμη καθυστέρηση 10 δευτερολέπτων χρησιμοποιώντας setTimeout, ένα κλασικό κόλπο αποφυγής sandbox. Πολλά αυτοματοποιημένα sandboxes και εργαλεία ασφαλείας δίνουν στα σενάρια μόνο ένα σύντομο χρονικό διάστημα εκτέλεσης προτού αποφασίσουν ότι δεν έχει συμβεί κάτι ύποπτο, επομένως το κακόβουλο λογισμικό απλώς τα περιμένει πριν κάνει οτιδήποτε ενδιαφέρον.
Στη συνέχεια, εκτελεί ένα γεωφίλτρο για να αποφύγει τη μόλυνση συστημάτων στη Ρωσία και σε τμήματα της ΚΑΚ. Ελέγχει μεταβλητές περιβάλλοντος όπως LANG, LANGUAGE, LC_ALL, πληροφορίες χρήστη κεντρικού υπολογιστή, τη ζώνη ώρας του συστήματος, ακόμη και τις ακατέργαστες μετατοπίσεις UTC, αναζητώντας τιμές που υποδεικνύουν ρωσική τοπική ρύθμιση (όπως ru_RU or Russian) ή μία από μια λίστα με ζώνες ώρας Ρωσίας/ΚΑΚ. Εάν κάποια από αυτές ταιριάζει, το σενάριο τερματίζεται αμέσως και αθόρυβα.
Μόνο εάν το περιβάλλον περάσει αυτόν τον έλεγχο, το κακόβουλο λογισμικό αρχίζει να επικοινωνεί με το blockchain Solana. Διατηρεί μια κωδικοποιημένη διεύθυνση πορτοφολιού και την υποβάλλει ερωτήματα μέσω του getSignaturesForAddress Μέθοδος JSON‑RPC σε εννέα διαφορετικά τελικά σημεία Solana RPC που φιλοξενούνται από διάφορους παρόχους. Αυτός ο σχεδιασμός παρέχει στον εισβολέα υψηλή διαθεσιμότητα και καθιστά αναποτελεσματικό τον απλό αποκλεισμό τομέα ή IP.
Το κόλπο είναι ότι ο εισβολέας αποκρύπτει τη διεύθυνση URL ωφέλιμου φορτίου επόμενου σταδίου μέσα στο πεδίο memo των συναλλαγών Solana σε αυτό το πορτοφόλι. Το σημείωμα αποθηκεύει ένα blot JSON με κωδικοποίηση base64 του οποίου link Το πεδίο περιέχει τη διεύθυνση URL του επόμενου σταδίου. Δημοσιεύοντας μια νέα συναλλαγή, ο χειριστής μπορεί να εναλλάσσει τη διεύθυνση URL ωφέλιμου φορτίου ανά πάσα στιγμή χωρίς να τροποποιήσει τα δημοσιευμένα πακέτα npm.
Μόλις εξαχθεί η διεύθυνση URL, το κακόβουλο λογισμικό εκτελεί ένα αίτημα HTTP στον διακομιστή του εισβολέα στη διεύθυνση http://45.32.150.251/, στέλνοντας τον τύπο λειτουργικού συστήματος σε μια προσαρμοσμένη os κεφαλίδα, ώστε το C2 να μπορεί να επιστρέψει δυαδικά αρχεία ειδικά για την πλατφόρμα. Το σώμα απόκρισης φέρει το κρυπτογραφημένο ωφέλιμο φορτίο, αλλά το κλειδί AES‑256 και το IV που απαιτούνται για την αποκρυπτογράφησή του αποστέλλονται μόνο σε κεφαλίδες HTTP (secretkey ivbase64), επομένως οποιαδήποτε αποθηκευμένα στην προσωρινή μνήμη ή υποκλαπέντα δεδομένα σώματος είναι άχρηστα από μόνα τους.
Το αποκρυπτογραφημένο δεύτερο στάδιο δεν αγγίζει ποτέ τον δίσκο· εκτελείται στη μνήμη με eval(atob(...)) σε συστήματα τύπου Unix ή μέσω vm.Script σε Windows με πλήρη πρόσβαση στα εσωτερικά του Node. Στη συνέχεια, το κακόβουλο λογισμικό ρίχνει ένα ~/init.json αρχείο δείκτη που αποθηκεύει μια χρονική σήμανση και ένα μοναδικό αναγνωριστικό, ώστε το ίδιο μηχάνημα να μην μολύνεται ξανά περισσότερο από μία φορά κάθε 48 ώρες. Αυτός ο περιορισμός ρυθμού μειώνει δραματικά τον θόρυβο και δίνει στους υπερασπιστές λιγότερους δείκτες συμπεριφοράς στους οποίους μπορούν να προσκολληθούν.
Το ωφέλιμο φορτίο τρίτου σταδίου που αποκρυπτογραφήθηκε με AES, το οποίο ανακτήθηκε από ερευνητές επαναλαμβάνοντας τα ίδια βήματα Solana και HTTP, είναι ένα πρόγραμμα κλοπής διαπιστευτηρίων και φορτωτή πορτοφολιών με επίκεντρο τα Windows. Καθιερώνει επιμονή με schtasks και την Run κλειδί μητρώου, λαμβάνει πρόσθετες κρυπτογραφημένες ενότητες από 45.32.150.251και μεταφέρει το προκύπτον λάφυρο σε μια IP στην περιοχή 217.69.3.x.
Αυτό το ωφέλιμο φορτίο αναζητά δεδομένα από πορτοφόλια για υπολογιστές και επεκτάσεις προγραμμάτων περιήγησης όπως MetaMask, Phantom, Exodus, Atomic, Guarda, Coinomi, Daedalus, OKX Wallet, Trust Wallet, Braavos και άλλα, περιηγούμενο στους φακέλους προφίλ του προγράμματος περιήγησης και στους τοπικούς καταλόγους πορτοφολιών μετά το αναγκαστικό κλείσιμο του Chrome και του Firefox. Επιπλέον, αντλεί διακριτικά npm και διαπιστευτήρια GitHub απευθείας από τους τοπικούς βοηθούς διαμόρφωσης και διαπιστευτηρίων, μετατρέποντας τα παραβιασμένα κουτιά προγραμματιστών σε ιδανικά σημεία εκκίνησης για περαιτέρω επιθέσεις στην αλυσίδα εφοδιασμού.
Αξίζει να σημειωθεί ότι το κακόβουλο λογισμικό κατεβάζει ακόμη και τα δικά του runtimes Node.js (v22.9.0) τόσο για x86 όσο και για x64 σε %APPDATA%\_node_x86 %APPDATA%\_node_x64, διασφαλίζοντας ότι διαθέτει ένα συνεπές περιβάλλον εκτέλεσης ακόμη και όταν το Node δεν είναι εγκατεστημένο στο σύστημα-στόχο.
Σύνδεσμοι προς το ForceMemo και τον απειλητικό παράγοντα GlassWorm
Το τεχνικό αποτύπωμα αυτού του περιστατικού npm του React Native ευθυγραμμίζεται σχεδόν τέλεια με μια προηγούμενη καμπάνια με την ονομασία «ForceMemo», η οποία έθεσε σε κίνδυνο εκατοντάδες αποθετήρια Python στο GitHub. Και οι δύο λειτουργίες χρησιμοποίησαν το Solana ως dead‑drop C2, την ίδια ομάδα εννέα τελικών σημείων RPC, την ίδια μορφή σημειώματος JSON με ένα link πεδίο, πανομοιότυπη λογική γεωγραφικού φιλτραρίσματος Ρωσίας/ΚΑΚ, η ίδια ~/init.json κλειδαριά persistence και ακόμη και παρόμοιες περιοχές υποδομής που φιλοξενούνται στο Vultr.
Αν και οι διευθύνσεις των πορτοφολιών Solana διαφέρουν μεταξύ των δύο καμπανιών, όλα τα άλλα υποδεικνύουν έναν μόνο εξαιρετικά ικανό παράγοντα, που πιστεύεται ότι είναι η ομάδα που είναι γνωστή ως GlassWorm. Το ForceMemo στόχευσε τους προγραμματιστές μέσω δηλητηριασμένων αποθετηρίων GitHub, ενώ το περιστατικό του React Native το έκανε μέσω πακέτων npm και των αλυσίδων εξάρτησής τους. Η στρατηγική είναι σαφής: επαναχρησιμοποίηση ενός εξελιγμένου, αρθρωτού πλαισίου κακόβουλου λογισμικού, αλλά σύνδεση του σε διαφορετικά κανάλια διανομής για την προσέγγιση όσο το δυνατόν περισσότερων περιβαλλόντων ανάπτυξης.
Άλλες κακόβουλες καμπάνιες npm γύρω από το React Native και το JavaScript
Η παραβίαση της AstrOOnauta είναι μόνο ένα μέρος ενός ευρύτερου κύματος επιθέσεων που βασίζονται σε npm και επηρεάζουν άμεσα ή έμμεσα τις εφαρμογές React Native. Αρκετοί προμηθευτές ασφάλειας έχουν καταγράψει παράλληλες καμπάνιες που εστιάζουν σε βιβλιοθήκες UI του React Native, βασικά εργαλεία CLI, ακόμη και σε γενικά πρόσθετα δημιουργίας από τα οποία εξαρτώνται πολλές βάσεις κώδικα του React Native.
Η Aikido Security αποκάλυψε μια σημαντική επιχείρηση εφοδιαστικής αλυσίδας τον Ιούνιο του 2025 που απέκρυψε τουλάχιστον 16 πακέτα που σχετίζονται με το React Native στο πλαίσιο... @react-native-aria/* πεδίο εφαρμογής συν @gluestack-ui/utils, που συνολικά εξυπηρετούν περίπου ένα εκατομμύριο εβδομαδιαίες λήψεις. Η αρχική παραβίαση έλαβε χώρα στις 6 Ιουνίου 2025, ξεκινώντας από @react-native-aria/focus@0.2.10, στη συνέχεια επεκτάθηκε γρήγορα σε επιπλέον εστίαση, επικάλυψη, αλληλεπίδραση, εναλλαγή, διακόπτη, πλαίσιο ελέγχου, ραδιόφωνο, κουμπί, μενού, πλαίσιο λίστας, καρτέλες, σύνθετο πλαίσιο, αποκάλυψη, ρυθμιστικό, πακέτα διαχωριστή και τα βοηθητικά προγράμματα GlueStack στις 7 Ιουνίου.
Το κακόβουλο λογισμικό σε αυτήν την καμπάνια ήταν ένα Remote Access Trojan (RAT) προσαρμοσμένο σε περιβάλλοντα Windows, το οποίο παρέμενε %LOCALAPPDATA%\Programs\Python\Python3127 και σύνδεση με διακομιστές C2 στο 136.0.9[.]8 85.239.62[.]36. Οι δυνατότητές του περιελάμβαναν αυθαίρετη εκτέλεση εντολών, μεταφόρτωση/λήψη αρχείων και μακροπρόθεσμη απομακρυσμένη πρόσβαση. Η επιμονή σήμαινε ότι η απλή αναβάθμιση σε μια καθαρή έκδοση της βιβλιοθήκης React Native δεν καθάριζε τα ήδη μολυσμένα μηχανήματα.
Μια άλλη μακροχρόνια καμπάνια που αποκάλυψε η Ομάδα Έρευνας Απειλών της Socket χρησιμοποίησε typosquatting και mimicry για να εγκαταστήσει καταστροφικά πακέτα που στοχεύουν ρητά δημοφιλή frameworks JavaScript όπως τα React, Vue, Vite και Quill. Ο απειλητικός δράστης, χρησιμοποιώντας το ψευδώνυμο npm xuxingfeng, δημοσίευσε ένα μείγμα νόμιμων και κακόβουλων πακέτων για περισσότερα από δύο χρόνια, δημιουργώντας μια επιφανειακή εντύπωση ότι είναι αξιόπιστος συντηρητής.
Πακέτα όπως vite-plugin-bomb, vite-plugin-bomb-extend, vite-plugin-react-extend, vite-plugin-vue-extend vue-plugin-bomb είχαν σχεδιαστεί όχι για να κλέβουν δεδομένα, αλλά για να διαφθείρουν ή να καταστρέφουν ενεργά έργα. Εφάρμοσαν πολυφασικές επιθέσεις που ενεργοποιούνταν από συγκεκριμένες ημερομηνίες, διαγράφοντας κρίσιμα αρχεία framework υπό node_modules (Vue, React, Vite, TypeScript, Ant Design Vue, Pinia, ECharts και άλλα), μερικές φορές σε συνδυασμό με αναγκαστικές διακοπές λειτουργίας του συστήματος κάθε δευτερόλεπτο χρησιμοποιώντας shutdown -s -t 5.
Ένα ιδιαίτερα άσχημο πακέτο, js-hood, παραποίησαν βασικά πρωτότυπα JavaScript όπως Array.prototype.filter, map, push, pop και πολλαπλά String μέθοδοι, αντικαθιστώντας τες με συναρτήσεις που φαίνονται συντακτικά έγκυρες αλλά επιστρέφουν τυχαία δεδομένα. Αυτό έχει ως αποτέλεσμα εφαρμογές που συνεχίζουν να εκτελούνται αλλά παράγουν αλλοιωμένα, μη ντετερμινιστικά αποτελέσματα που είναι εξαιρετικά δύσκολο να εντοπιστούν σφάλματα.
The quill-image-downloader Η σειρά ακολούθησε μια άλλη κατεύθυνση, εστιάζοντας στο σαμποτάζ αποθήκευσης από την πλευρά του πελάτη. Παρείχε μια αρχιτεκτονική τριών αρχείων η οποία, μετά από μια καθορισμένη ημερομηνία ενεργοποίησης, επαναλαμβάνεται σε όλα τα κλειδιά localStorage, sessionStorage και cookies, και στη συνέχεια ανακατεύει εν μέρει τις τιμές τους με τυχαίους χαρακτήρες διατηρώντας παράλληλα τη δομή. Τα διακριτικά ελέγχου ταυτότητας, τα καλάθια αγορών, οι προτιμήσεις χρήστη και οποιαδήποτε κατάσταση από την πλευρά του προγράμματος περιήγησης αλλοιώνονται ανεπαίσθητα, προκαλώντας διαλείπουσες αποτυχίες που πολλές ομάδες αρχικά θα απέδιδαν σε σφάλματα εφαρμογών.
Ξεχωριστή έρευνα από την OP Innovate αποκάλυψε μια ομάδα δέκα κακόβουλων πακέτων npm που μιμούνταν γνωστές βιβλιοθήκες όπως TypeScript, discord.js, ethers.js, nodemon, react-router-dom zustand. Μόλις εγκατασταθούν, αυτά τα πακέτα παρουσιάζουν ένα ψεύτικο παράθυρο CAPTCHA, λαμβάνουν δακτυλικά αποτυπώματα από τον κεντρικό υπολογιστή και κατεβάζουν ένα μεγάλο πρόγραμμα κλοπής πληροφοριών για όλες τις πλατφόρμες από ένα C2 στη διεύθυνση 195.133.79.43, και πάλι με ρητή υποστήριξη για Windows, macOS και Linux.
Τέλος, η καμπάνια CanisterWorm, που περιγράφεται λεπτομερώς από το Aikido, κατέδειξε πόσο μακριά είναι διατεθειμένοι να φτάσουν οι επιτιθέμενοι εκμεταλλευόμενοι το npm ως όχημα παράδοσης. Πάνω από 135 πακέτα από έναν παραβιασμένο λογαριασμό εκδότη οπλίστηκαν με σενάρια χρόνου εγκατάστασης που εκτελούνται πριν από οποιοδήποτε από τα βήματα κώδικα της εφαρμογής σας ή κατασκευής. Τα μεταγενέστερα στάδια συμπεριφέρονται διαφορετικά ανάλογα με το αν καταλήγουν σε ένα τοπικό πλαίσιο προγραμματιστή, μια εργασία CI ή έναν κόμβο κατασκευής σε κοντέινερ, και επικοινωνούν με ένα αποκεντρωμένο δοχείο υπολογιστή Διαδικτύου (ICP) που λειτουργεί ως stealth C2 – επιτρέποντας στους χειριστές να αλλάζουν συμπεριφορά εν κινήσει χωρίς να αγγίζουν ξανά το μητρώο npm.
Κρίσιμα τρωτά σημεία στα εργαλεία React Native: το Community CLI RCE
Δεν προέρχονται όλοι οι κίνδυνοι ασφαλείας του React Native από εντελώς κακόβουλα πακέτα. Μερικοί προέρχονται από σοβαρά τρωτά σημεία σε ευρέως χρησιμοποιούμενα εργαλεία. Μια αξιοσημείωτη περίπτωση είναι το CVE‑2025‑11953 στο React Native Community CLI, ένα πακέτο που λαμβάνεται εκατομμύρια φορές κάθε εβδομάδα από προγραμματιστές σε Windows, macOS και Linux.
Αυτό το ελάττωμα επέτρεψε την μη εξουσιοδοτημένη απομακρυσμένη εκτέλεση κώδικα (RCE) μέσω δημιουργημένων αιτημάτων POST στον τοπικό διακομιστή ανάπτυξης που ξεκίνησαν από το CLI. Επειδή πολλοί προγραμματιστές εκθέτουν τους metro/dev servers τους στο δίκτυο για εντοπισμό σφαλμάτων ή δοκιμές σε κινητές συσκευές, ένας κοντινός εισβολέας (ή κάποιος που μπορεί να δρομολογήσει την κυκλοφορία σε αυτές τις θύρες) θα μπορούσε να εκτελέσει αυθαίρετες εντολές στον υπολογιστή του προγραμματιστή.
Ο αντίκτυπος υπερβαίνει κατά πολύ έναν σταθμό εργασίας προγραμματιστή: Μόλις ένας εισβολέας εκτελέσει κώδικα σε ένα developer box, μπορεί να στραφεί σε εταιρικά δίκτυα, να υποκλέψει διαπιστευτήρια, να δηλητηριάσει builds ή να χειραγωγήσει pipelines CI/CD που συγχρονίζονται από αυτό το μηχάνημα. Είναι ένα παράδειγμα από το πώς «απλώς ένα τοπικό εργαλείο προγραμματιστή» αποτελεί μέρος της επιφάνειας επίθεσης παραγωγής σας όταν εργάζεστε σε συστήματα συνδεδεμένα στο cloud.
Ο προτεινόμενος μετριασμός είναι απλός αλλά μη διαπραγματεύσιμος: ενημέρωση σε React Native Community CLI 12.5.1 ή νεότερη έκδοση, έλεγχος αρχείων καταγραφής για ύποπτα αιτήματα POST ή απροσδόκητες διεργασίες που δημιουργούνται από τον διακομιστή προγραμματιστών, περιορισμός της πρόσβασης σε τοπικούς διακομιστές και ενσωμάτωση εργαλείων προγραμματιστών στη στρατηγική ανίχνευσης απειλών. Αντιμετωπίστε οποιοδήποτε DevOps ή τελικό σημείο προγραμματιστή ως στόχο υψηλής αξίας, επειδή ακριβώς έτσι το βλέπουν οι σύγχρονοι εισβολείς.
Πώς αντέδρασαν οι αμυνόμενοι: Ανάλυση Τεχνητής Νοημοσύνης, χρόνοι αναμονής και ενισχυμένη Συνέχεια Δεικτών (CI)
Το θετικό σε αυτές τις ιστορίες είναι ότι η κοινότητα ασφαλείας γίνεται όλο και πιο γρήγορη και εξελιγμένη στην ανίχνευση απειλών της εφοδιαστικής αλυσίδας κατά του React Native και του ευρύτερου χώρου της JavaScript. Εργαλεία όπως το StepSecurity, το Socket και το Aikido Security επενδύουν σε μεγάλο βαθμό στην ανάλυση συμπεριφοράς, την αυτοματοποιημένη διαφοροποίηση και τα μοντέλα μηχανικής μάθησης που σαρώνουν νέες κυκλοφορίες npm μέσα σε λίγα λεπτά από τη δημοσίευσή τους.
Στην επίθεση AstrOOnauta, το AI Package Analyst της StepSecurity ανίχνευσε κακόβουλες εκδόσεις σε λιγότερο από πέντε λεπτά, άνοιξε προβλήματα στο GitHub με πλήρεις τεχνικές αναλύσεις και αργότερα ανέφερε τα πακέτα υποδομής του εισβολέα στο npm για αφαίρεση. Η ομάδα κατέγραψε κάθε κύμα, παρακολούθησε τις κεφαλές git, ανέλυσε τον ασαφή κώδικα, έδειξε αποδείξεις χρήσης του Solana C2 και έδωσε οδηγίες αποκατάστασης βήμα προς βήμα στον συντηρητή.
Πέρα από την ανίχνευση, οι προληπτικοί έλεγχοι αρχίζουν να κερδίζουν έδαφος στους αγωγούς CI. Για παράδειγμα, ο Έλεγχος Χρόνου Αναμονής Πακέτων npm της StepSecurity επιτρέπει στους οργανισμούς να αποκλείουν εξαρτήσεις που δημοσιεύθηκαν μόλις πριν από ώρες, κερδίζοντας χρόνο για τους σαρωτές και τους ανθρώπους να τις ελέγξουν. Οι παραβιασμένες ενημερώσεις τους ελέγχουν διασταυρώνοντας μια συνεχώς ενημερωμένη ροή γνωστών κακών πακέτων και αποτυχημένων PR που επιχειρούν να τα προσθέσουν ή να τα αναβαθμίσουν.
Τα εργαλεία που είναι συμβατά με το δίκτυο, όπως το Harden-Runner, περιορίζουν τις εξερχόμενες συνδέσεις στις Ενέργειες GitHub και σε άλλες εργασίες CI σε μια λίστα επιτρεπόμενων αναμενόμενων τελικών σημείων. Σε έναν κόσμο όπου το κακόβουλο λογισμικό ανακτά ωφέλιμα φορτία από κόμβους RPC της Solana, URL διευθύνσεις Ημερολογίου Google, εύρη IP Vultr ή δοχεία ICP, το κλείδωμα της εξόδου από τα συστήματα δημιουργίας σας μπορεί να κάνει τη διαφορά μεταξύ μιας κακής διαφοράς πακέτων και μιας πλήρους εισβολής.
Από την πλευρά της απόκρισης, λειτουργίες όπως η αναζήτηση πακέτων σε ολόκληρο τον οργανισμό και τα κέντρα απειλών βοηθούν τις ομάδες να χαρτογραφούν γρήγορα την ακτίνα έκρηξης. Μόλις εντοπιστεί ένα παραβιασμένο πακέτο ή plugin του React Native, οι ομάδες ασφαλείας μπορούν να δουν ποια αποθετήρια, κλάδοι και αρχεία κλειδώματος το περιλαμβάνουν, ποιες εργασίες το εκτέλεσαν και ποια μηχανήματα επικοινώνησαν με ύποπτες διευθύνσεις IP – και στη συνέχεια να δώσουν προτεραιότητα στην αποκατάσταση ανάλογα σε δεκάδες ή εκατοντάδες βάσεις κώδικα.
Πρακτικές ενέργειες για ομάδες React Native που αντιμετωπίζουν κακόβουλο λογισμικό npm
Για τους προγραμματιστές και τους μηχανικούς ασφαλείας του React Native, η άμυνα κατά των επιθέσεων σε επίπεδο npm αφορά τον συνδυασμό της υγιεινής σε μεμονωμένους υπολογιστές με προστατευτικά κιγκλιδώματα στο CI/CD και τη διαχείριση εξαρτήσεων. Κανένας μεμονωμένος έλεγχος δεν θα σας σώσει, αλλά οι πολυεπίπεδες άμυνες μειώνουν δραματικά τις πιθανότητες ένα κακόβουλο πακέτο να μετατραπεί σε πλήρη παραβίαση.
Εάν χρησιμοποιείτε τα παραβιασμένα πακέτα που αναφέρθηκαν προηγουμένως, υπάρχουν ορισμένοι άμεσοι έλεγχοι που πρέπει να εκτελέσετε. Για το περιστατικό AstrOOnauta, pin react-native-international-phone-number στην έκδοση 0.11.7 react-native-country-select προς την 0.4.0, αποφεύγοντας όλες τις εκδόσεις που έχουν επισημανθεί ως κακόβουλες ή επιλύουν @latest που αυτήν τη στιγμή αντιστοιχεί σε μια παραβιασμένη έκδοση.
Ελέγξτε τον αρχικό σας κατάλογο για ένα αρχείο με το όνομα init.json κάτω από το προφίλ χρήστη (για παράδειγμα ~/init.json σε Unix και ~\init.json σε Windows). Η παρουσία του υποδηλώνει ότι το κακόβουλο λογισμικό που βασίζεται στο Solana εκτελέστηκε τουλάχιστον μία φορά. Επίσης, ελέγξτε τα αρχεία καταγραφής εξερχόμενου δικτύου από τους σταθμούς εργασίας προγραμματιστών και τους εκτελεστές CI για συνδέσεις προς 45.32.150.251, τα τελικά σημεία Solana RPC που χρησιμοποιήθηκαν στις καμπάνιες ή οι άλλες διευθύνσεις C2 που αναφέρθηκαν νωρίτερα (π.χ. 136.0.9[.]8, 85.239.62[.]36, 195.133.79.43, 217.69.3.152).
Έλεγχος σας node_modules και lockfiles για ενδεικτικές εξαρτήσεις όπως @agnoliaarisian7180/string-argv, @usebioerhold8733/s-format και το κακόβουλο @react-native-aria/* or @gluestack-ui/utils εκδόσεις που αναφέρονται στις συμβουλές. Εάν εντοπίσετε κάποιο από αυτά, αντιμετωπίστε το μηχάνημα ως πιθανώς παραβιασμένο και εναλλάξτε όλα τα ευαίσθητα διαπιστευτήρια: διακριτικά npm, διακριτικά πρόσβασης GitHub, κλειδιά SSH, κλειδιά παρόχου cloud και τυχόν μυστικά που υπάρχουν στο .env ή αρχεία ρυθμίσεων κατά την εγκατάσταση.
Κοιτάζοντας μπροστά, ενισχύστε τη στάση σας στην αλυσίδα εφοδιασμού για την εργασία React Native: πάντα να υποβάλλετε και να επιβάλλετε το κλείδωμα αρχείων (package-lock.json, yarn.lock, pnpm-lock.yaml), ενεργοποιήστε το 2FA σε όλους τους λογαριασμούς npm με δικαιώματα δημοσίευσης και διαμορφώστε το CI σας ώστε να αποτυγχάνει στις κατασκευές όταν εμφανίζονται νέες εξαρτήσεις χωρίς έλεγχο. Εξετάστε το ενδεχόμενο εκτέλεσης με --ignore-scripts κατά την εγκατάσταση πακέτων τρίτων σε μη αξιόπιστα περιβάλλοντα και συνδέουν εργαλεία σάρωσης εξαρτήσεων τόσο στις τοπικές ροές εργασίας όσο και στο CI.
Τέλος, αντιμετωπίστε τα περιβάλλοντα ανάπτυξης – ειδικά αυτά που χρησιμοποιούνται για εφαρμογές React Native που γεφυρώνουν API για κινητά, web και backend – ως μέρος της επιφάνειας επίθεσης παραγωγής σας. Είτε η απειλή είναι μια κατάληψη λογαριασμού που ρίχνει κακόβουλο λογισμικό που υποστηρίζεται από Solana σε ένα στοιχείο εισόδου τηλεφώνου, είτε ένα typosquat plugin Vite που διαγράφει το React από node_modules, μια κακόβουλη ενσωμάτωση Quill που ανακατεύθυνε τον χώρο αποθήκευσης στην πλευρά του πελάτη ή ένα RCE στο CLI της κοινότητας React Native, το κοινό στοιχείο είναι ότι οι εισβολείς βλέπουν πλέον τα εργαλεία προγραμματιστών ως μία από τις πιο αποτελεσματικές οδούς προς τα κοσμήματα του οργανισμού σας.

