TL? DR
Μεταξύ 1ης Απριλίου και 3ης Μαΐου 2026, ένας μόνο εκδότης npm, user0001, εγγεγραμμένος με τη μη επαληθευμένη διεύθυνση Gmail tanvisoul9@gmail.com, προώθησε αθόρυβα έξι πακέτα με σκόπιμα ήπια ονόματα που ακούγονταν σαν υποδομές: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimeκαι node-env-resolve.
Οι δύο τελευταίες εκδόσεις του node-env-resolve, 1.0.7 και 1.0.8, επισημάνθηκαν από το σύστημα έγκαιρης προειδοποίησης κακόβουλου λογισμικού (MEW) της Xygeni στις 2 Μαΐου και επιβεβαιώθηκαν ως κακόβουλα στις 3 Μαΐου.
Το εμφύτευμα είναι ασυνήθιστο για αυτό που δεν είναι: δεν υπάρχουν bots Telegram, ούτε επανακλήσεις OAST, ούτε συσκότισηκαι καμία προσπάθεια ανάκτησης διαπιστευτηρίων AWS κατά την εγκατάσταση. Αντ' αυτού, postinstall.js Εγκαθιστά μια καταχώρηση μόνιμης εκκίνησης των Windows, χρησιμοποιώντας ένα πλήκτρο HKCU Run που εκκινεί wscript.exe έναντι ενός stub VBS. Στη συνέχεια, δημιουργεί έναν αποσπασμένο παράγοντα Node.js που συνδυάζει ενότητες για καταγραφή μικροφώνου, κλοπή ιστορικού προγράμματος περιήγησης, λήψη στιγμιότυπων οθόνης και προσομοίωση ποντικιού/πληκτρολογίου.
Ονομάζουμε αυτό το σύμπλεγμα DevTap, μετά το κιτ, φεύγει από το λειτουργικό σύστημα του προγραμματιστή.
Και τα έξι πακέτα ήταν διαθέσιμα στο npm κατά τη στιγμή της σύνταξης αυτού του κειμένου. Τα έχουμε υποβάλει στο κανάλι κατάχρησης του μητρώου. Οι υπερασπιστές θα πρέπει να αποσύρουν τυχόν εγκαταστάσεις από τον εκδότη εν αναμονή της κατάργησής τους.
Το Σύμπλεγμα: Έξι Πακέτα, Ένας Εκδότης
Ο λογαριασμός του εκδότη user0001 δεν είναι επαληθευμένο. Δεν έχει SCM επαλήθευση, χωρίς email που συνδέεται με domain και χωρίς προηγούμενο ιστορικό. Η διεύθυνση Gmail tanvisoul9 δεν εμφανίζεται σε κανένα άλλο αρχείο εκδότη npm που μπορέσαμε να βρούμε.
Και τα έξι πακέτα αναφέρουν τον ίδιο διαχειριστή, δημοσιεύθηκαν από τον ίδιο λογαριασμό και μοιράζονται το ίδιο package.json τυποποιημένο. Δεν υπάρχει repositoryόχι homepage, και όχι description μεγαλύτερο από μία μόνο γραμμή.
Η στρατηγική ονομασίας είναι το ενδιαφέρον κομμάτι. Σε αντίθεση με μια κλασική καμπάνια σύγχυσης εξαρτήσεων ή typosquat, κανένα από αυτά τα ονόματα δεν στοχεύει σε μια συγκεκριμένη βιβλιοθήκη upstream. Αντίθετα, είναι βαθμονομημένα ώστε να εξαφανίζονται σε μια πραγματική package.json or npm ls εξόδου.
| Πακέτο | Δημοσιεύθηκε για πρώτη φορά | Τελευταία έκδοση | εκδόσεις | Ρόλος στο Cluster |
|---|---|---|---|---|
| κεντρολόγος | 2026-04-01 12:46 UTC | 1.0.9 | 5, από 1.0.5 έως 1.0.9 | Εξώφυλλο του «βοηθητικού προγράμματος καταγραφής» του συμπλέγματος· η πρώτη δημοσίευση |
| dom-utils-lite | 2026-04-14 07:36 UTC | 1.0.3 | 3 | Γενική κάλυψη βοηθού DOM |
| node-fetch-lite | 2026-04-19 10:22 UTC | 1.0.2 | 3 | Οικογένεια ανάκτησης κόμβων μίμησης |
| συνδετικός παράγοντας | 2026-04-25 05:12 UTC | 1.0.0 | 1 | Γενόσημο όνομα «παράγοντας» |
| κόμβος-gyp-χρόνος εκτέλεσης | 2026-04-25 05:17 UTC | 1.0.0 | 1 | Εργαλεία δημιουργίας εγγενών μονάδων μιμείται |
| επίλυση-περιβάλλοντος-κόμβου | 2026-04-25 05:21 UTC | 1.0.9 | 10, από 1.0.0 έως 1.0.9 | Ενεργό σταγονόμετρο· πλήρες εμφύτευμα |
Ονόματα όπως centralogger, node-fetch-liteκαι node-gyp-runtime έχουν σχεδιαστεί ώστε να φαίνονται αδιαμφισβήτητα στην αναθεώρηση κώδικα. Ακούγονται σαν πράγματα που θα υπήρχαν ήδη στο δέντρο εξαρτήσεων ενός έργου.
Σε συνδυασμό με έναν νέο, μη επαληθευμένο εκδότη και ελλείποντες συνδέσμους αποθετηρίου, σχηματίζουν ένα αναγνωρίσιμο μοτίβο: έναν δράστη που εισάγει ονόματα χαμηλής τριβής στο μητρώο και στη συνέχεια επανεξετάζει γρήγορα αυτό που έχει σημασία. Σε αυτήν την περίπτωση, node-env-resolve έλαβε δέκα εκδόσεις σε οκτώ ημέρες.
Τι εμφανίζεται σε ένα Dev Box των Windows
Η κακόβουλη αλυσίδα node-env-resolve:1.0.8 είναι σύντομο, άμεσο και ασυνήθιστα πλούσιο σε χαρακτηριστικά για ένα npm RAT.
Μετά την εγκατάσταση: Μόνιμη λειτουργία και Αποσυνδεδεμένος παράγοντας
package.json δηλώνει ένα μοναδικό άγκιστρο εγκατάστασης:
{ "scripts": { "postinstall": "node postinstall.js" } }postinstall.js κάνει τρία πράγματα με τη σειρά.
Αρχικά, δημιουργεί έναν κατάλογο εγκατάστασης εκτός του δέντρου npm. Η διαδρομή υπολογίζεται κατά τον χρόνο εκτέλεσης στο σενάριο ως INSTALL_DIRΣτη συνέχεια, εκτελεί μια εσωτερική execSync('npm install --production --silent ...') μέσα σε αυτό για να τραβήξει τις εξαρτήσεις χρόνου εκτέλεσης του εμφυτεύματος. Αυτό τοποθετεί τον παράγοντα σε δίσκο κάπου σε ένα εγχειρίδιο node_modules ο έλεγχος δεν θα βρει.
Δεύτερον, γράφει ένα πρόγραμμα εκκίνησης VBS και το καταχωρεί για διατήρηση εκκίνησης:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \ /v ${AGENT_NAME} \ /t REG_SZ \ /d "wscript.exe \"${vbsPath}\"" /fwscript.exe είναι το Windows Script Host, ένα υπογεγραμμένο δυαδικό αρχείο της Microsoft που εκτελείται .vbs αρχεία χωρίς παράθυρο κονσόλας. Αυτό είναι προcisΑυτός είναι και ο λόγος που προτιμάται για stubs αυτόματης εκτέλεσης.
Υπάρχει επίσης μια αντιστοίχιση reg delete μονοπάτι μέσα src/index.js, υποδηλώνοντας ότι το εμφύτευμα έχει σχεδιαστεί ώστε να μπορεί να αφαιρείται εύκολα με εντολή του χειριστή.
Τρίτον, δημιουργεί μια αποσπασμένη θυγατρική διεργασία:
spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], { detached: true, env: { ...process.env, SERVER_URL } })Δύο λεπτομέρειες έχουν σημασία εδώ.
SERVER_URL διαβάζεται από το περιβάλλον. Ως αποτέλεσμα, το τελικό σημείο C2 μπορεί να διαμορφωθεί ανά ανάπτυξη και δεν ενσωματώνεται στο πακέτο. Αυτή η μικρή αλλά σκόπιμη επιλογή υπερισχύει των περισσότερων στατικών σαρώσεων IOC.
Επίσης, το παιδί που δημιουργείται κληρονομεί το πλήρες γονικό περιβάλλον. Επομένως, οποιοδήποτε NPM_TOKEN, AWS_*, GITHUB_TOKENή η υποδοχή SSH-agent που υπάρχει στο κέλυφος προγραμματιστή κατά τον χρόνο εγκατάστασης ταξιδεύει στη μνήμη του παράγοντα μακράς διαρκείας.
Τι συνοδεύει τον πράκτορα
Το πακέτο src/ Το tree περιλαμβάνει τρεις ενότητες των οποίων τα ονόματα και μόνο αφηγούνται την ιστορία: audioCapture.js, browserHistory.jsκαι systemInfo.js.
Η λίστα εξαρτήσεων χρόνου εκτέλεσης, που επιλύθηκε κατά τη διάρκεια της σταδιακής επεξεργασίας npm install, τα επιβεβαιώνει.
Αυτή η προσέγγιση μετατρέπει ένα χαοτικό περιστατικό σε μια ελεγχόμενη αντίδραση.
Αντί να αντιδρούν τυφλά, οι ομάδες λειτουργούν με σαφής ιεράρχηση προτεραιοτήτων και γρήγορη αποκατάσταση.
| Εξάρτηση | Σε τι χρησιμεύει σε αυτό το πλαίσιο |
|---|---|
| στιγμιότυπο οθόνης-επιφάνειας εργασίας | Περιοδική λήψη οθόνης |
| @πιρούνι-δεντρών-καρυδιών/js-καρυδιών | Αυτοματοποίηση/προσομοίωση εισόδου ποντικιού και πληκτρολογίου |
| better-sqlite3 | Άμεσες αναγνώσεις βάσεων δεδομένων SQLite Chrome, Edge και Firefox History |
| adm-zip | Ομαδοποίηση συλλεγμένων αντικειμένων πριν από την απομάκρυνσή τους |
| αιχμηρά | Αλλαγή μεγέθους / συμπίεση στιγμιότυπων οθόνης και τεχνουργημάτων εικόνας |
| socket.io-client | Μόνιμο αμφίδρομο κανάλι C2 |
| αναγνωριστικό-μηχανής-κόμβου | Σταθερό δακτυλικό αποτύπωμα ανά κεντρικό υπολογιστή για την παρακολούθηση θυμάτων |
systemInfo.js κλήσεις os.networkInterfaces() για επιπλέον λήψη δακτυλικών αποτυπωμάτων πριν από τον πρώτο φάρο.
Γιατί η καταγραφή ήχου είναι το σήμα που ξεχωρίζει
Τα περισσότερα npm RAT που αξιολογούμε στο MEW σταματούν σε μυστική κλοπή κατά την εγκατάσταση. Διαβάζουν ~/.npmrc, Διαβάστε ~/.aws/credentials, ξύνω process.env, ΔΗΜΟΣΙΕΥΣΗ σε ένα webhook και έξοδος. Αυτό ταιριάζει σε ένα οικονομικό μοντέλο smash-and-grab. Τα διαπιστευτήρια έχουν σύντομο χρόνο ημιζωής και ο εισβολέας πρέπει να δημιουργήσει έσοδα γρήγορα.
node-env-resolve έχει διαφορετικό σχήμα.
Η διατήρηση έχει ρυθμιστεί ώστε να επιβιώνει από την επανεκκίνηση. Ο παράγοντας εκτελείται αποσπασματικά και μακράς διαρκείας υπό wscript.exeΤο κιτ που περιέχει προορίζεται για να βρίσκεται στον υπολογιστή ενός προγραμματιστή, όχι για να το αρπάζει και να το αφήνει: μια συσκευή εγγραφής μικροφώνου, ένα πρόγραμμα οδήγησης πληκτρολογίου/ποντικιού, πλήρη εισαγωγή ιστορικού προγράμματος περιήγησης, καταγραφή οθόνης και ένα διαδραστικό κανάλι Socket.IO πίσω σε ένα διαμορφώσιμο C2.
Η καταγραφή μικροφώνου ειδικότερα είναι το όριο που αυτή η καμπάνια ξεπερνά, κάτι που τα περισσότερα κακόβουλα προγράμματα npm δεν ξεπερνούν.
Ένας σταθμός εργασίας προγραμματιστή γίνεται, ολοένα και περισσότερο, ο σταθμός εργασίας όπου οι προγραμματιστές λαμβάνουν stand-up, κλήσεις πελατών, συζητήσεις σχεδιασμού και γέφυρες εφημερίας. Ένα εμφύτευμα που καταγράφει το μικρόφωνο δεν αναζητά στην πραγματικότητα το διακριτικό npm του προγραμματιστή. Είναι αυτό που λέει ο προγραμματιστής μπροστά στον φορητό υπολογιστή.
Αυτό το σύνολο δυνατοτήτων, σε συνδυασμό με την έλλειψη συσκότισης και την απουσία οποιασδήποτε φανταχτερής αφαίρεσης κατά την εγκατάσταση, ερμηνεύεται ως προκαθορισμένη τοποθέτηση για στοχευμένη πρόσβαση και όχι ως ευκαιριακή κλοπή διαπιστευτηρίων.
Δεν ισχυριζόμαστε απόδοση μόνο από αυτό. Σημειώνουμε το λειτουργικό προφίλ.

Ο οκταήμερος ρυθμός επανάληψης στο node-env-resolve είναι η πιο λειτουργικά αποκαλυπτική λεπτομέρεια στη χρονογραμμή.
Δεν πρόκειται για ένα drop-up που ξεκινάει αμέσως. Ο εκδότης συντηρεί ενεργά το dropper, κάτι που συνήθως σημαίνει ένα από τα δύο. Είτε το ρυθμίζουν σε περιβάλλοντα δοκιμών πριν από την ευρύτερη ανάπτυξη, είτε έχουν ήδη εγκαταστήσει τηλεμετρία και ανταποκρίνονται σε αυτό.
Τα άλλα πέντε πακέτα ουσιαστικά δεν παρουσίασαν churn μετά την αρχική τους δημοσίευση. Αυτό ταιριάζει με ένα μοτίβο «ένα στάδιο, άφησε το όνομα» για το υποστηρικτικό σύμπλεγμα, ενώ η μηχανική προσπάθεια επικεντρώνεται στο πακέτο που κάνει τη δουλειά.
Απόδοση: Μικρές ενδείξεις, καμία οριστική ετυμηγορία
Δημόσιο OSINT Τα σήματα είναι λεπτά και δεν θα τα τεντώσουμε. Τι είναι παρατηρήσιμο:
Η λαβή του Gmail tanvisoul9 μοιάζει εν μέρει με ένα νοτιοασιατικό ονοματεπώνυμο, «Tanvi». Αυτό είναι ένα αδύναμο σήμα. Τα ονόματα χρήστη του Gmail δεν αποτελούν ταυτότητα και τα τελικά soul9 είναι γενικό. Δεν είναι ασφαλές να συμπεράνουμε γεωγραφικά δεδομένα μόνο από ένα τοπικό τμήμα email.
Το στυλ κώδικα είναι φυσιολογικό στο Node.js: standard κλήσεις βιβλιοθήκης όπως π.χ. os, child_process, spawnκαι reg addΔεν υπάρχει συσκότιση, εναλλαγή συμβολοσειρών και λογική κατά του εντοπισμού σφαλμάτων. Ο συγγραφέας αισθάνεται άνετα με τα πρωτόγονα του μητρώου των Windows και την ενορχήστρωση αποσπασμένων θυγατρικών διεργασιών, αλλά δεν φαίνεται να επιδιώκει πιο μυστικές τεχνικές που θα μπορούσαν εύλογα να χρησιμοποιούν.
Οι εξαρτήσεις είναι εντελώς άγνωστες και γνωστές: screenshot-desktop, nut-js, better-sqlite3και socket.io-clientΔεν υπάρχει προσαρμοσμένο πρωτόκολλο, δεν υπάρχει στοίβα C2 που να δημιουργείται από την αρχή και δεν υπάρχει κάποιο καινοτόμο κόλπο διατήρησης πέρα από ένα εγχειρίδιο. Κλειδί εκτέλεσης HKCUΠρόκειται για έναν ικανό ολοκληρωτή, όχι για έναν συγγραφέα εργαλείων.
Δεν βρήκαμε συμβολοσειρές που δεν είναι στα Αγγλικά, ενσωματωμένα σχόλια, δεδομένα τοπικών ρυθμίσεων ή αποτυπώματα ζώνης ώρας εξόδου μεταγλωττιστή μέσα στα δημοσιευμένα τεχνουργήματα.
Ελέγξαμε για επικάλυψη κώδικα με προηγούμενες καμπάνιες που παρακολουθούμε ήδη, συμπεριλαμβανομένων Shai Hulud, Owlivion, Buildkite, και το πρόσφατο heibai / claude-code-best Οικογένεια κλώνων Anthropic-CLI. Δεν βρήκαμε κανένα: κανένα κοινό μοτίβο C2, καμία κοινή διάταξη αρχείου και κανένα κοινό ιδιωματισμό.
Αυτό που δεν θα λέγαμε: ότι πρόκειται για κρατικό παράγοντα, για γνωστή ομάδα ή για γεωγραφικά συνδεδεμένο φορέα με κάποια συγκεκριμένη χώρα.
Το λειτουργικό προφίλ είναι συνεπές με μια μικρή, μέτριας εξειδίκευσης ομάδα που αναλαμβάνει την επιτήρηση σταθμού εργασίας προγραμματιστή. Πιθανότατα έχει οικονομικό κίνητρο μέσω της χρήσης της πρόσβασης σε μεταγενέστερο στάδιο, αλλά πιθανώς και μέσω της αναγνώρισης ως υπηρεσίας για έναν ξεχωριστό αγοραστή.
Δύο έμμεσα σημεία υποστηρίζουν αυτό: η αποφυγή μηχανισμών αποδιήθησης που τραβούν την προσοχή και θα κάψουν γρήγορα το σύμπλεγμα, όπως τα bots του Telegram, oastify.com, ή canarytokens, και τα σκόπιμα ήπια ονόματα πακέτων, τα οποία ευνοούν τις ήσυχες εγκαταστάσεις μακράς ουράς έναντι μιας σύντομης απότομης αύξησης του όγκου.
Δείκτες παραβίασης και ανίχνευσης
| Πακέτα και Εκδότης | |
|---|---|
| Πεδίο | αξία |
| εκδότης npm | user0001 |
| Ηλεκτρονικό ταχυδρομείο εκδότη | tanvisoul9@gmail.com, μη επαληθευμένο |
| Πακέτα | centralogger, dom-utils-lite, node-fetch-lite, παράγοντας-σύνδεσης, χρόνος-εκτέλεσης-node-gyp, επίλυση-node-env |
| Επιβεβαιωμένο κακόβουλο | node-env-resolve@1.0.7, node-env-resolve@1.0.8 |
| Τεχνουργήματα υποδοχής | |
|---|---|
| Χαρακτηριστικά | αξία |
| Κλειδί επιμονής | HKCU\Software\Microsoft\Windows\CurrentVersion\Run |
| Αξία επιμονής | Όνομα μεταβλητής· δεδομένα της μορφής wscript.exe " \\ .vbs" |
| Εγκατάσταση γάντζου | postinstall: κόμβος postinstall.js στο μανιφέστο του πακέτου |
| Μονάδες εμφυτευμάτων | src/audioCapture.js, src/browserHistory.js, src/systemInfo.js |
| Κατάλογος σταδιοποίησης | Το INSTALL_DIR επιλύθηκε εκτός των node_modules του έργου. Η τοποθεσία ορίστηκε από το postinstall.js κατά την εγκατάσταση. |
| Δίκτυο | |
|---|---|
| Χαρακτηριστικά | αξία |
| Μεταφορά C2 | socket.io-client, μόνιμο αμφίδρομο κανάλι |
| Τελικό σημείο C2 | Παρέχεται στον παράγοντα μέσω της μεταβλητής περιβάλλοντος SERVER_URL· δεν είναι ενσωματωμένο σε δημοσιευμένα τεχνουργήματα |
Σημειώσεις ανίχνευσης
Δύο κανόνες καταγράφουν αυτήν την οικογένεια χωρίς να χρειάζεται το τελικό σημείο C2.
Αρχικά, επισημάνετε τα σενάρια μετά την εγκατάσταση που εκτελούν μια εσωτερική npm install σε μια διαδρομή εκτός του καταλόγου του πακέτου. Οποιοδήποτε νόμιμο πρόγραμμα λήψης προκατασκευής, όπως node-gyp ανακατασκευές ή προ-ενσωματωμένα δυαδικά προγράμματα λήψης, εγγραφές μέσα στο πακέτο ή σε πλατφόρμα-standard διαδρομές προσωρινής μνήμης με επαληθευμένα hashes. Δεν γράφει σε ένα πρόσφατα δημιουργημένο INSTALL_DIR αλλού στο δίσκο.
Δεύτερον, επισημάνετε τα σενάρια μετά την εγκατάσταση που παρουσιάζουν προβλήματα reg add HKCU\…\Run μαζί σου, wscript.exe ως εκκινητής. Αυτό ουσιαστικά δεν είναι ποτέ νόμιμο από ένα πακέτο npm. Σημαίνετε και τοποθετήστε το σε καραντίνα.
Μια τρίτη ευρετική μέθοδος είναι χρήσιμη για τον εντοπισμό του επόμενου πακέτου αδελφών πριν επιβεβαιωθεί: ένας νέος εκδότης npm χωρίς SCM επαλήθευση, ένα email Gmail, όχι repository πεδίο και πολλά σύντομα, γενικά ονόματα πακέτων που ακούγονται σαν υποδομή και δημοσιεύονται με διαφορά ημερών το ένα από το άλλο, αρκεί από μόνο του για να δικαιολογήσει μη αυτόματη αναθεώρηση.
Αναφέρθηκε στο μητρώο npm. Θα ενημερώσουμε αυτήν την ανάρτηση όταν καταργηθεί ο λογαριασμός εκδότη.






