Libc Protections
Last updated
Last updated
Μάθετε & εξασκηθείτε στο Hacking του AWS:Εκπαίδευση HackTricks AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο Hacking του GCP: Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)
Το Malloc εκχωρεί μνήμη σε ομάδες 8 bytes (32-bit) ή 16 bytes (64-bit). Αυτό σημαίνει ότι το τέλος των τμημάτων σε συστήματα 32-bit πρέπει να ευθυγραμμίζεται με το 0x8, και σε συστήματα 64-bit με το 0x0. Η λειτουργία ασφαλείας ελέγχει ότι κάθε τμήμα ευθυγραμμίζεται σωστά σε αυτές τις συγκεκριμένες θέσεις πριν χρησιμοποιήσει ένα δείκτη από έναν κάδο.
Η επιβολή της ευθυγράμμισης τμημάτων σε συστήματα 64-bit ενισχύει σημαντικά την ασφάλεια του Malloc περιορίζοντας την τοποθέτηση ψεύτικων τμημάτων σε μόνο 1 στις 16 διευθύνσεις. Αυτό δυσκολεύει τις προσπάθειες εκμετάλλευσης, ειδικά σε σενάρια όπου ο χρήστης έχει περιορισμένο έλεγχο επί των τιμών εισόδου, καθιστώντας τις επιθέσεις πιο πολύπλοκες και δυσκολότερες να εκτελεστούν με επιτυχία.
Επίθεση Fastbin στο __malloc_hook
Οι νέοι κανόνες ευθυγράμμισης στο Malloc εμποδίζουν επίσης μια κλασική επίθεση που αφορά το __malloc_hook
. Προηγουμένως, οι επιτιθέμενοι μπορούσαν να διαμορφώσουν τα μεγέθη τμημάτων για να αντικαταστήσουν αυτόν τον δείκτη συνάρτησης και να κερδίσουν εκτέλεση κώδικα. Τώρα, η αυστηρή απαίτηση ευθυγράμμισης εξασφαλίζει ότι τέτοιες διαμορφώσεις δεν είναι πλέον εφικτές, κλείνοντας έτσι μια κοινή διαδρομή εκμετάλλευσης και ενισχύοντας συνολικά την ασφάλεια.
Το Ανακάτεμα Δεικτών είναι μια βελτίωση ασφάλειας που χρησιμοποιείται για την προστασία των fastbin και tcache Fd δεικτών σε λειτουργίες διαχείρισης μνήμης. Αυτή η τεχνική βοηθά στην πρόληψη ορισμένων τύπων τακτικών εκμετάλλευσης μνήμης, ειδικά αυτών που δεν απαιτούν διαρροή πληροφοριών μνήμης ή που διαμορφώνουν άμεσα τοποθεσίες μνήμης σχετικά με γνωστές θέσεις (σχετικές αντικαταστάσεις).
Η καρδιά αυτής της τεχνικής είναι μια τύπος ασάφειας:
Νέος_Δείκτης = (L >> 12) XOR P
L είναι η Τοποθεσία Αποθήκευσης του δείκτη.
P είναι ο πραγματικός fastbin/tcache Fd Δείκτης.
Ο λόγος για τον οποίο γίνεται δυαδική μετατόπιση της τοποθεσίας αποθήκευσης (L) κατά 12 bits προς τα δεξιά πριν τη λειτουργία XOR είναι κρίσιμος. Αυτή η διαμόρφωση αντιμετωπίζει μια ευπάθεια που είναι ενσωματωμένη στην προσδιοριστική φύση των λιγότερο σημαντικών 12 bits των διευθύνσεων μνήμης, τα οποία είναι συνήθως προβλέψιμα λόγω περιορισμών της αρχιτεκτονικής του συστήματος. Με τη μετατόπιση των bits, η προβλέψιμη μερίδα αφαιρείται από την εξίσωση, ενισχύοντας την τυχαιότητα του νέου, ανακατεμένου δείκτη και προστατεύοντας έτσι ενάντια σε επιθέσεις που βασίζονται στην προβλέψιμότητα αυτών των bits.
Αυτός ο ανακατεμένος δείκτης εκμεταλλεύεται την υπάρχουσα τυχαιότητα που παρέχεται από το Τυχαίο Διάταξης Χώρου Διευθύνσεων (ASLR), το οποίο τυχαιοποιεί τις διευθύνσεις που χρησιμοποιούνται από τα προγράμματα για να δυσκολέψει τους επιτιθέμενους να προβλέψουν τη μνημονική διάταξη ενός διεργασίας.
Ανακάτεμα του δείκτη για ανάκτηση της αρχικής διεύθυνσης περιλαμβάνει τη χρήση της ίδιας λειτουργίας XOR. Εδώ, ο ανακατεμένος δείκτης θεωρείται ως P στην εξίσωση, και όταν γίνεται XOR με την αμετάβλητη τοποθεσία αποθήκευσης (L), αποκαλύπτεται ο αρχικός δείκτης. Αυτή η συμμετρία στο ανακάτεμα και ανάκτηση εξασφαλίζει ότι το σύστημα μπορεί να κωδικοποιεί και να αποκωδικοποιεί δείκτες χωρίς σημαντικά έξοδα, ενώ αυξάνει σημαντικά την ασφάλεια ενάντια σε επιθέσεις που διαμορφώνουν δείκτες μνήμης.
Το ανακάτεμα δεικτών στοχεύει στο πρόληψη μερικών και πλήρων αντικαταστάσεων δεικτών στη στοίβα διαχείρισης στοίβας, μια σημαντική βελτίωση στην ασφάλεια. Αυτό το χαρακτηριστικό επηρεάζει τεχνικές εκμετάλλευσης με διάφορους τρόπους:
Πρόληψη Αντικατάστασης Μερικών Bytes: Προηγουμένως, οι επιτιθέμενοι μπορούσαν να αλλάξουν ένα μέρος ενός δείκτη για να ανακατευθύνουν τμήματα στοίβας σε διαφορετικές τοποθεσίες χωρίς να γνωρίζουν τις ακριβείς διευθύνσεις, μια τεχνική που φαίνεται στην εκμετάλλευση House of Roman χωρίς διαρροή στοίβας. Με το ανακάτεμα δεικτών, τέτοιες αντικαταστάσεις χωρίς διαρροή στοίβας απαιτούν πλέον βίαιη επίθεση, μειώνοντας δραματικά τις πιθανότητες επιτυχίας τους.
Αύξηση Δυσκολίας Επιθέσεων Tcache Bin/Fastbin: Οι κοινές επιθέσεις που αντικαθιστούν δείκτες συναρτήσεων (όπως __malloc_hook
) με διαμόρφωση εγ
Το Pointer guard είναι μια τεχνική μείωσης εκμετάλλευσης που χρησιμοποιείται στο glibc για την προστασία αποθηκευμένων δεικτών συνάρτησης, ιδιαίτερα αυτών που έχουν καταχωρηθεί από κλήσεις βιβλιοθήκης όπως το atexit()
. Αυτή η προστασία περιλαμβάνει την ανάκατεμα των δεικτών με XOR με ένα μυστικό που αποθηκεύεται στα δεδομένα νήματος (fs:0x30
) και την εφαρμογή ενός δυαδικού περιστροφής. Αυτό το μηχανισμό στοχεύει στο να αποτρέψει τους επιτιθέμενους από το να αρπάξουν τη ροή ελέγχου με τον παρεμβολή σε δείκτες συνάρτησης.
Κατανόηση των Λειτουργιών του Pointer Guard: Η ανάκατεμα (μετατροπή) των δεικτών γίνεται χρησιμοποιώντας τον μακρό PTR_MANGLE
που κάνει XOR τον δείκτη με ένα μυστικό 64 bit και στη συνέχεια εκτελεί μια αριστερή περιστροφή 0x11 bits. Η αντίστροφη λειτουργία για την ανάκτηση του αρχικού δείκτη χειρίζεται από το PTR_DEMANGLE
.
Στρατηγική Επίθεσης: Η επίθεση βασίζεται σε μια προσέγγιση γνωστού κειμένου, όπου ο επιτιθέμενος πρέπει να γνωρίζει τόσο την αρχική όσο και τη μετατραπείσα εκδοχή ενός δείκτη για να συμπεράνει το μυστικό που χρησιμοποιείται για τη μετατροπή.
Εκμετάλλευση Γνωστών Κειμένων:
Αναγνώριση Σταθερών Δεικτών Συνάρτησης: Με την εξέταση του πηγαίου κώδικα του glibc ή των πινάκων δεικτών συνάρτησης που αρχικοποιούνται (όπως το __libc_pthread_functions
), ένας επιτιθέμενος μπορεί να βρει προβλέψιμους δείκτες συνάρτησης.
Υπολογισμός του Μυστικού: Χρησιμοποιώντας έναν γνωστό δείκτη συνάρτησης όπως το __pthread_attr_destroy
και τη μετατραπείσα του εκδοχή από τον πίνακα δεικτών συνάρτησης, το μυστικό μπορεί να υπολογιστεί αναστρέφοντας την περιστροφή (δεξιά περιστροφή) του μετατραπέντα δείκτη και στη συνέχεια κάνοντας XOR με τη διεύθυνση της συνάρτησης.
Εναλλακτικά Κείμενα: Ο επιτιθέμενος μπορεί επίσης να πειραματιστεί με τη μετατροπή δεικτών με γνωστές τιμές όπως το 0 ή το -1 για να δει αν αυτές παράγουν αναγνωρίσιμα πρότυπα στη μνήμη, αποκαλύπτοντας πιθανώς το μυστικό όταν αυτά τα πρότυπα βρίσκονται σε αναλήψεις μνήμης.
Πρακτική Εφαρμογή: Μετά τον υπολογισμό του μυστικού, ένας επιτιθέμενος μπορεί να χειρίζεται τους δείκτες με έλεγχο, παρακάμπτοντας ουσιαστικά την προστασία του Pointer Guard σε μια εφαρμογή πολλαπλών νημάτων με γνώση της βάσης δεδομένων libc και τη δυνατότητα ανάγνωσης αυθαίρετων τοποθεσιών μνήμης.