TL? DR
Στις 21-05-2026, ο εκδότης του npm jaggle κυκλοφόρησε εννέα εκδόσεις (1.0.0 μέσω 1.0.8) του @jaggle/resizeobserves σε ένα χρονικό διάστημα περίπου δύο ωρών.
Το πακέτο είναι μια τυπογραφική παράλειψη του νόμιμου @juggle/resize-observer polyfill — ένα ευρέως χρησιμοποιούμενο πακέτο με εκατομμύρια εβδομαδιαίες λήψεις — αλλά δεν διαθέτει πραγματική υλοποίηση του ResizeObserver.
Αντίθετα, το πακέτο γάντζο μετά την εγκατάσταση εγκαθιστά ένα πακέτο ωφέλιμου φορτίου Python, καταγράφει την persistence ως έναν broker χρόνου εκτέλεσης με εμφάνιση εγγενούς πλατφόρμας και αναπτύσσει έναν hijacker πρόχειρου σε πολλαπλές πλατφόρμες που στοχεύει συναλλαγές κρυπτονομισμάτων.
Linux η επιμονή εμφανίζεται ως python3-dbus-helper, macOS as com.apple.python.runtimeκαι Windows as PyRuntimeBroker.
Το ωφέλιμο φορτίο παρακολουθεί συνεχώς το πρόχειρο για διευθύνσεις πορτοφολιών σε όλο το περισσότερα από 40 blockchains και αντικαθιστά σιωπηλά τις αντιγραμμένες διευθύνσεις με πορτοφόλια που ελέγχονται από εισβολείς.
Το κακόβουλο λογισμικό λειτουργεί εξ ολοκλήρου τοπικά χωρίς εξερχόμενη υποδομή C2, καθιστώντας την ίδια την αντικατάσταση του πρόχειρου τον μηχανισμό εξαγωγής.
Το κύριο IOC είναι το ίδιο το όνομα του πακέτου: @jaggle/resizeobserves — σημειώστε το φωνήεν που έχει πέσει στο «jaggle» και το προστιθέμενο «s» στο «resizeobserves».
Σοβαρότητα: υψηλή.
Η Επίθεση: Πώς Λειτουργεί
npm:@jaggle/resizeobserves δεν μοιάζει με κακόβουλο λογισμικό σε μια απλή εμφάνιση προβολή npm. Του README.md είναι το README αυτούσιο του npm:@juggle/resize-observer — ίδια δείγματα κώδικα, ίδιες οδηγίες χρήσης, ίδιες εισαγωγή { ResizeObserver } από '@juggle/resize-observer' αναφορές σε όλο το κείμενο. Η λογοκλοπή είναι τόσο ολοκληρωμένη που όποιος ρίξει μια ματιά στην τεκμηρίωση θα υπέθετε ότι διαβάζει τα έγγραφα του νόμιμου πακέτου.
The πακέτο.json, αντίθετα, είναι αραιό: όχι Αποθήκη πεδίο, ένα μόνο bin είσοδος που δείχνει προς bin/clipboard-guardian.js, και ένα μετά την εγκατάσταση σενάριο που εκτελείται κόμβος npm-install.jsΤα παραδείγματα "Βασικής χρήσης" του README αναφέρονται σε μια υλοποίηση JavaScript που δεν υπάρχει πουθενά στο tarball. Η μόνη JavaScript στο πακέτο είναι το σενάριο εγκατάστασης.
Στάδιο 1 — το npm postinstall bootstraps εκτελεί ένα ωφέλιμο φορτίο Python
npm-install.js είναι συμβατό με την πλατφόρμα. Εντοπίζει ένα κουκούτσι εκτελέσιμο αρχείο κατά μήκος μιας σταθερής διαδρομής αναζήτησης (/usr/bin/pip3, /usr/local/bin/pip, επιστρέφοντας στο python3 -m pip), εγκαθιστά το πακέτο Python που περιλαμβάνεται από τον κατάλογο tarball και — σε Linux — το τραβάει xclip or xsell μέσω apt-get, pacmanΤο HIFU, ή Υψηλής Έντασης Εστιασμένος Υπέρηχος, στοχεύει επίσης στο πρόσωπο και τον λαιμό. Προσφέρει θεραπεία σε γρήγορες εκπομπές, γεγονός που κάνει τις συνεδρίες θεραπείας συντομότερες. DNF αν κανένα από τα δύο δεν υπάρχει ήδη:
Η χρήση των –πακέτα-συστήματος-break είναι σκόπιμο: οι σύγχρονες διανομές Linux διαθέτουν Python με ενεργοποιημένο τον δείκτη εξωτερικά διαχειριζόμενου περιβάλλοντος του PEP 668, ο οποίος αποκλείει τις εγκαταστάσεις pip σε ολόκληρο τον ιστότοπο από προεπιλογή. Το σενάριο εγκατάστασης επιβάλλει την εγκατάσταση.
Το σενάριο είναι επίσης συμβατό με sudo. Όταν το εκτελούμενο uid είναι το αποτέλεσμα ενός εγκατάσταση sudo npm, το σενάριο αναφέρει SUDO_USER και καταβάλλει κάθε δυνατή προσπάθεια κωδικός πρόσβασης getent να βρει το πραγματικός στον αρχικό κατάλογο του χρήστη, και στη συνέχεια γράφει τα αρχεία persistence εκεί αντί να τα γράφει σε / RootΗ επιμονή αφορά κάθε χρήστη, όχι ολόκληρο το σύστημα.
Στάδιο 2 — Διατήρηση μεταξύ λειτουργικών συστημάτων (cross-OS) με ονόματα μεσολαβητών χρόνου εκτέλεσης (runtime-broker)
Μετά την εγκατάσταση του πακέτου Python, το σενάριο καταγράφει μια καταχώρηση αυτόματης εκκίνησης με διαφορετικό όνομα σε κάθε λειτουργικό σύστημα:
- Linux — μια συστημική μονάδα χρήστη στο ~/.config/systemd/user/python3-dbus-helper.service. Της μονάδας Περιγραφή is Βοηθός χρόνου εκτέλεσης Python D-BusΤο σενάριο προσπαθεί επίσης να το ενεργοποιήσει μέσω systemctl – ενεργοποίηση χρήστη, επιστρέφοντας σε έναν χειροκίνητο συμβολικό σύνδεσμο στην ενότητα default.target.wants/ όταν το systemctl αποτυγχάνει. Εάν εκτελείται με sudo, το σενάριο αλλάζει σε sudo -u systemctl –χρήστης, με XDG_RUNTIME_DIR ορίστε έτσι ώστε να λειτουργεί η κλήση διαύλου χρήστη.
- macOS — μια λίστα LaunchAgent στη διεύθυνση ~/Βιβλιοθήκη/LaunchAgents/com.apple.python.runtime.plist μαζί σου, Εκτέλεση στο φορτίο = αληθές και Διατήρηση ζωντανής λειτουργίας=αληθής, στη συνέχεια φορτώθηκε μέσω φόρτωση launchctl.
- Windows — μια Προγραμματισμένη Εργασία με το όνομα PyRuntimeBroker, που ενεργοποιείται AtLogOn, με χρονικό όριο εκτέλεσης μηδέν (δηλαδή, χωρίς χρονικό όριο), καταχωρημένη μέσω PowerShell.
Και τα τρία ονόματα είναι αξιόπιστα με την πρώτη ματιά. βοηθός-dbus-python3 ακολουθεί τη σύμβαση ονοματοδοσίας της νόμιμης ενσωμάτωσης Python-D-Bus σε επιτραπέζιους υπολογιστές Linux. com.apple.python.runtime μιμείται την αντίστροφη επισήμανση DNS της Apple για τις δικές της υπηρεσίες. PyRuntimeBroker αντηχεί τα Windows RuntimeBroker.exe — μια πραγματική, υπογεγραμμένη υπηρεσία της Microsoft που διαμεσολαβεί αιτήματα άδειας για εφαρμογές UWP. Καμία από αυτές δεν είναι πραγματικές υπηρεσίες Apple/Microsoft/Python σε αυτό το πλαίσιο, αλλά ένας υπερασπιστής που κάνει μια γρήγορη οπτική σάρωση systemctl –μονάδες λίστας χρηστών or Get-SeduledTask είναι απίθανο να διστάσει.
Στάδιο 3 — Ο αεροπειρατής του πρόχειρου
Το ωφέλιμο φορτίο Python, εγκατεστημένο στο clipboard_guardian/guardian.py, εκτελεί έναν άπειρο βρόχο που ρωτάει το πρόχειρο του συστήματος κάθε 400 χιλιοστά του δευτερολέπτου. Σε κάθε τικ, ανακτά τα τρέχοντα περιεχόμενα του προχείρου μέσω pyperclip.paste() και τα εκτελεί σε μια λίστα με σαράντα και πλέον προ-μεταγλωττισμένες κανονικές εκφράσεις που καλύπτουν μορφές διευθύνσεων πορτοφολιού για Ethereum, Bitcoin, Monero, Solana, TRON, TON, Ripple, Litecoin, Dogecoin, Polkadot, NEAR, Cosmos, Algorand, Stellar, Cardano, Bitcoin Cash, Dash, Zcash, Aptos, Sui, Tezos, MultiversX, Harmony, Terra, Injective, Osmosis, Kava, Celestia, Nano, Filecoin, Ronin, Ergo, DigiByte, Hedera, BNB Smart Chain και αρκετές άλλες που έχουν μείνει κενές στην προεπιλεγμένη διαμόρφωση (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).
Όταν επιτευχθεί μια αντιστοίχιση, το σενάριο διαβάζει τη διεύθυνση του εισβολέα για αυτήν την αλυσίδα από ~/.config/clipboard-guardian/config.json (ή τα ισοδύναμα πλατφόρμας του) και αντικαθιστά το πρόχειρο με το υποκατεστημένο κείμενο:
Δεν υπάρχει σήμα δικτύου. Το clipper δεν τηλεφωνεί στο σπίτι, δεν καταγράφει μολυσμένους κεντρικούς υπολογιστές, δεν εξάγει τίποτα. Η εξάγωγη είναι η ίδια η αντικατάσταση: όταν ένας χρήστης αντιγράφει μια διεύθυνση παραλήπτη από το περιβάλλον χρήστη του πορτοφολιού του και την επικολλά σε ένα παράθυρο διαλόγου αποστολής, η επικολλημένη διεύθυνση ανήκει στον χειριστή. Τα χρήματα χάνονται εντός της ζώνης, με διαφάνεια στον χρήστη.
Τι νέο υπάρχει εδώ
Μερικές λεπτομέρειες ξεχωρίζουν σε σύγκριση με το γενικό πρότυπο crypto-clipper:
1. npm → Διασταύρωση Python. Τα περισσότερα crypto-clippers που βλέπουμε στο npm είναι καθαρή JavaScript, συχνά μπερδεμένα με _0x περιστροφή πίνακα ή αξιολόγηση(atob(…)) στοίβες. Αυτό το δείγμα χρησιμοποιεί το tarball npm ως τίποτα περισσότερο από ένα περιτύλιγμα παράδοσης για ένα πακέτο Python — καθαρή Python — και επιτρέπει στο pip να χειρίζεται την εγκατάσταση εξαρτήσεων (pyperclip, ψουτίλ, προαιρετικός setproctitle) δηλωμένο στο πακέτο pyproject.tomlΔεν υπάρχει καμία περίπλοκη JavaScript που πρέπει να ξεπεραστεί. Το ίδιο το clipper είναι απλό, ευανάγνωστο σε Python.
2. Ετικέτες επιμονής Tri-OS που επιλέχθηκαν με βάση την αληθοφάνεια. Πολλοί εγκαταστάτες σε διάφορες πλατφόρμες καταχωρούν την επιμονή με γενικά ονόματα (updater.service, helper.plist). Αυτό το δείγμα μπαίνει στον κόπο να επιλέξει ετικέτες που μοιάζουν με platform-native runtime brokers σε κάθε λειτουργικό σύστημα. Η ονομασία είναι η μόνη προσπάθεια μυστικότητας — δεν υπάρχει rootkit, δεν υπάρχει απόκρυψη userland, δεν υπάρχει συσκότιση διαδρομής. Το στοίχημα είναι ότι οι defenders σπάνια κάνουν έλεγχο. ~/.config/systemd/user/ και ότι μια υπηρεσία με το όνομα βοηθός-dbus-python3 δεν θα ξεχωρίσει σε μια απλή κριτική.
3. Η μεταμφίεση του τίτλου της διαδικασίας είναι πραγματική, αλλά η αντι-ανάλυση είναι αδρανής. Το ωφέλιμο φορτίο της Python ορίζει ένα _disguise_process() συνάρτηση που ορίζει τον τίτλο της διεργασίας μέσω setproctitle (Linux/macOS) ή ΟρισμόςΤίτλουΚονσόλαςW (Windows) — και κύριος() το αποκαλεί. Έτσι ps aux θα δείξω βοηθός-dbus-python3 αντί του python3 …/guardian.pyΩστόσο, η ίδια ενότητα ορίζει ένα is_monitor_running() συνάρτηση που απαριθμεί γνωστά εργαλεία παρακολούθησης διεργασιών (htop, btop, Διαχείριση εργασιών, Παρακολούθηση δραστηριότητας, Process Hacker, Παρακολούθηση πόρων, οθόνες συστήματος GNOME / KDE / Xfce / MATE, και ούτω καθεξής) — και κύριος() δεν το καλεί ποτέ. Ο βρόχος αντικατάστασης εκτελείται άνευ όρων, ανεξάρτητα από το αν ο χρήστης έχει ανοιχτή μια οθόνη διεργασίας ή όχι. Η συνάρτηση είναι νεκρός κώδικας στην έκδοση που κυκλοφόρησε. Πιθανότατα είναι ένα υπόλειμμα από μια προηγούμενη επανάληψη ή ένα υπόστρωμα για μια λειτουργία που δεν έχει ακόμη συνδεθεί. Σε κάθε περίπτωση, η επιφάνεια αντι-ανάλυσης του δημοσιευμένου ωφέλιμου φορτίου είναι μια μετονομασία τίτλου διεργασίας, όχι η αποφυγή ενεργού οθόνης.
4. Η συμπεριφορά συγχώνευσης ρυθμίσεων πακέτου. npm-install.js γράφει την προεπιλεγμένη λίστα πορτοφολιών σε ~/.config/clipboard-guardian/config.json και, εάν υπάρχει ήδη ένα αρχείο ρυθμίσεων, συγχωνεύει τυχόν κλειδιά των οποίων η υπάρχουσα τιμή είναι κενή. Αυτό σημαίνει ότι ένας χρήστης που έχει μολυνθεί προηγουμένως και έχει καθαρίσει εν μέρει τη διαμόρφωση — ας πούμε, αδειάζοντας το ethereum value — θα συμπληρώνεται εκ νέου με κάθε επόμενη εγκατάσταση κακόβουλου πακέτου. Δεν υπάρχει καθαρισμός του αρχείου persistence σε καμία διαδρομή κώδικα.
| Ημερομηνία / Ώρα (UTC) | Συμβάν |
|---|---|
2026-05-21 18:50:32 | @jaggle/resizeobserves@1.0.0 που δημοσιεύθηκε. |
2026-05-21 19:55:55 | 1.0.1 δημοσιευμένη — πρώτη έκδοση που επισημάνθηκε από εξωτερική σάρωση. |
2026-05-21 19:58:10 | 1.0.2 που δημοσιεύθηκε. |
2026-05-21 20:05:03 | 1.0.3 που δημοσιεύθηκε. |
2026-05-21 20:09:24 | 1.0.4 που δημοσιεύθηκε. |
2026-05-21 20:13:48 | 1.0.5 που δημοσιεύθηκε. |
2026-05-21 20:41:52 | 1.0.6 που δημοσιεύθηκε. |
2026-05-21 20:43:56 | 1.0.7 δημοσιεύτηκε — προσθέτει ένα try/catch περιτύλιγμα γύρω από το βήμα εγγραφής διαμόρφωσης πορτοφολιού npm-install.js. |
2026-05-21 20:46:15 | 1.0.8 δημοσιεύτηκε — ο εγκαταστάτης μετονομάστηκε σε άλλον. npm-install.js → npm-install.cjs (περιεχόμενο πανομοιότυπο με byte). |
2026-05-22 | Ετυμηγορία και ΔΟΕ που δημοσιεύθηκαν. Οι εκδόσεις εξακολουθούν να υπάρχουν στο μητρώο κατά τον χρόνο δημοσίευσης (σε εξέλιξη). |
Εννέα εκδοχές σε μία ώρα και πενήντα έξι λεπτά είναι γρήγορος αριθμός ακόμη και για ένα typosquat. Το μοτίβο είναι σύμφωνο με ένα καμπάνια δημοσίευσης και καύσης — πλημμυρίστε το μητρώο με έναν δείκτη χειρισμού, αφήστε την ανίχνευση να ακολουθήσει την πορεία της και μετακινηθείτε σε έναν νέο δείκτη χειρισμού μόλις αφαιρεθεί μια μεμονωμένη έκδοση. Τα ορατά δέλτα σε όλη την εκτέλεση είναι αισθητικά: προστέθηκε το 1.0.1 ρητό /usr/bin/pip3διαδρομές -style προς τη λίστα αναζήτησης pip (συμβατότητα με sudo), η έκδοση 1.0.7 περιέβαλε το wallet-config write σε ένα try/catch και η έκδοση 1.0.8 μετονόμασε το πρόγραμμα εγκατάστασης από . Js προς την .cjs διατηρώντας παράλληλα το περιεχόμενό του πανομοιότυπο με byte. Το .cjs μετονομάστε τα κομμάτια με προειδοποιήσεις npm σχετικά με την αμφίση ανάλυση της ενότητας σε πακέτα χωρίς σαφή "τύπος" πεδίο και μπορεί να αποτελεί μια προσπάθεια καταστολής του θορύβου κατά την εγκατάσταση που θα μπορούσε να τραβήξει την προσοχή. Το ωφέλιμο φορτίο της Python — το μόνο μέρος που στην πραγματικότητα κλέβει — παραμένει αμετάβλητο και στις εννέα εκδόσεις.
Δείκτες συμβιβασμού
Πακέτα
| Οικοσύστημα | Πακέτο | εκδόσεις | Κατάσταση |
|---|---|---|---|
| npm | @jaggle/resizeobserves | 1.0.0 μέσω 1.0.8 | Ζωντανά από τη δημοσίευση· ζητήθηκε η αφαίρεση. |
Αρχεία και hashes
| μονοπάτι | Σημειώσεις |
|---|---|
clipboard_guardian/guardian.py(md5 f7935c2c82bc881288611ab6cd634f17) | Ίδιο και στις εννέα δημοσιευμένες εκδόσεις (1.0.0 μέσω 1.0.8). Το ωφέλιμο φορτίο της κουρευτικής μηχανής. |
npm-install.js (1.0.0 – 1.0.7)npm-install.cjs (1.0.8) | Πρόγραμμα εγκατάστασης persistence. ίδια συμπεριφορά από άκρο σε άκρο. 1.0.7's .js και 1.0.8's .cjs είναι πανομοιότυπα με byte. |
~/.config/clipboard-guardian/config.json | Ρύθμιση παραμέτρων persistence Linux και πακέτο πορτοφολιού. |
~/Library/Application Support/clipboard-guardian/config.json | Ρύθμιση παραμέτρων διατήρησης macOS και δέσμη πορτοφολιού. |
%APPDATA%\clipboard-guardian\config.json | Ρύθμιση παραμέτρων διατήρησης των Windows και δέσμη πορτοφολιού. |
~/.config/systemd/user/python3-dbus-helper.service | Διατήρηση αυτόματης εκκίνησης Linux. |
~/Library/LaunchAgents/com.apple.python.runtime.plist | Μόνιμη λειτουργία macOS LaunchAgent. |
~/Library/Logs/com.apple.python.runtime.log | Αρχείο καταγραφής macOS stdout/stderr για τον παράγοντα. |
Scheduled Task PyRuntimeBroker | Εργασία αυτόματης εκκίνησης των Windows (AtLogOn, χωρίς χρονικό όριο). |
Δείκτες Συμπεριφοράς
| Σήμα | Περιγραφή |
|---|---|
pip install --break-system-packages από npm μετά την εγκατάσταση | Επιβάλλει την εγκατάσταση Python σε ολόκληρο τον ιστότοπο παρακάμπτοντας τις προστασίες PEP 668. |
apt-get install -y xclip (ή pacman/dnf) | Εγκαθιστά βοηθητικά προγράμματα πρόχειρου σε Linux κατά την εγκατάσταση του πακέτου. |
python3-dbus-helper.service μονάδα χρήστη systemd | Η επιμονή καταχωρήθηκε με ένα όνομα βοηθού χρόνου εκτέλεσης που φαινόταν εύλογο. |
com.apple.python.runtime LaunchAgent | Ετικέτα διατήρησης εκτός των νόμιμων διαδρομών συστήματος της Apple. |
PyRuntimeBroker Προγραμματισμένη εργασία | Ψεύτικη persistence broker χρόνου εκτέλεσης των Windows χωρίς νόμιμη πηγή εγκατάστασης. |
Διαδικασία Python με τίτλο python3-dbus-helper εισαγωγή pyperclip και psutil | Αναντιστοιχία συμπεριφοράς μεταξύ του εμφανιζόμενου ονόματος διεργασίας και των εισαγόμενων βιβλιοθηκών. |
| Αλλαγές στο πρόχειρο ~0.4 δευτερόλεπτα μετά την αντιγραφή της διεύθυνσης πορτοφολιού | Συμπεριφορά υπογραφής αντικατάστασης διεύθυνσης κρυπτονομισμάτων. |
Πακέτο πορτοφολιού επιτιθέμενου (λίστα κυνηγιού αμυντικών)
Η λίστα πορτοφολιών αποστέλλεται με ενσωματωμένο κώδικα npm-install.js και clipboard_guardian/guardian.pyΟι αμυντικοί μπορούν να χρησιμοποιήσουν τη λίστα τόσο ως λίστα αποκλεισμού (να αντιμετωπίσουν οποιαδήποτε μεταφορά σε αυτές τις διευθύνσεις από εταιρικά πορτοφόλια ως ύποπτη) όσο και ως κλειδί κυνηγιού (να αντιμετωπίσουν την παρουσία οποιασδήποτε από αυτές τις συμβολοσειρές σε ένα μη εξουσιοδοτημένο αρχείο ρυθμίσεων, ένα τεχνούργημα κατασκευής ή έναν υπολογιστή προγραμματιστή ως ένδειξη μόλυνσης).
Πακέτο πορτοφολιού επιτιθέμενου
| Αλυσίδα | Διεύθυνση |
|---|---|
| Ethereum / BSC | 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Ρόνιν (EVM) | ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Bitcoin | bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y |
| Bitcoin Cash | bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt |
| Litecoin | ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe |
| dogecoin | DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy |
| παύλα | XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS |
| Zcash | t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M |
| DigiByte | DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH |
| Monero | 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf |
| σολάριουμ | DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5 |
| TRON | TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2 |
| TON | UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr |
| Ripple | r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H |
| Polkadot | 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG |
| NEAR | 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364 |
| Σύμπαν | cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e |
| Ώσμωση | osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t |
| Celestia | celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5 |
| Ενέσιμο | inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh |
| Κάβα | kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux |
| Αρμονία | one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a |
| Γη | terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x |
| Αλγκόραντ | XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI |
| Αστρικός | GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE |
| Cardano | addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f |
| MultiverseX | erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0 |
| Aptos | 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e |
| Σουί | 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78 |
| Nano | nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn |
| Filecoin | f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui |
| Tezos | tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk |
| Όθεν | 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA |
| Hedera | 0.0.10488092 |
Οι αλυσίδες με κάλυψη regex αλλά κενές θέσεις πορτοφολιού στην προεπιλεγμένη διαμόρφωση — Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB — δεν αντικαθίστανται ενεργά σε αυτήν την έκδοση, αλλά ανιχνεύονται. Αντιμετωπίστε τες ως πεδίο εφαρμογής παρακολούθησης και όχι ως πεδίο εφαρμογής αντικατάστασης.
Απόδοση & Κίνητρο
Η καμπάνια προσφέρει λεπτή επιφάνεια απόδοσης. Δεν έχουμε καταφέρει να επιβεβαιώσουμε την ταυτότητα του χειριστή. Τι μπορούμε να καταγράψουμε:
- Μεταδεδομένα εκδότη. Ο λογαριασμός npm κουνιέμαι αναφέρει το email του ως olgascarlet@deltajohnsons.comΤο domain deltajohnsons.com δεν επιλύεται σε μια εταιρική ταυτότητα που μπορούμε να επαληθεύσουμε. Ο λογαριασμός npm δεν εμφανίζει επαλήθευση email και δεν SCM επαλήθευση. Δεν υπάρχει συσχετισμένη δημόσια παρουσία στο GitHub.
- Πεδίο αποθετηρίου. The πακέτο.json δεν φέρει Αποθήκη πεδίο. Το νόμιμο npm:@juggle/resize-observer σημεία σε ένα πραγματικό αποθετήριο GitHub με χιλιάδες αστέρια και ενεργά προβλήματα. Η απουσία συνδέσμου αποθετηρίου είναι η ταχύτερη οπτική ένδειξη στο περιβάλλον χρήστη npm.
- Λογοκλοπή README. Το πακέτο README είναι το νόμιμο @juggle/resize-observer README byte-προς-byte, συμπεριλαμβανομένου εισαγωγή παραδείγματα που αναφέρονται @juggle/resize-observer το ίδιο (όχι το πακέτο δημοσίευσης). Ο χειριστής δεν μπήκε καν στον κόπο να ξαναγράψει τις εισαγωγές — ένα συνηθισμένο σήμα ότι το readme είχε αρθεί, όχι είχε προσαρμοστεί.
- Δεν υπάρχουν υποδομές για να στραφούμε. Δεν υπάρχει τελικό σημείο C2, δεν υπάρχει αναζήτηση DNS, δεν υπάρχει IP. Η κακόβουλη συμπεριφορά είναι πλήρως ενθυλακωμένη στον τοπικό clipper συν το πακέτο πορτοφολιών με σκληρό κώδικα. Αυτό καθιστά μη διαθέσιμη την περιστροφή που βασίζεται σε domain ή ASN. Οι defender που περιστρέφονται μεταξύ καμπανιών θα πρέπει να αντιστοιχίζουν τα πορτοφόλια με οποιοδήποτε προηγούμενο clipper έχουν στο αρχείο τους. Η επαναχρησιμοποίηση ενός πορτοφολιού σε όλα τα πακέτα είναι ο πιο εύκολος σύνδεσμος μεταξύ καμπανιών.
- Επιλογή ονομασίας. @jaggle/resizeobserves είναι ένας χαρακτήρας μακριά από @ταχυδακτυλουργία και μια παρέκκλιση από το γνωστό αλλαγή μεγέθους-παρατηρητήΗ συνδυασμένη απόσταση επεξεργασίας είναι δύο σύμβολα. Πρόκειται για μια σκόπιμη οπτική σύγκρουση, όχι για ένα γενικό κάθισμα.
Κίνητρο, βασισμένο στη συμπεριφορά του ωφέλιμου φορτίου: καθαρή δημιουργία εσόδων μέσω ευκαιριακής αντικατάστασης από το πρόχειρο. Δεν υπάρχει συλλογή διαπιστευτηρίων, ούτε δακτυλικό αποτύπωμα κεντρικού υπολογιστή, ούτε ανάγνωση μεταβλητής περιβάλλοντος. Ο χειριστής δεν ενδιαφέρεται ποιο είναι το θύμα — τον ενδιαφέρει η επόμενη μεταφορά του θύματος να βρίσκεται σε μία από τις καταχωρημένες διευθύνσεις. Η κάλυψη των σαράντα αλυσίδων είναι το μοντέλο της λοταρίας σε δράση: ευρεία κάλυψη, ελπίδα ότι μια ενιαία επικόλληση υψηλής αξίας θα προσγειωθεί μία φορά ανά N εγκαταστάσεις.
Ο χειριστής φαίνεται να μην ενδιαφέρεται για την κατάργηση. Η δημοσίευση εννέα εκδόσεων μέσα σε δύο ώρες στο ίδιο πεδίο εφαρμογής μοιάζει με μια λαβή δημοσίευσης και εγγραφής: μεγιστοποιήστε το αποτύπωμα μητρώου πριν προλάβει η καθυστέρηση κατάργησης και, στη συνέχεια, προχωρήστε. Δεν έχουμε παρατηρήσει @jaggle αναδημοσίευση με νέο πεδίο εφαρμογής κατά τη στιγμή της συγγραφής, αλλά θα αναμέναμε παρόμοια πεδία εφαρμογής (@jaggie, @ταχυδακτυλουργία-, @σκούντημα) θα εμφανιστεί τις επόμενες ημέρες εάν ο χειριστής είναι ακόμα ενεργός.
Αντίκτυπος, τάσεις και τι πρέπει να κάνουν οι υπερασπιστές
Επίπτωση
Η ποσοτικοποίηση της επίδρασης σε πραγματικά χρήματα δεν είναι δυνατή από το τρέχον σύνολο δεδομένων. Το clipper δεν καταγράφει τηλεμετρία και τα πορτοφόλια δεν έχουν ακόμη παρατηρηθεί να λαμβάνουν υποκατασταθείσες μεταφορές από την ημερομηνία αποκοπής της ανάλυσης (μια σάρωση παρακολούθησης των αλυσίδων που αναφέρονται υπάρχει στη λίστα μας). npm:@juggle/resize-observer έχει μέσο όρο επταψήφιες εβδομαδιαίες λήψεις — ένας στόχος typosquat με υψηλή επισκεψιμότητα — και το κακόβουλο πακέτο ήταν ενεργό για λιγότερο από 24 ώρες κατά τη στιγμή της αποκάλυψης, γεγονός που περιορίζει τον πληθυσμό που εκτέθηκε αλλά δεν τον μηδενίζει.
Η ακτίνα έκρηξης που αξίζει να παρακολουθείται δεν είναι άμεσες λήψεις @jaggle/resizeobserves — αυτά είναι πιθανώς μικρά. Είναι **μεταβατικές εγκαταστάσεις**: ένας προγραμματιστής που προσθέτει το πακέτο σε ένα έργο sandbox, εκτελώντας npm installκαι στη συνέχεια ξεχνώντας ότι το άγκιστρο εγκατάστασης εκτελέστηκε ποτέ. Κάθε μηχάνημα που επεξεργάστηκε την εγκατάσταση μετά την εγκατάσταση έχει πλέον έναν αεροπειρατή πρόχειρου ανά χρήστη κατά την αυτόματη εκκίνηση, ανεξάρτητα από το αν το έργο βρίσκεται ακόμα στο δίσκο. Αφαίρεση του καταλόγου πακέτων από node_modules **δεν** καταργεί την επιμονή.
Αναδυόμενα μοτίβα
Δύο τάσεις αποτελούν χαρακτηριστικό παράδειγμα αυτής της καμπάνιας.
npm ως περιτύλιγμα παράδοσης ωφέλιμου φορτίου Python. Το tarball npm είναι ένα πρόγραμμα εγκατάστασης 4 γραμμών. Το πραγματικό πρόγραμμα κλοπής είναι η Python, εγκατεστημένη σε όλο το σύστημα από κουκούτσι από τον κατάλογο που περιλαμβάνεται. Αυτό δεν είναι κάτι καινούργιο — έχουμε δει πακέτα npm να εγκαταλείπουν την Python στο παρελθόν — αλλά γίνεται ένα μετρήσιμα πιο συνηθισμένο σχήμα σε όλες τις καμπάνιες crypto-clipper. Το πλεονέκτημα για τον χειριστή είναι διπλό: Βιβλιοθήκες πρόχειρου Python (pyperclip πρώτο μεταξύ αυτών) είναι πιο καθαρά και πιο cross-platform από τα αντίστοιχα JavaScript, και Οι περισσότεροι αυτοματοποιημένοι σαρωτές npm επιβαρύνουν σημαντικά τα αρχεία JavaScript και η Python .py δέματα ελαφρά. Το κόστος είναι ότι το αποτύπωμα εγκατάστασης είναι πολύ πιο θορυβώδες — ένα φρέσκο εγκατάσταση pip είναι δύσκολο να κρυφτεί σε έναν υπολογιστή προγραμματιστή που κανονικά δεν το κάνει εγκατάσταση pip κατά τη διάρκεια npm install.
Τα ονόματα που είναι εγγενή στην πλατφόρμα είναι η μόνη μυστικότητα. Αρκετά πρόσφατα προγράμματα clipper και small-payload stealers έχουν εγκαταλείψει πλήρως την απόκρυψη σε επίπεδο κώδικα υπέρ ετικετών persistence που μοιάζουν νόμιμες. βοηθός-dbus-python3, com.apple.python.runtimeκαι PyRuntimeBroker είναι παραδείγματα σχολικών βιβλίων — ονόματα που ένα μάτι του αμυνόμενου θα παραλείψει σε μια λίστα σαράντα υπηρεσιών χρηστών. Αυτή είναι μια φθηνή, ανθεκτική μορφή μυστικότητας: η κατάργηση γίνεται ανά πακέτο, αλλά τα αρχεία persistence επιβιώνουν της κατάργησης και μια υπηρεσία που ονομάζεται από ένα στοιχείο πλατφόρμας που φαίνεται ρεαλιστικό δεν θα καθαριστεί με τίποτα άλλο παρά με έναν σαφή έλεγχο.
Τι πρέπει να κάνουν οι αμυντικοί
- Έλεγχος ~/.config/systemd/user/, ~/Library/LaunchAgents/ και Get-ScheduledTask παραγωγή σε μηχανήματα προγραμματιστών για τις καταχωρήσεις που αναφέρονται στα IOC. Η αφαίρεση του πακέτου npm τις αφήνει στη θέση τους. Πρέπει να αφαιρεθούν χειροκίνητα.
- Αποκλεισμός μεταφορών στις καταχωρημένες διευθύνσεις πορτοφολιού στα όρια εταιρικού ταμείου και πορτοφολιού DeFi όπου είναι διαθέσιμη η καταχώριση επιτρεπόμενων διευθύνσεων.
- Αναζήτηση για ~/.config/clipboard-guardian/config.json (και ισοδύναμα πλατφόρμας) σε όλο τον στόλο προγραμματιστών-μηχανών. Η παρουσία του αρχείου είναι μόλυνση υψηλής αξιοπιστίας ανεξάρτητα από την έκδοση πακέτου που το παρέδωσε.
- Αναζήτηση node_modules/ για clipboard_guardian/guardian.py σε στιγμιότυπα build-cache που ενδέχεται να προηγούνται της κατάργησης. Το md5 του αρχείου είναι σταθερό σε όλες τις αναθεωρημένες εκδόσεις.
- Κλείδωμα αρχείου-pin @juggle/resize-observer (το νόμιμο πακέτο) έτσι ώστε οι μελλοντικές εγκαταστάσεις να μην μπορούν να επιλύσουν οτιδήποτε άλλο με λάθος τύπο ενός χαρακτήρα, ειδικά σε ροές εργασίας χωρίς lockfile όπως npx.
- Αντιμετώπιση οποιασδήποτε npm μετά την εγκατάσταση που καλεί την εγκατάσταση pip ως υψηλής σοβαρότητας σε κατασκευή-pipeline πολιτική. Δεν υπάρχει κανένας νόμιμος λόγος για να χρειάζεται ένα πακέτο npm pip κατά την εγκατάσταση — τα εργαλεία Python διανέμουν τα εργαλεία Python.
- Αναζήτηση δεδομένων παρακολούθησης process_iter()-comparable για διεργασίες με όνομα python3-dbus-helper που εισάγουν pyperclip — η αναντιστοιχία μεταμφίεσης (βοηθός D-Bus που περιέχει μια βιβλιοθήκη πρόχειρου) είναι ο καθαρότερος δείκτης συμπεριφοράς που έχουμε.
- Εναλλαγή διευθύνσεων πορτοφολιών που έχουν επικολληθεί από μολυσμένα μηχανήματα. Ένας αεροπειρατής πρόχειρου παραβιάζει τη διαδρομή μεταξύ ενός περιβάλλοντος εργασίας χρήστη πορτοφολιού και ενός στόχου επικόλλησης. Οι διευθύνσεις που αντιγράφονται ενώ είναι μολυσμένες ενδέχεται να τροποποιηθούν σιωπηλά. Οτιδήποτε αποστέλλεται κατά τη διάρκεια του παραθύρου μόλυνσης θα πρέπει να αντιμετωπίζεται ως πιθανώς παραπλανητικό.
Συμπέρασμα: η επιμονή διαρκεί περισσότερο από την κατάργηση. Το μητρώο τελικά θα καταργήσει @jaggle/resizeobserves και στις εννέα εκδόσεις, η μονάδα systemd, το LaunchAgent και η προγραμματισμένη εργασία δεν θα καταργηθούν μόνα τους.
Αναφορές
- @juggle/resize-observer στο npm — το νόμιμο πακέτο που υποδύεται αυτό το typosquat· χρήσιμο ως βάση για την λογοκλοπή README byte-for-byte.
- Μεταδεδομένα μητρώου @jaggle/resizeobserves — δημοσίευση χρονικών σημάνσεων για τις εννέα κακόβουλες εκδόσεις, χρήσιμες για την χρονογραμμή της εγκληματολογικής έρευνας.





