Double Free
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Αν απελευθερώσετε ένα μπλοκ μνήμης περισσότερες από μία φορές, μπορεί να διαταράξει τα δεδομένα του αλγορίθμου κατανομής και να ανοίξει την πόρτα σε επιθέσεις. Να πώς συμβαίνει: όταν απελευθερώνετε ένα μπλοκ μνήμης, επιστρέφει σε μια λίστα ελεύθερων κομματιών (π.χ. το "fast bin"). Αν απελευθερώσετε το ίδιο μπλοκ δύο φορές στη σειρά, ο αλγόριθμος κατανομής το ανιχνεύει αυτό και ρίχνει ένα σφάλμα. Αλλά αν απελευθερώσετε ένα άλλο κομμάτι ενδιάμεσα, ο έλεγχος διπλής απελευθέρωσης παρακάμπτεται, προκαλώντας διαφθορά.
Τώρα, όταν ζητάτε νέα μνήμη (χρησιμοποιώντας malloc
), ο αλγόριθμος κατανομής μπορεί να σας δώσει ένα μπλοκ που έχει απελευθερωθεί δύο φορές. Αυτό μπορεί να οδηγήσει σε δύο διαφορετικούς δείκτες που δείχνουν στην ίδια τοποθεσία μνήμης. Αν ένας επιτιθέμενος ελέγχει έναν από αυτούς τους δείκτες, μπορεί να αλλάξει το περιεχόμενο αυτής της μνήμης, κάτι που μπορεί να προκαλέσει προβλήματα ασφαλείας ή ακόμη και να τους επιτρέψει να εκτελέσουν κώδικα.
Παράδειγμα:
Σε αυτό το παράδειγμα, μετά την πλήρωση του tcache με αρκετά ελευθερωμένα chunks (7), ο κώδικας ελευθερώνει το chunk h
, στη συνέχεια το chunk i
, και μετά ξανά το h
, προκαλώντας μια διπλή ελευθέρωση (γνωστή και ως Fast Bin dup). Αυτό ανοίγει τη δυνατότητα λήψης επικαλυπτόμενων διευθύνσεων μνήμης κατά την επανακατανομή, πράγμα που σημαίνει ότι δύο ή περισσότερες δείκτες μπορούν να δείχνουν στην ίδια διεύθυνση μνήμης. Η χειραγώγηση δεδομένων μέσω ενός δείκτη μπορεί στη συνέχεια να επηρεάσει τον άλλο, δημιουργώντας έναν κρίσιμο κίνδυνο ασφαλείας και πιθανότητα εκμετάλλευσης.
Εκτελώντας το, σημειώστε πώς i1
και i2
πήραν την ίδια διεύθυνση:
Μπορούμε να κατανεμηθούμε μόνο chunks μεγέθους Fast-Bin εκτός από το μέγεθος 0x70
, το οποίο αποτρέπει την συνήθη επικάλυψη του __malloc_hook
.
Αντίθετα, χρησιμοποιούμε διευθύνσεις PIE που ξεκινούν με 0x56
ως στόχο για Fast Bin dup (1/2 πιθανότητα).
Ένα μέρος όπου αποθηκεύονται οι διευθύνσεις PIE είναι στο main_arena
, το οποίο βρίσκεται μέσα στο Glibc και κοντά στο __malloc_hook
.
Στοχεύουμε σε μια συγκεκριμένη μετατόπιση του main_arena
για να κατανεμηθεί ένα chunk εκεί και συνεχίζουμε να κατανεμηθούμε chunks μέχρι να φτάσουμε στο __malloc_hook
για να αποκτήσουμε εκτέλεση κώδικα.
Χρησιμοποιώντας Tcache bins και μια υπερχείλιση null-byte, μπορούμε να επιτύχουμε μια κατάσταση διπλής ελευθέρωσης:
Κατανεμούμε τρία chunks μεγέθους 0x110
(A
, B
, C
)
Ελευθερώνουμε το B
Ελευθερώνουμε το A
και κατανεμούμε ξανά για να χρησιμοποιήσουμε την υπερχείλιση null-byte
Τώρα το πεδίο μεγέθους του B
είναι 0x100
, αντί για 0x111
, οπότε μπορούμε να το ελευθερώσουμε ξανά
Έχουμε ένα Tcache-bin μεγέθους 0x110
και ένα μεγέθους 0x100
που δείχνουν στην ίδια διεύθυνση. Έτσι έχουμε μια διπλή ελευθέρωση.
Εκμεταλλευόμαστε τη διπλή ελευθέρωση χρησιμοποιώντας Tcache poisoning
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)