NodeJS - __proto__ & prototype Pollution
Αντικείμενα στο JavaScript
Τα αντικείμενα στο JavaScript είναι ουσιαστικά συλλογές ζευγών κλειδιών-τιμών, γνωστά ως ιδιότητες. Ένα αντικείμενο μπορεί να δημιουργηθεί χρησιμοποιώντας το Object.create
με null
ως όρισμα για να παράγει ένα κενό αντικείμενο. Αυτή η μέθοδος επιτρέπει τη δημιουργία ενός αντικειμένου χωρίς κληρονομημένες ιδιότητες.
Ένα κενό αντικείμενο είναι παρόμοιο με ένα κενό λεξικό, αναπαριστάται ως {}
.
Συναρτήσεις και Κλάσεις στο JavaScript
Στο JavaScript, οι κλάσεις και οι συναρτήσεις είναι στενά συνδεδεμένες, με τις συναρτήσεις συχνά να λειτουργούν ως κατασκευαστές για τις κλάσεις. Παρά την έλλειψη υποστήριξης των κλάσεων στη γλώσσα, οι κατασκευαστές μπορούν να προσομοιώσουν τη συμπεριφορά των κλάσεων.
Πρωτότυπα στο JavaScript
Το JavaScript επιτρέπει την τροποποίηση, προσθήκη ή διαγραφή των χαρακτηριστικών προτύπου κατά τη διάρκεια εκτέλεσης. Αυτή η ευελιξία επιτρέπει τη δυναμική επέκταση των λειτουργιών της κλάσης.
Συναρτήσεις όπως toString
και valueOf
μπορούν να τροποποιηθούν για να αλλάξουν τη συμπεριφορά τους, επιδεικνύοντας την προσαρμοστική φύση του συστήματος προτύπων του JavaScript.
Κληρονομιά
Στην προσανατολισμένη σε πρωτότυπα προγραμματιστική, τα χαρακτηριστικά/μέθοδοι κληρονομούνται από αντικείμενα από κλάσεις. Αυτές οι κλάσεις δημιουργούνται προσθέτοντας χαρακτηριστικά/μεθόδους είτε σε ένα παράδειγμα μιας άλλης κλάσης είτε σε ένα κενό αντικείμενο.
Να σημειωθεί ότι όταν προστίθεται ένα χαρακτηριστικό σε ένα αντικείμενο που λειτουργεί ως πρότυπο για άλλα αντικείμενα (όπως το myPersonObj
), τα κληρονομούντα αντικείμενα έχουν πρόσβαση σε αυτό το νέο χαρακτηριστικό. Ωστόσο, αυτό το χαρακτηριστικό δεν εμφανίζεται αυτόματα εκτός αν κληθεί ρητά.
Ρύπανση __proto__
Εξερεύνηση της Ρύπανσης του Προτύπου στο JavaScript
Τα αντικείμενα του JavaScript ορίζονται από ζεύγη κλειδιών-τιμών και κληρονομούν από το πρότυπο Αντικειμένου του JavaScript. Αυτό σημαίνει ότι η τροποποίηση του προτύπου Αντικειμένου μπορεί να επηρεάσει όλα τα αντικείμενα στο περιβάλλον.
Ας χρησιμοποιήσουμε ένα διαφορετικό παράδειγμα για να εξηγήσουμε:
Η πρόσβαση στο πρωτότυπο του Object είναι δυνατή μέσω:
Προσθέτοντας ιδιότητες στο πρότυπο του Object, κάθε αντικείμενο JavaScript θα κληρονομήσει αυτές τις νέες ιδιότητες:
Ρύπανση πρωτοτύπου
Για ένα σενάριο όπου η χρήση του __proto__
είναι περιορισμένη, η τροποποίηση του πρωτοτύπου μιας συνάρτησης είναι μια εναλλακτική λύση:
Αυτό επηρεάζει μόνο τα αντικείμενα που δημιουργήθηκαν από τον κατασκευαστή Vehicle
, δίνοντάς τους τις ιδιότητες beep
, hasWheels
, honk
και isElectric
.
Δύο μέθοδοι για να επηρεάσετε παγκοσμίως τα αντικείμενα JavaScript μέσω της μόλυνσης του πρωτοτύπου περιλαμβάνουν:
Μόλυνση του
Object.prototype
απευθείας:
Ρύπανση του πρωτοτύπου ενός κατασκευαστή για μια συχνά χρησιμοποιούμενη δομή:
Μετά από αυτές τις λειτουργίες, κάθε αντικείμενο JavaScript μπορεί να εκτελέσει τις μεθόδους goodbye
και greet
.
Ρύπανση άλλων αντικειμένων
Από έναν τύπο στο Object.prototype
Σε ένα σενάριο όπου μπορείτε να ρυπάνε ένα συγκεκριμένο αντικείμενο και χρειάζεστε να φτάσετε στο Object.prototype
μπορείτε να το αναζητήσετε με κάτι παρόμοιο με τον παρακάτω κώδικα:
Ρύπανση στοιχείων πίνακα
Σημειώστε ότι καθώς μπορείτε να ρυπάνετε τα χαρακτηριστικά των αντικειμένων στο JS, αν έχετε πρόσβαση να ρυπάνετε έναν πίνακα μπορείτε επίσης να ρυπάνετε τις τιμές του πίνακα προσβάσιμες με δείκτες (σημειώστε ότι δεν μπορείτε να αντικαταστήσετε τις τιμές, οπότε πρέπει να ρυπάνετε δείκτες που χρησιμοποιούνται κάπως αλλά δεν είναι εγγεγραμμένοι).
Ρύπανση στοιχείων Html
Κατά τη δημιουργία ενός στοιχείου HTML μέσω JS είναι δυνατόν να αντικατασταθεί το χαρακτηριστικό innerHTML
για να γράψει οποιοδήποτε κώδικα HTML. Ιδέα και παράδειγμα από αυτήν την ανάλυση.
Παραδείγματα
Βασικό Παράδειγμα
Η ρύπανση του πρωτοτύπου συμβαίνει λόγω μιας αδυναμίας στην εφαρμογή που επιτρέπει την αντικατάσταση ιδιοτήτων στο Object.prototype
. Αυτό σημαίνει ότι αφού οι περισσότερες αντικείμενα προέρχονται από το Object.prototype
Το πιο εύκολο παράδειγμα είναι να προστεθεί μια τιμή σε μια απροσδιόριστη ιδιότητα ενός αντικειμένου που θα ελεγχθεί, όπως:
Εάν το χαρακτηριστικό admin
είναι απροσδιόριστο, είναι δυνατόν να εκμεταλλευτείτε μια PP και να το ορίσετε σε True με κάτι σαν:
Η μηχανική πίσω από αυτό περιλαμβάνει τη χειραγώγηση ιδιοτήτων έτσι ώστε αν ένας επιτιθέμενος έχει έλεγχο πάνω σε συγκεκριμένες εισόδους, μπορεί να τροποποιήσει το πρότυπο όλων των αντικειμένων στην εφαρμογή. Αυτή η χειραγώγηση συνήθως περιλαμβάνει την ρύθμιση της ιδιότητας __proto__
, η οποία, στην JavaScript, είναι συνώνυμη με την άμεση τροποποίηση του προτύπου ενός αντικειμένου.
Οι συνθήκες υπό τις οποίες μπορεί να εκτελεστεί με επιτυχία αυτή η επίθεση, όπως περιγράφεται σε μια συγκεκριμένη μελέτη, περιλαμβάνουν:
Εκτέλεση αναδρομικής συγχώνευσης.
Ορισμός ιδιοτήτων με βάση ένα μονοπάτι.
Αντιγραφή αντικειμένων.
Αντικατάσταση συνάρτησης
Ρύθμιση του Proto Pollution για RCE
pagePrototype Pollution to RCEΆλλα φορτία:
Πρωτότυπη ρύθμιση προς XSS στην πλευρά του πελάτη
pageClient Side Prototype PollutionCVE-2019–11358: Επίθεση προσβολής πρωτοτύπου μέσω του jQuery $ .extend
Για περισσότερες λεπτομέρειες ελέγξτε αυτό το άρθρο Στο jQuery, η λειτουργία $ .extend
μπορεί να οδηγήσει σε ρύθμιση πρωτοτύπου εάν η λειτουργία αντιγράφου βάθους χρησιμοποιείται εσφαλμένα. Αυτή η λειτουργία χρησιμοποιείται συνήθως για την αντιγραφή αντικειμένων ή τη συγχώνευση ιδιοτήτων από ένα προεπιλεγμένο αντικείμενο. Ωστόσο, όταν ρυθμιστεί εσφαλμένα, οι ιδιότητες που προορίζονται για ένα νέο αντικείμενο μπορούν να ανατεθούν στο πρωτότυπο αντί αυτού. Για παράδειγμα:
Αυτή η ευπάθεια, που αναγνωρίζεται ως CVE-2019–11358, επιδεικνύει πώς ένα βαθύ αντίγραφο μπορεί ακούσια να τροποποιήσει το πρωτότυπο, οδηγώντας σε πιθανούς κινδύνους ασφάλειας, όπως μη εξουσιοδοτημένη πρόσβαση διαχειριστή εάν ιδιότητες όπως το isAdmin
ελέγχονται χωρίς τη σωστή επαλήθευση ύπαρξης.
CVE-2018–3721, CVE-2019–10744: Επίθεση πρωτότυπης ρύπανσης μέσω του lodash
Για περισσότερες λεπτομέρειες ελέγξτε αυτό το άρθρο
Το Lodash αντιμετώπισε παρόμοιες ευπάθειες πρωτότυπης ρύπανσης (CVE-2018–3721, CVE-2019–10744). Αυτά τα θέματα αντιμετωπίστηκαν στην έκδοση 4.17.11.
Άλλος οδηγός με CVEs
Εργαλεία για τον εντοπισμό Πρωτότυπης Ρύπανσης
Server-Side-Prototype-Pollution-Gadgets-Scanner: Επέκταση του Burp Suite σχεδιασμένη για τον εντοπισμό και την ανάλυση ευπαθειών πρωτότυπης ρύπανσης στις εφαρμογές web. Αυτό το εργαλείο αυτοματοποιεί τη διαδικασία σάρωσης αιτημάτων για τον εντοπισμό πιθανών προβλημάτων πρωτότυπης ρύπανσης. Εκμεταλλεύεται γνωστά gadgets - μεθόδους εκμετάλλευσης της πρωτότυπης ρύπανσης για την εκτέλεση επιβλαβών ενεργειών - εστιάζοντας ιδιαίτερα σε βιβλιοθήκες Node.js.
server-side-prototype-pollution: Αυτή η επέκταση εντοπίζει ευπαθείες πρωτότυπης ρύπανσης στην πλευρά του διακομιστή. Χρησιμοποιεί τεχνικές που περιγράφονται στην ερευνητική εργασία για την πρωτότυπη ρύπανση στην πλευρά του διακομιστή.
Πρωτότυπη Ρύπανση AST στο NodeJS
Το NodeJS χρησιμοποιεί εκτεταμένα Δέντρα Αφαιρετικής Σύνταξης (AST) στη JavaScript για λειτουργίες όπως οι μηχανές προτύπων και το TypeScript. Αυτή η ενότητα εξετάζει τις ευπαθείες που σχετίζονται με την πρωτότυπη ρύπανση στις μηχανές προτύπων, ειδικά στα Handlebars και Pug.
Ανάλυση Ευπαθειών Handlebars
Η μηχανή προτύπων Handlebars είναι ευάλωτη σε μια επίθεση πρωτότυπης ρύπανσης. Αυτή η ευπαθεια προκύπτει από συγκεκριμένες λειτουργίες εντός του αρχείου javascript-compiler.js
. Για παράδειγμα, η λειτουργία appendContent
ενώνει το pendingContent
αν είναι παρόν, ενώ η λειτουργία pushSource
επαναφέρει το pendingContent
σε undefined
μετά την προσθήκη της πηγής.
Διαδικασία Εκμετάλλευσης
Η εκμετάλλευση χρησιμοποιεί το AST (Δέντρο Αφαιρετικής Σύνταξης) που παράγεται από το Handlebars, ακολουθώντας αυτά τα βήματα:
Ανακατεύθυνση του Αναλυτή: Αρχικά, ο αναλυτής, μέσω του κόμβου
NumberLiteral
, επιβάλλει ότι οι τιμές είναι αριθμητικές. Η πρωτότυπη ρύπανση μπορεί να παρακάμψει αυτό, επιτρέποντας την εισαγωγή μη αριθμητικών συμβόλων.Χειρισμός από τον Μεταγλωττιστή: Ο μεταγλωττιστής μπορεί να επεξεργαστεί ένα αντικείμενο AST ή ένα πρότυπο συμβολοσειράς. Αν το
input.type
ισούται μεProgram
, το εισερχόμενο χειρίζεται ως προεπεξεργασμένο, το οποίο μπορεί να εκμεταλλευτείται.Εισαγωγή Κώδικα: Μέσω της ανακατεύθυνσης του
Object.prototype
, μπορεί κανείς να εισάγει αυθαίρετο κώδικα στη λειτουργία προτύπου, ο οποίος μπορεί να οδηγήσει σε εκτέλεση κώδικα από απόσταση.
Ένα παράδειγμα που δείχνει την εκμετάλλευση της ευπαθείας του Handlebars:
Αυτός ο κώδικας δείχνει πώς ένας επιτιθέμενος θα μπορούσε να εισάγει αυθαίρετο κώδικα σε ένα πρότυπο Handlebars.
Εξωτερική Αναφορά: Βρέθηκε ένα πρόβλημα που σχετίζεται με τη ρύθμιση προτύπου στη βιβλιοθήκη 'flat', όπως περιγράφεται εδώ: Πρόβλημα στο GitHub.
Εξωτερική Αναφορά: Πρόβλημα που σχετίζεται με τη ρύθμιση προτύπου στη βιβλιοθήκη 'flat'
Παράδειγμα εκμετάλλευσης της ρύθμισης προτύπου σε Python:
Ευπάθεια Pug
Το Pug, ένας άλλος μηχανισμός προτύπου, αντιμετωπίζει ένα παρόμοιο κίνδυνο προσβολής του προτύπου. Λεπτομερείς πληροφορίες είναι διαθέσιμες στη συζήτηση για την Εισαγωγή AST στο Pug.
Παράδειγμα προσβολής προτύπου στο Pug:
Προληπτικά Μέτρα
Για να μειωθεί ο κίνδυνος πρόσκρουσης πρωτοτύπου, μπορούν να χρησιμοποιηθούν οι στρατηγικές που αναφέρονται παρακάτω:
Αναλλοίωτα Αντικείμενα: Το
Object.prototype
μπορεί να γίνει αναλλοίωτο εφαρμόζοντας τοObject.freeze
.Επικύρωση Εισόδου: Τα JSON εισαγωγικά πρέπει να ελέγχονται αυστηρά έναντι του σχήματος της εφαρμογής.
Ασφαλείς Συναρμολογικές Συναρμογές: Πρέπει να αποφεύγεται η ανασφαλής χρήση αναδρομικών συναρμολογικών συναρμογών.
Αντικείμενα Χωρίς Πρωτότυπο: Μπορούν να δημιουργηθούν αντικείμενα χωρίς ιδιότητες πρωτοτύπου χρησιμοποιώντας το
Object.create(null)
.Χρήση του Map: Αντί για
Object
, πρέπει να χρησιμοποιείται τοMap
για την αποθήκευση ζευγών κλειδιού-τιμής.Ενημερώσεις Βιβλιοθήκης: Οι ενημερώσεις ασφαλείας μπορούν να ενσωματωθούν με την τακτική ενημέρωση των βιβλιοθηκών.
Εργαλεία Ελέγχου Κώδικα και Στατικής Ανάλυσης: Χρησιμοποιήστε εργαλεία όπως το ESLint με τα κατάλληλα πρόσθετα για τον εντοπισμό και την πρόληψη ευπάθειας πρόσκρουσης πρωτοτύπου.
Αναθεωρήσεις Κώδικα: Εφαρμόστε λεπτομερείς αναθεωρήσεις κώδικα για την εντοπισμό και την αντιμετώπιση πιθανών κινδύνων που σχετίζονται με την πρόσκρουση πρωτοτύπου.
Εκπαίδευση Ασφάλειας: Εκπαιδεύστε τους προγραμματιστές σχετικά με τους κινδύνους της πρόσκρουσης πρωτοτύπου και τις βέλτιστες πρακτικές για τη συγγραφή ασφαλούς κώδικα.
Χρήση Βιβλιοθηκών με Προσοχή: Να είστε προσεκτικοί κατά τη χρήση βιβλιοθηκών τρίτων. Αξιολογήστε τη θέση της ασφάλειάς τους και ελέγξτε τον κώδικά τους, ειδικά αυτούς που χειρίζονται αντικείμενα.
Προστασία Εκτέλεσης: Χρησιμοποιήστε μηχανισμούς προστασίας εκτέλεσης, όπως η χρήση πακέτων npm με εστίαση στην ασφάλεια που μπορούν να ανιχνεύσουν και να προλάβουν επιθέσεις πρόσκρουσης πρωτοτύπου.
Αναφορές
Last updated