Libc Protections
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Malloc εκχωρεί μνήμη σε ομαδοποιήσεις 8-byte (32-bit) ή 16-byte (64-bit). Αυτό σημαίνει ότι το τέλος των τμημάτων σε συστήματα 32-bit θα πρέπει να ευθυγραμμίζεται με 0x8, και σε συστήματα 64-bit με 0x0. Η λειτουργία ασφαλείας ελέγχει ότι κάθε τμήμα ευθυγραμμίζεται σωστά σε αυτές τις συγκεκριμένες τοποθεσίες πριν χρησιμοποιήσει έναν δείκτη από ένα bin.
Η επιβολή ευθυγράμμισης τμημάτων σε συστήματα 64-bit ενισχύει σημαντικά την ασφάλεια του Malloc περιορίζοντας τη θέση ψεύτικων τμημάτων σε μόνο 1 από κάθε 16 διευθύνσεις. Αυτό περιπλέκει τις προσπάθειες εκμετάλλευσης, ειδικά σε σενάρια όπου ο χρήστης έχει περιορισμένο έλεγχο στις τιμές εισόδου, καθιστώντας τις επιθέσεις πιο περίπλοκες και δύσκολες στην επιτυχία.
Fastbin Attack on __malloc_hook
Οι νέοι κανόνες ευθυγράμμισης στο Malloc αποτρέπουν επίσης μια κλασική επίθεση που περιλαμβάνει τον __malloc_hook
. Προηγουμένως, οι επιτιθέμενοι μπορούσαν να χειραγωγήσουν τα μεγέθη των τμημάτων για να επικαλύψουν αυτόν τον δείκτη συνάρτησης και να αποκτήσουν εκτέλεση κώδικα. Τώρα, η αυστηρή απαίτηση ευθυγράμμισης διασφαλίζει ότι τέτοιες χειραγωγήσεις δεν είναι πλέον βιώσιμες, κλείνοντας μια κοινή διαδρομή εκμετάλλευσης και ενισχύοντας τη συνολική ασφάλεια.
Pointer Mangling είναι μια βελτίωση ασφαλείας που χρησιμοποιείται για την προστασία των δείκτων Fd fastbin και tcache σε λειτουργίες διαχείρισης μνήμης. Αυτή η τεχνική βοηθά στην αποτροπή ορισμένων τύπων τακτικών εκμετάλλευσης μνήμης, συγκεκριμένα αυτών που δεν απαιτούν διαρροή πληροφοριών μνήμης ή που χειραγωγούν άμεσα τις τοποθεσίες μνήμης σε σχέση με γνωστές θέσεις (σχετικές επικαλύψεις).
Ο πυρήνας αυτής της τεχνικής είναι μια φόρμουλα απόκρυψης:
New_Ptr = (L >> 12) XOR P
L είναι η Τοποθεσία Αποθήκευσης του δείκτη.
P είναι ο πραγματικός δείκτης Fd fastbin/tcache.
Ο λόγος για τη μετατόπιση των bit της τοποθεσίας αποθήκευσης (L) κατά 12 bit προς τα δεξιά πριν από τη λειτουργία XOR είναι κρίσιμος. Αυτή η χειραγώγηση αντιμετωπίζει μια ευπάθεια που είναι εγγενής στη ντετερμινιστική φύση των 12 λιγότερο σημαντικών bit των διευθύνσεων μνήμης, οι οποίες είναι συνήθως προβλέψιμες λόγω περιορισμών αρχιτεκτονικής συστήματος. Με τη μετατόπιση των bit, το προβλέψιμο τμήμα μετακινείται εκτός της εξίσωσης, ενισχύοντας την τυχαιότητα του νέου, παραμορφωμένου δείκτη και προστατεύοντας έτσι από εκμεταλλεύσεις που βασίζονται στην προβλεψιμότητα αυτών των bit.
Αυτός ο παραμορφωμένος δείκτης εκμεταλλεύεται την υπάρχουσα τυχαιότητα που παρέχεται από Address Space Layout Randomization (ASLR), η οποία τυχαίνει τις διευθύνσεις που χρησιμοποιούνται από προγράμματα για να δυσκολεύει τους επιτιθέμενους να προβλέψουν τη διάταξη μνήμης μιας διαδικασίας.
Demangling του δείκτη για να ανακτηθεί η αρχική διεύθυνση περιλαμβάνει τη χρήση της ίδιας λειτουργίας XOR. Εδώ, ο παραμορφωμένος δείκτης αντιμετωπίζεται ως P στη φόρμουλα, και όταν XORαριστεί με την αμετάβλητη τοποθεσία αποθήκευσης (L), αποκαλύπτεται ο αρχικός δείκτης. Αυτή η συμμετρία στην παραμόρφωση και αποπαραμόρφωση διασφαλίζει ότι το σύστημα μπορεί να κωδικοποιεί και να αποκωδικοποιεί αποτελεσματικά τους δείκτες χωρίς σημαντικό κόστος, ενώ αυξάνει σημαντικά την ασφάλεια κατά των επιθέσεων που χειραγωγούν τους δείκτες μνήμης.
Η παραμόρφωση δείκτη στοχεύει να αποτρέψει μερικές και πλήρεις επικαλύψεις δείκτη στη διαχείριση heap, μια σημαντική βελτίωση στην ασφάλεια. Αυτή η δυνατότητα επηρεάζει τις τεχνικές εκμετάλλευσης με διάφορους τρόπους:
Prevention of Bye Byte Relative Overwrites: Προηγουμένως, οι επιτιθέμενοι μπορούσαν να αλλάξουν μέρος ενός δείκτη για να ανακατευθύνουν τα τμήματα heap σε διαφορετικές τοποθεσίες χωρίς να γνωρίζουν ακριβείς διευθύνσεις, μια τεχνική που είναι προφανής στην εκμετάλλευση χωρίς διαρροές House of Roman. Με την παραμόρφωση δείκτη, τέτοιες σχετικές επικαλύψεις χωρίς διαρροή heap απαιτούν τώρα brute forcing, μειώνοντας δραστικά την πιθανότητα επιτυχίας τους.
Increased Difficulty of Tcache Bin/Fastbin Attacks: Κοινές επιθέσεις που επικαλύπτουν δείκτες συναρτήσεων (όπως __malloc_hook
) με τη χειραγώγηση των εγγραφών fastbin ή tcache εμποδίζονται. Για παράδειγμα, μια επίθεση μπορεί να περιλαμβάνει τη διαρροή μιας διεύθυνσης LibC, την απελευθέρωση ενός τμήματος στο bin tcache και στη συνέχεια την επικαλυπτική του δείκτη Fd για να το ανακατευθύνει στο __malloc_hook
για αυθαίρετη εκτέλεση κώδικα. Με την παραμόρφωση δείκτη, αυτοί οι δείκτες πρέπει να είναι σωστά παραμορφωμένοι, απαιτώντας μια διαρροή heap για ακριβή χειραγώγηση, αυξάνοντας έτσι το εμπόδιο εκμετάλλευσης.
Requirement for Heap Leaks in Non-Heap Locations: Η δημιουργία ενός ψεύτικου τμήματος σε μη περιοχές heap (όπως η στοίβα, η ενότητα .bss ή το PLT/GOT) απαιτεί επίσης μια διαρροή heap λόγω της ανάγκης για παραμόρφωση δείκτη. Αυτό επεκτείνει την πολυπλοκότητα της εκμετάλλευσης αυτών των περιοχών, παρόμοια με την απαίτηση για χειραγώγηση διευθύνσεων LibC.
Leaking Heap Addresses Becomes More Challenging: Η παραμόρφωση δείκτη περιορίζει τη χρησιμότητα των δεικτών Fd σε bins fastbin και tcache ως πηγές διαρροών διευθύνσεων heap. Ωστόσο, οι δείκτες σε αταξινόμητα, μικρά και μεγάλα bins παραμένουν μη παραμορφωμένοι, επομένως είναι ακόμα χρήσιμοι για διαρροές διευθύνσεων. Αυτή η αλλαγή ωθεί τους επιτιθέμενους να εξερευνήσουν αυτά τα bins για εκμεταλλεύσιμες πληροφορίες, αν και ορισμένες τεχνικές μπορεί να επιτρέπουν ακόμα την αποπαραμόρφωση δεικτών πριν από μια διαρροή, αν και με περιορισμούς.
For a better explanation of the process check the original post from here.
Η φόρμουλα που χρησιμοποιείται για την παραμόρφωση και αποπαραμόρφωση δεικτών είναι:
New_Ptr = (L >> 12) XOR P
Όπου L είναι η τοποθεσία αποθήκευσης και P είναι ο δείκτης Fd. Όταν L μετατοπίζεται προς τα δεξιά κατά 12 bit, εκθέτει τα πιο σημαντικά bit του P, λόγω της φύσης του XOR, που παράγει 0 όταν τα bit XORαριστούν με τον εαυτό τους.
Key Steps in the Algorithm:
Initial Leak of the Most Significant Bits: Με το να XORαριστεί το μετατοπισμένο L με P, αποκτάτε αποτελεσματικά τα 12 πιο σημαντικά bit του P επειδή το μετατοπισμένο τμήμα του L θα είναι μηδέν, αφήνοντας τα αντίστοιχα bit του P αμετάβλητα.
Recovery of Pointer Bits: Δεδομένου ότι το XOR είναι αναστρέψιμο, γνωρίζοντας το αποτέλεσμα και έναν από τους τελεστές σας επιτρέπει να υπολογίσετε τον άλλο τελεστή. Αυτή η ιδιότητα χρησιμοποιείται για να υπολογίσει το σύνολο των bit για το P με τη διαδοχική XORαρισμένη γνωστών συνόλων bit με μέρη του παραμορφωμένου δείκτη.
Iterative Demangling: Η διαδικασία επαναλαμβάνεται, κάθε φορά χρησιμοποιώντας τα νέα ανακαλυφθέντα bit του P από το προηγούμενο βήμα για να αποκωδικοποιήσει το επόμενο τμήμα του παραμορφωμένου δείκτη, μέχρι να ανακτηθούν όλα τα bit.
Handling Deterministic Bits: Τα τελικά 12 bit του L χάνονται λόγω της μετατόπισης, αλλά είναι ντετερμινιστικά και μπορούν να ανακατασκευαστούν μετά τη διαδικασία.
Μπορείτε να βρείτε μια υλοποίηση αυτού του αλγορίθμου εδώ: https://github.com/mdulin2/mangle
Ο δείκτης φρουρός είναι μια τεχνική μετριασμού εκμετάλλευσης που χρησιμοποιείται στη glibc για την προστασία των αποθηκευμένων δεικτών συναρτήσεων, ιδιαίτερα αυτών που καταχωρούνται από κλήσεις βιβλιοθήκης όπως το atexit()
. Αυτή η προστασία περιλαμβάνει την ανακατεύθυνση των δεικτών με XOR με ένα μυστικό που αποθηκεύεται στα δεδομένα νήματος (fs:0x30
) και την εφαρμογή μιας περιστροφής bit. Αυτός ο μηχανισμός στοχεύει να αποτρέψει τους επιτιθέμενους από το να αναλάβουν τον έλεγχο της ροής εκτέλεσης επικαλύπτοντας τους δείκτες συναρτήσεων.
Understanding Pointer Guard Operations: Η ανακατεύθυνση (παραμόρφωση) των δεικτών γίνεται χρησιμοποιώντας το μακροεντολή PTR_MANGLE
που XORαρίζει τον δείκτη με ένα 64-bit μυστικό και στη συνέχεια εκτελεί μια αριστερή περιστροφή 0x11 bit. Η αντίστροφη λειτουργία για την ανάκτηση του αρχικού δείκτη διαχειρίζεται από το PTR_DEMANGLE
.
Attack Strategy: Η επίθεση βασίζεται σε μια προσέγγιση γνωστού κειμένου, όπου ο επιτιθέμενος πρέπει να γνωρίζει τόσο την αρχική όσο και την παραμορφωμένη έκδοση ενός δείκτη για να deduce το μυστικό που χρησιμοποιήθηκε για την παραμόρφωση.
Exploiting Known Plaintexts:
Identifying Fixed Function Pointers: Εξετάζοντας τον πηγαίο κώδικα της glibc ή τους πίνακες δεικτών συναρτήσεων που έχουν αρχικοποιηθεί (όπως το __libc_pthread_functions
), ένας επιτιθέμενος μπορεί να βρει προβλέψιμους δείκτες συναρτήσεων.
Computing the Secret: Χρησιμοποιώντας έναν γνωστό δείκτη συναρτήσεων όπως το __pthread_attr_destroy
και την παραμορφωμένη έκδοσή του από τον πίνακα δεικτών συναρτήσεων, το μυστικό μπορεί να υπολογιστεί με την αντίστροφη περιστροφή (δεξιά περιστροφή) του παραμορφωμένου δείκτη και στη συνέχεια XORαρίζοντας το με τη διεύθυνση της συνάρτησης.
Alternative Plaintexts: Ο επιτιθέμενος μπορεί επίσης να πειραματιστεί με την παραμόρφωση δεικτών με γνωστές τιμές όπως 0 ή -1 για να δει αν αυτές παράγουν αναγνωρίσιμα μοτίβα στη μνήμη, αποκαλύπτοντας ενδεχομένως το μυστικό όταν αυτά τα μοτίβα βρεθούν σε εκφορτώσεις μνήμης.
Practical Application: Αφού υπολογίσει το μυστικό, ένας επιτιθέμενος μπορεί να χειραγωγήσει τους δείκτες με ελεγχόμενο τρόπο, ουσιαστικά παρακάμπτοντας την προστασία Pointer Guard σε μια πολυνηματική εφαρμογή με γνώση της διεύθυνσης βάσης libc και ικανότητα ανάγνωσης αυθαίρετων τοποθεσιών μνήμης.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)