Εγκατάσταση Ectoplasm npm Hooks Που Κλέβουν Διαπιστευτήρια AWS

Εκτόπλασμα: εγκατάσταση npm hooks που συλλέγουν διαπιστευτήρια AWS πίσω από μια ενεργοποίηση μόνο για κοντέινερ

TL? DR

Μια συστάδα από πέντε πακέτα npm, δημοσιεύτηκε σε δύο δείκτες λογαριασμού, έστειλε ένα postinstall γάντζο που διαβάζει τα διαπιστευτήρια cloud από τον κεντρικό υπολογιστή και τα αποστέλλει εκτός συσκευασίας. Τα πακέτα φέρουν ονόματα ghost-and-pirate — coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — και σειριοποιούν ό,τι συλλέγουν σε ένα ψεύτικο ecto_module: YAML manifest πριν από τη μετάδοσή του. Παρακολουθούμε το cluster ως εκτόπλασμα.

Το ωφέλιμο φορτίο εκτελείται μόνο όταν ανιχνεύει ένα συγκεκριμένο περιβάλλον: έναν κεντρικό υπολογιστή του οποίου το όνομα είναι δεκαεξαδική συμβολοσειρά 12 χαρακτήρων και έναν κατάλογο εργασίας κάτω από /app/node_modules — το σχήμα μιας κατασκευής σε κοντέινερ ή ενός εργάτη CI. Όταν περάσει αυτή η πύλη, το γάντζο ρωτά το Υπηρεσία μεταδεδομένων στιγμιότυπων AWS (IMDSv2) για τα διαπιστευτήρια ρόλου IAM, απαριθμεί Διευθυντής μυστικών AWS σε τρεις περιοχές, αποτυπώνει μεταβλητές περιβάλλοντος, διαβάζει αρχεία κάτω από /appκαι αναζητά συμβολοσειρές καταγραφής της σημαίας. Στη συνέχεια, εξάγει το αποτέλεσμα με δύο τρόπους: από ένα beacon σε ένα webhook.site συλλέκτη και ένα μανιφέστο PUT σε ένα τελικό σημείο raw-IP, με μια λίστα εφεδρικών ρυθμίσεων localhost-first.

Οι μεταγενέστερες περιγραφές των πακέτων έγραφαν "CTF payload for verdaccio supply-chain testing". Αναφέρουμε αυτήν την αυτοπεριγραφή ως παρατηρήσιμο γεγονός. Η ίδια η συμπεριφορά - ζωντανή έξοδος σε δημόσια IP, πραγματικές αναγνώσεις διαπιστευτηρίων IMDS, πραγματικές κλήσεις του Secrets Manager - είναι αυτό που είναι ανεξάρτητα από την ετικέτα και είναι ο λόγος που αυτές οι εκδόσεις χαρακτηρίστηκαν κακόβουλες.

Ένα όνομα στο σύμπλεγμα, coral-wraith, δεν σταμάτησε σε μία μόνο κυκλοφορία. Αναδημοσιεύτηκε γρήγορα σε δεκάδες εκδόσεις μέσα σε λίγες ώρες — 1.0.0 αναρρίχηση σε 6.0.0 — και μια προηγούμενη σειρά με το ίδιο όνομα είχε χρησιμοποιήσει φουσκωμένα 9999.0.x αριθμοί έκδοσης, το κλασικό σχήμα ενός προσπάθεια σύγχυσης εξάρτησηςΣε όλη αυτή την ανακύκλωση, το ωφέλιμο φορτίο ωρίμασε ορατά: από ένα μοναδικό beacon απαρίθμησης κεντρικού υπολογιστή σε έναν πλήρη άξονα διαπιστευτηρίων AWS, τυλιγμένο σε ελέγχους περιβάλλοντος που το διατηρούν ήσυχο εκτός του προβλεπόμενου στόχου του.

Πακέτα 5 ονόματα; coral-wraith μόνο αναδημοσιευμένο σε δεκάδες εκδόσεις
Οικοσύστημα npm
Εγκατάσταση διανύσματος postinstall σενάριο κύκλου ζωής
Πρωταρχικός στόχος Διαπιστευτήρια ρόλου AWS IAM + Μυστικές τιμές του Secrets Manager, μεταβλητές περιβάλλοντος, /app αρχεία
Εξφίλ webhook.site φάρος + raw-IP C2 PUT
Πύλη ενεργοποίησης Όνομα κεντρικού υπολογιστή 12-δεκαεξαδικού + /app/node_modules cwd, καθώς και ένας έλεγχος περιβάλλοντος που καταστέλλει το ωφέλιμο φορτίο εκτός αυτού του πλαισίου
Δριμύτητα ψηλά — διαπιστευτήρια cloud και αποκάλυψη διαχειριζόμενου μυστικού από περιβάλλοντα κατασκευής και εκτέλεσης σε κοντέινερ

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

Κάθε πακέτο στο σύμπλεγμα είναι κατασκευασμένο με τον ίδιο τρόπο: ένα σχεδόν άδειο index.js (module.exports = {}), μια γραμμή πακέτο.json σενάριο — «postinstall»: «κόμβος postinstall.js» — και το ωφέλιμο φορτίο στο postinstall.jsΗ εγκατάσταση του πακέτου είναι αρκετή για να εκτελεστεί το hook. Δεν απαιτείται εισαγωγή ή κλήση.

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

function isAppWorker():   host = os.hostname()   if host does NOT match /^[0-9a-f]{12}$/  -> exit   if cwd does NOT contain "/app/node_modules" -> exit   if cwd contains "/tmp/npm-safe"            -> exit   otherwise -> proceed

Ένα όνομα κεντρικού υπολογιστή 12-hex είναι το προεπιλεγμένο σχήμα που το Docker αντιστοιχίζει σε ένα κοντέινερ και /app/node_modules είναι μια συμβατική διαδρομή εγκατάστασης εντός κοντέινερ. Η τρίτη ρήτρα διακόπτεται εάν η διαδρομή μοιάζει με κατάλογο εξαγωγής σε περιβάλλον δοκιμών (sandbox). Το τελικό αποτέλεσμα είναι ότι το ωφέλιμο φορτίο παραμένει αδρανές σε έναν φορητό υπολογιστή προγραμματιστή ή σε ένα περιβάλλον δοκιμών ανάλυσης και ενεργοποιείται μόνο μέσα σε έναν build ή runtime worker σε περιβάλλον κοντέινερ — το είδος του περιβάλλοντος που είναι πιθανότερο να μεταφέρει διαπιστευτήρια live cloud. Το παλαιότερο πακέτο στο σύμπλεγμα, κοραλλιογενές φάντασμα, δεν έχει τέτοια πύλη και εκτελεί την (απλούστερη) συλλογή του άνευ όρων.

ΣυλλογήΌταν η πύλη περάσει, το άγκιστρο βγαίνει έξω execFileSync("/bin/sh", ["-c", …]) και εκτελεί μια ενιαία σύνθετη εντολή που, με τη σειρά:

1. PUT /latest/api/token to 169.254.169.254          (IMDSv2 token request) 2. GET .../iam/security-credentials/                  (IAM role name) 3. GET .../iam/security-credentials/<role>            (temporary credentials) 4. dump env | sort                                    (environment variables) 5. list /app (excl. node_modules) + cat first 15      (application files) 6. aws secretsmanager list-secrets                    (us-east-1, eu-west-1, eu-central-1) 7. scrape readable files for HTB{...}                 (capture-the-flag strings)

Τα βήματα 1–3 είναι μια ανάκτηση IMDSv2 εγχειριδίου: ζητήστε ένα διακριτικό συνεδρίας και, στη συνέχεια, επισυνάψτε το ως X-aws-ec2-μεταδεδομένα-token κεφαλίδα για την ανάκτηση του ρόλου IAM της παρουσίας και των προσωρινών κλειδιών πρόσβασης αυτού του ρόλου. Η επιλογή υλοποίησης του IMDSv2 αντί του απλούστερου μη εξουσιοδοτημένου IMDSv1 ΠΑΡΤΕ Αξίζει να σημειωθεί ότι το ωφέλιμο φορτίο λειτουργεί ακόμη και σε παρουσίες που έχουν ρυθμιστεί ώστε να απαιτούν πρόσβαση μεταδεδομένων βάσει διακριτικών, η οποία είναι η συνιστώμενη από την AWS ενίσχυση. Τα διαπιστευτήρια που επιστρέφονται από το βήμα 3 είναι βραχύβια. AccessKeyId/SecretAccessKey/Ένδειξη τριπλασιάζει το πεδίο εφαρμογής του ρόλου της παρουσίας. Ό,τι μπορεί να κάνει αυτός ο ρόλος, ο κάτοχος αυτών των κλειδιών μπορεί να κάνει για όλη τη διάρκεια ζωής της πιστοποίησης.

Τα βήματα 4–6 διευρύνουν την εμβέλεια. env Η dump καταγράφει οτιδήποτε κληρονόμησε η διαδικασία δημιουργίας ή εκτέλεσης — στην πράξη, εδώ βρίσκονται συνήθως τα διακριτικά μητρώου, οι συμβολοσειρές σύνδεσης βάσης δεδομένων και τα κλειδιά API. / εφαρμογή Το file walk διαβάζει έως και δεκαπέντε αρχεία εφαρμογής εκτός node_modules, η οποία μπορεί να επιφανειακή διαμόρφωση, .env αρχεία ή πηγή. Κλήσεις βήματος 6 λίστα-μυστικών του aws secretsmanager σε τρεις περιοχές· τα διαπιστευτήρια που ανακτώνται στα βήματα 1–3 είναι ακριβώς αυτά που επαληθεύουν αυτές τις κλήσεις, έτσι ώστε η ανάγνωση IMDS και η αλυσίδα απαρίθμησης του Secrets Manager να ενώνονται σε μια ενιαία κλιμάκωση: ρόλος παρουσίας → διαχειριζόμενο απόρρητο απόθεμα. Το βήμα 7 είναι μια αναφορά στο πλαίσιο capture-the-flag — όταν ένα HTB{…} Εάν βρεθεί η σημαία, αποστέλλεται μόνη της, διαφορετικά η ακατέργαστη συλλεγμένη κηλίδα τεμαχίζεται σε τέσσερα κομμάτια και αποστέλλεται.

Οι νεότερες εκδόσεις στο σύμπλεγμα προωθούν την κλιμάκωση περαιτέρω. Αντί να σταματήσουν σε ένα απόθεμα, αναλύουν την απόκριση IMDS, εξάγουν τα προσωρινά κλειδιά ως AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN μεταβλητές περιβάλλοντος, επιβεβαιώστε την ταυτότητα με aws sts get-caller-identityκαι στη συνέχεια επαναλαμβάνω κάθε μυστικό που επιστρέφεται από λίστα-μυστικών κλήση aws secretsmanager get-secret-value σε κάθε μία — ανακτώντας το μυστικό περιεχόμενο, όχι μόνο τα ονόματά τους. Οι ίδιες εκδόσεις διαβάζουν επίσης δυαδικά αρχεία σημαιών με υποκατάσταση διεργασίας (/readflag και φίλοι) και να προσπαθήσετε ένα λειτουργία φόρτισης ενάντια σε οποιοδήποτε έργο Rust που βρέθηκε κάτω από / εφαρμογή, διευρύνοντας τη συλλογή πέρα ​​από τα διαπιστευτήρια cloud σε οτιδήποτε εκθέτει το περιβάλλον δημιουργίας.

Αυτές οι νεότερες εκδόσεις ελέγχονται επίσης πιο επιθετικά. Εκτός από το όνομα κεντρικού υπολογιστή 12-hex και /app/node_modules Κατά τη διάρκεια των ελέγχων, το ωφέλιμο φορτίο επιθεωρεί την ενεργή διαμόρφωση του μητρώου πακέτων και τη διαδρομή του καταλόγου εργασίας και τερματίζεται σιωπηλά όταν υποδεικνύουν ανάλυση ή κατοπτρικό περιβάλλον αντί για έναν ενεργό στόχο. Το συνδυασμένο αποτέλεσμα είναι ένα ωφέλιμο φορτίο που δεν κάνει τίποτα παρατηρήσιμο στα περισσότερα περιβάλλοντα επιθεώρησης και εκτελεί την πλήρη συλλογή του μόνο όταν κρίνει ότι βρίσκεται σε έναν γνήσιο κεντρικό υπολογιστή με κοντέινερ.

εκδιήθησηςΤα συλλεγόμενα δεδομένα αφήνουν τον κεντρικό υπολογιστή σε δύο κανάλια. Πρώτον, ένα beacon ΜΕΤΑ σε ένα σταθερό webhook.site συλλέκτη, που φέρει το όνομα κεντρικού υπολογιστή, το αριθμητικό UID, τον κατάλογο εργασίας και έως 120 KB συλλεγμένων δεδομένων. Δεύτερον, τα δεδομένα διπλώνονται σε ένα ψεύτικο "μανιφέστο ενότητας" YAML και ΒΆΖΩ προς την /api/μονάδες/ σε έναν διακομιστή προορισμού:

ecto_module:   name: "<flag-or-chunk-0>"   version: "1.0.0"   power_level: "<chunk-1>"   ship_deck: "<chunk-2>"   cargo_hold: "<chunk-3>"

Τα ονόματα των πεδίων μανιφέστο (επίπεδο_ισχύος, κατάστρωμα_πλοίου, φορτίο_χώρου) είναι διακόσμηση — τα κλεμμένα δεδομένα περιέχονται στις τιμές συμβολοσειρών, γι' αυτό και μια οθόνη δικτύου βλέπει κάτι που μοιάζει με μια καλοήθη μεταφόρτωση μανιφέστου μητρώου πακέτων και όχι με μια προφανή απόρριψη δεδομένων. Το κανάλι beacon μεταφέρει περισσότερα: το ΜΕΤΑ σώμα σε webhook.site περιλαμβάνει το όνομα κεντρικού υπολογιστή, το αριθμητικό UID, τον κατάλογο εργασίας και έως και 120 KB του συλλεγμένου blob, επομένως ακόμη και ένα μόνο επιτυχημένο beacon παρέχει την πλήρη εικόνα. webhook.site είναι μια δωρεάν υπηρεσία επιθεώρησης αιτημάτων. Η χρήση της ως συλλέκτη σημαίνει ότι ο χειριστής δεν χρειάζεται ποτέ να αναλάβει τη λήψη της δικής του υποδομής για αυτό το κανάλι και τα καταγεγραμμένα αιτήματα παραμένουν στον κάδο απορριμμάτων της υπηρεσίας.

Το μανιφέστο ΒΆΖΩ περπατάει σε μια εφεδρική λίστα που ξεκινά με πολλά 127.0.0.1/localhost θύρες και στη συνέχεια καταλήγει σε τρεις δημόσιες διευθύνσεις στο `154.57.164.0/24` εύρος, σταματώντας στο πρώτο τελικό σημείο που απαντά με κατάσταση 2xx. Η σειρά localhost-first είναι σύμφωνη με την αυτοπεριγραφή "verdaccio testing" (ένα τοπικό μητρώο σε loopback), αλλά οι εφεδρικές δημόσιες διευθύνσεις IP σημαίνουν ότι τα δεδομένα εγκαταλείπουν τον κεντρικό υπολογιστή κάθε φορά που το loopback δεν ακούει — δηλαδή, σε οποιοδήποτε μηχάνημα που δεν είναι το δικό του σύστημα δοκιμών του δημιουργού.

Χρονολόγιο

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

Στάδιο Πακέτα / Εκδόσεις Συμπεριφορά
Πρώιμο τρέξιμο coral-wraith 9999.0.x Διογκωμένοι αριθμοί έκδοσης που συνάδουν με μια προσπάθεια σύγχυσης εξαρτήσεων. απαρίθμηση κατά τον χρόνο εγκατάστασης και exfil.
Σπόρος coral-wraith 1.0.0 Η μετα-εγκατάσταση συλλέγει αρχεία id/env/flag· ένα μόνο PUT σε 154[.]57[.]164[.]71:30782, δείκτης ECT-472839
Ταχεία επανάληψη coral-wraith 1.0.1 → 6.0.0 Δεκάδες κυκλοφορίες σε ώρες. Το ωφέλιμο φορτίο κερδίζει isAppWorker() πύλη, λήψη πιστοποιητικών IMDSv2, το πλήρες get-secret-value pivot, ο έλεγχος περιβάλλοντος μητρώου/διαδρομής και οι δείκτες διπλής σύνδεσης
Παράλληλα ονόματα ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 Ίδιο ωφέλιμο φορτίο με πύλη. webhook.site λίστα εφεδρικών beacon και πολλαπλών τελικών σημείων
παραλλαγές ecto-rust-read-f3a9c1 1.0.1–1.0.2 Προσθέτει επιπλέον δείκτες νεροχύτη ECT-987654, ECT-654321, ECT-839201
παραλλαγές ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 Ίδιο ωφέλιμο φορτίο με πύλη, ίδιο C2 και φάρος

Το καθοριστικό χαρακτηριστικό του cluster είναι ο ρυθμός δημοσίευσης: αντί για ένα πακέτο και μία έκδοση, το ίδιο όνομα αναδημοσιεύεται ξανά και ξανά σε γρήγορη διαδοχή, με το καθένα να κυκλοφορεί μια μικρή παραλλαγή του προηγούμενου, μαζί με μια χούφτα αδελφών με διαφορετικά ονόματα που φέρουν το ίδιο ωφέλιμο φορτίο. ψίθυρος οικογένεια ο κώδικας χωρίζεται σε δύο κοντινά δακτυλικά αποτυπώματα — ένα σύνολο ενεργοποιεί δύο κρίσιμες ανιχνεύσεις, ένα άλλο τρεις (ένα επιπλέον sink ανάγνωσης αρχείου) — αλλά και τα δύο επιλύονται στο ίδιο ωφέλιμο φορτίο. η διαφορά είναι η μετατόπιση κώδικα, όχι μια διακλάδωση συμπεριφοράς. Εκδόσεις του ψίθυρος πέραν του αναλυμένου εύρους (έως τουλάχιστον 1.0.25 κατά τη στιγμή της σύνταξης) παρατηρήθηκαν ζωντανά στο μητρώο και το κοραλλιογενές φάντασμα Το όνομα συνέχισε να ανεβαίνει τη δική του σκάλα εκδοχής πάνω από το ίδιο παράθυρο.

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

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

Δίκτυο

Δείκτης Ρόλος
hxxp://154[.]57[.]164[.]71:30782 Στόχος C2 PUT (coral-wraith)
hxxp://154[.]57[.]164[.]80:30543 Εφεδρικό C2 PUT (ecto-*)
hxxp://154[.]57[.]164[.]82:31250 Εφεδρικό C2 PUT (ecto-*)
hxxp://154[.]57[.]164[.]71:31289 Εφεδρικό C2 PUT (ecto-*)
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 Συλλέκτης φάρων
169[.]254[.]169[.]254/latest/... Ανάγνωση διαπιστευτηρίων IMDSv2 (πλευρά προορισμού, μεταδεδομένα AWS)

Συμπεριφορικό/αρχείο

Δείκτης Ρόλος
"postinstall": "node postinstall.js" Εγκατάσταση διανύσματος
ecto_module: YAML με power_level / ship_deck / cargo_hold πλήκτρα Σχήμα μανιφέστο Exfil
Δείκτες νεροχύτη ECT-472839, ECT-987654, ECT-654321, ECT-839201 Τμήμα διαδρομής C2 /api/modules/<marker>
isAppWorker() πύλη: οικοδεσπότης /^[0-9a-f]{12}$/, το cwd περιέχει /app/node_modules Συνθήκη ενεργοποίησης
aws secretsmanager list-secrets επί us-east-1, eu-west-1, eu-central-1 Καταμέτρηση μυστικών
HTB{...} απόξεση regex Συγκομιδή κατάκτησης της σημαίας

Κατακερματισμοί αρχείων (sha256, καταγράφηκαν κατά την ανάλυση)

Αρχεία sha256
coral-wraith/postinstall.js ce5ff035cfdfed1d0015446424b352c27b66bcb77e9fdb0a51e4245199146824
ecto-corsair-whisper-6f3b9 1.0.18/postinstall.js b58432acba376aa6976f0490d9a1c04257ccdbc856d8390260c50322d63e31c3

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

Τα πέντε ονόματα πακέτων δημοσιεύθηκαν με δύο διαχειριστές λογαριασμών npm, αλλά μοιράζονται αρκετή υποδομή για να τα αντιμετωπίζουν ως ένα σύμπλεγμα: το ίδιο ecto_module δηλωτικό σχήμα, το ίδιο ECT-472839 κύριος δείκτης νεροχύτη, ο ίδιος webhook.site αναγνωριστικό συλλέκτη και τελικά σημεία C2 στο ίδιο 154.57.164.0/24` μπλοκ. Το πακέτο σπόρων (`coral-wraith, απλούστερο και χωρίς περιορισμούς) και η περιφραγμένη εκτο-οικογένεια ερμηνεύεται επομένως ως επαναλήψεις σε ένα σύνολο εργαλείων και όχι ως ανεξάρτητες προσπάθειες.

Τα πακέτα περιγράφονται, σε νεότερες εκδόσεις, ως «Ωφέλιμο φορτίο CTF για δοκιμές αλυσίδας εφοδιασμού verdaccio.» Εμφανίζουμε αυτήν την ετικέτα ως ένα παρατηρήσιμο γεγονός και δεν την επαναδιατυπώνουμε ως εύρημα σχετικά με τον σκοπό. Αυτό που κάνει ο κώδικας είναι σαφές και ανεξάρτητο από τον τρόπο με τον οποίο επισημαίνεται: διαβάζει τα διαπιστευτήρια ρόλου IAM από την υπηρεσία μεταδεδομένων στιγμιότυπου, απαριθμεί τα διαχειριζόμενα μυστικά σε τρεις περιοχές AWS και μεταδίδει τα αποτελέσματα σε μια δημόσια IP και έναν συλλέκτη webhook τρίτου μέρους. Μια πραγματικά ολοκληρωμένη λύση δοκιμής μόνο για loopback δεν θα χρειαζόταν την εφεδρική λίστα δημόσιας IP, τις αναγνώσεις διαπιστευτηρίων IMDS ή τις κλήσεις του Secrets Manager μεταξύ περιοχών. Επειδή η εμβέλεια εξόδου και διαπιστευτηρίων είναι πραγματική, οι εκδόσεις με πύλη ταξινομήθηκαν ως κακόβουλες.

Η πύλη μόνο για κοντέινερ είναι το πιο αξιοσημείωτο λειτουργικό χαρακτηριστικό. Είναι τόσο ένα μέτρο αποφυγής — η σιωπή σε φορητούς υπολογιστές και σε sandbox ανάλυσης — όσο και ένα μέτρο στόχευσης, ενεργοποιείται μόνο όπου είναι πιο πιθανό να υπάρχει ένας πραγματικός ρόλος IAM και ενεργά μυστικά. Οι αναλυτές που εκτελούν αυτά τα πακέτα σε ένα γενικό sandbox δεν θα παρατηρούσαν τίποτα. Η συμπεριφορά εκδηλώνεται μόνο κάτω από ένα όνομα κεντρικού υπολογιστή τύπου Docker και μια διαδρομή εγκατάστασης εντός κοντέινερ.

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

Η έκθεση εδώ είναι τα διαπιστευτήρια cloud και η μυστική αποκάλυψη μέσα σε κοντέινερ build και runtime. Ένα διαπιστευτήριο ρόλου IAM που αντλείται από το IMDS φέρει όποια δικαιώματα κατέχει αυτός ο ρόλος. διαχειριστής μυστικών:ListSecrets (και οποιαδήποτε επακόλουθη GetSecretValue) διευρύνει αυτό το πεδίο στα αποθηκευμένα μυστικά εφαρμογών. Τα dumps μεταβλητών περιβάλλοντος συχνά φέρουν διακριτικά μητρώου, διευθύνσεις URL βάσεων δεδομένων και κλειδιά API. Σε ένα περιβάλλον CI ή κοντέινερ — ακριβώς αυτό που επιλέγει η πύλη — μια μόνο μεταβατική εγκατάσταση ενός από αυτά τα πακέτα είναι αρκετή για να διαρρεύσει αυτό το υλικό.

Το Ectoplasm ακολουθεί ένα μοτίβο που συνεχίζουμε να βλέπουμε: φορτία εγκατάστασης που αναζητούν μεταδεδομένα cloud και διαχειριζόμενα μυστικά αντί για τοπικά αρχεία και ενεργοποιούνται μόνο σε περιβάλλοντα υψηλής αξίας. Ακολουθούν δύο αμυντικές παρατηρήσεις.

  • Το σχήμα είναι ανιχνεύσιμοΈνα άγκιστρο εγκατάστασης npm/PyPI του οποίου το γράφημα κλήσης φτάνει τόσο σε ένα API μυστικών cloud (διαχειριστής μυστικών AWS, μυστικά του gcloud, az keyvault) ή η διεύθυνση IMDS και μια δικτυακή δεξαμενή εξόδου είναι ένα στενό, υψηλό σήμα μοτίβο — σχεδόν ποτέ δεν εμφανίζεται σε ένα νόμιμο σενάριο κύκλου ζωής. Στατική ανάλυση ροής μπορεί να το επισημάνει χωρίς να εξαρτάται από κάποιο συγκεκριμένο τομέα ή IP.
  • Η σκλήρυνση του περιβάλλοντος το αμβλύνει. Η επιβολή του IMDSv2 με όριο hop 1 εμποδίζει τα φόρτα εργασίας των κοντέινερ να φτάσουν στα μεταδεδομένα των στιγμιότυπων. Η ρύθμιση του εύρους των ρόλων IAM στα ελάχιστα δικαιώματα περιορίζει την ακτίνα blast οποιουδήποτε πιστοποιητικού που διαρρέει. Και η εκτέλεση εγκαταστάσεων με - Αγνοήστε τα σενάρια στο CI καταργεί εντελώς το διάνυσμα install-hook για πακέτα που δεν το χρειάζονται.

Για τους υπερασπιστές, οι πρακτικοί έλεγχοι είναι: ειδοποίηση για εξερχόμενες συνδέσεις από κοντέινερ build/CI σε δημόσιες διευθύνσεις IP που δεν περιλαμβάνονται στη λίστα επιτρεπόμενων κατά τη διάρκεια npm install; προσέξτε για πρόσβαση IMDS που προέρχεται από σενάρια κύκλου ζωής πακέτων και αντιμετωπίστε οποιοδήποτε άγκιστρο εγκατάστασης που καταλήγει σε ένα CLI cloud ως ύποπτο μέχρι να αποδειχθεί το αντίθετο.

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

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

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

με το Xygeni Product Suite