Heap Overflow
Reading time: 6 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Basic Information
Ένα heap overflow είναι σαν ένα stack overflow αλλά στο heap. Βασικά σημαίνει ότι κάποιος χώρος είχε κρατηθεί στο heap για να αποθηκεύσει κάποια δεδομένα και τα αποθηκευμένα δεδομένα ήταν μεγαλύτερα από τον κρατημένο χώρο.
Στα stack overflows γνωρίζουμε ότι μερικοί καταχωρητές όπως ο δείκτης εντολών ή το stack frame θα αποκατασταθούν από το stack και θα μπορούσε να είναι δυνατό να γίνει κατάχρηση αυτού. Στην περίπτωση των heap overflows, δεν υπάρχει καμία ευαίσθητη πληροφορία που να αποθηκεύεται από προεπιλογή στο heap chunk που μπορεί να υπερχειλιστεί. Ωστόσο, θα μπορούσε να είναι ευαίσθητη πληροφορία ή δείκτες, οπότε η κριτική σημασία αυτής της ευπάθειας εξαρτάται από ποια δεδομένα θα μπορούσαν να αντικατασταθούν και πώς ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό.
tip
Για να βρείτε τα offsets υπερχείλισης μπορείτε να χρησιμοποιήσετε τα ίδια μοτίβα όπως στα stack overflows.
Stack Overflows vs Heap Overflows
Στα stack overflows η διάταξη και τα δεδομένα που θα είναι παρόντα στο stack τη στιγμή που μπορεί να ενεργοποιηθεί η ευπάθεια είναι αρκετά αξιόπιστα. Αυτό συμβαίνει επειδή το stack είναι γραμμικό, πάντα αυξανόμενο σε συγκρουόμενη μνήμη, σε συγκεκριμένες θέσεις της εκτέλεσης του προγράμματος η μνήμη του stack συνήθως αποθηκεύει παρόμοια είδη δεδομένων και έχει κάποια συγκεκριμένη δομή με μερικούς δείκτες στο τέλος του τμήματος του stack που χρησιμοποιείται από κάθε συνάρτηση.
Ωστόσο, στην περίπτωση ενός heap overflow, η χρησιμοποιούμενη μνήμη δεν είναι γραμμική αλλά οι κατανεμημένοι χώροι είναι συνήθως σε ξεχωριστές θέσεις μνήμης (όχι ο ένας δίπλα στον άλλο) λόγω των bins και zones που διαχωρίζουν τις κατανομές κατά μέγεθος και επειδή η προηγούμενη ελεύθερη μνήμη χρησιμοποιείται πριν από την κατανομή νέων chunks. Είναι περίπλοκο να γνωρίζουμε το αντικείμενο που θα συγκρούεται με αυτό που είναι ευάλωτο σε ένα heap overflow. Έτσι, όταν βρεθεί ένα heap overflow, είναι απαραίτητο να βρεθεί ένας αξιόπιστος τρόπος για να γίνει το επιθυμητό αντικείμενο το επόμενο στη μνήμη από αυτό που μπορεί να υπερχειλιστεί.
Μία από τις τεχνικές που χρησιμοποιούνται για αυτό είναι το Heap Grooming το οποίο χρησιμοποιείται για παράδειγμα σε αυτή την ανάρτηση. Στην ανάρτηση εξηγείται πώς όταν στο iOS kernel μια ζώνη εξαντλείται από μνήμη για να αποθηκεύσει chunks μνήμης, επεκτείνεται κατά μία σελίδα kernel, και αυτή η σελίδα χωρίζεται σε chunks των αναμενόμενων μεγεθών που θα χρησιμοποιηθούν με σειρά (μέχρι την έκδοση iOS 9.2, τότε αυτά τα chunks χρησιμοποιούνται με τυχαίο τρόπο για να δυσκολέψουν την εκμετάλλευση αυτών των επιθέσεων).
Επομένως, στην προηγούμενη ανάρτηση όπου συμβαίνει ένα heap overflow, προκειμένου να αναγκαστεί το υπερχειλισμένο αντικείμενο να συγκρούεται με μια παραγγελία θύματος, αρκετές kallocs
αναγκάζονται από αρκετά νήματα για να προσπαθήσουν να διασφαλίσουν ότι όλα τα ελεύθερα chunks είναι γεμάτα και ότι δημιουργείται μια νέα σελίδα.
Για να αναγκαστεί αυτή η γέμιση με αντικείμενα συγκεκριμένου μεγέθους, η εκτός γραμμής κατανομή που σχετίζεται με ένα mach port του iOS είναι ένας ιδανικός υποψήφιος. Με την κατασκευή του μεγέθους του μηνύματος, είναι δυνατό να καθοριστεί ακριβώς το μέγεθος της κατανομής kalloc
και όταν το αντίστοιχο mach port καταστραφεί, η αντίστοιχη κατανομή θα απελευθερωθεί αμέσως πίσω στο kfree
.
Στη συνέχεια, μερικοί από αυτούς τους χώρους μπορούν να απελευθερωθούν. Η λίστα ελεύθερων kalloc.4096
απελευθερώνει στοιχεία με σειρά τελευταίου εισερχόμενου πρώτου εξερχόμενου, που σημαίνει βασικά ότι αν μερικοί χώροι απελευθερωθούν και η εκμετάλλευση προσπαθήσει να κατανεμηθεί αρκετά αντικείμενα θύματα ενώ προσπαθεί να κατανεμηθεί το αντικείμενο που είναι ευάλωτο σε υπερχείλιση, είναι πιθανό ότι αυτό το αντικείμενο θα ακολουθείται από ένα αντικείμενο θύμα.
Example libc
Σε αυτή τη σελίδα είναι δυνατό να βρείτε μια βασική προσομοίωση heap overflow που δείχνει πώς η αντικατάσταση του prev in use bit του επόμενου chunk και η θέση του prev size είναι δυνατό να συγκεντρώσουν ένα χρησιμοποιούμενο chunk (κάνοντάς το να νομίζει ότι είναι αχρησιμοποίητο) και στη συνέχεια να το κατανεμηθεί ξανά έχοντας τη δυνατότητα να αντικαταστήσει δεδομένα που χρησιμοποιούνται σε διαφορετικό δείκτη επίσης.
Ένα άλλο παράδειγμα από protostar heap 0 δείχνει ένα πολύ βασικό παράδειγμα ενός CTF όπου ένα heap overflow μπορεί να εκμεταλλευτεί για να καλέσει τη συνάρτηση νικητή για να πάρει τη σημαία.
Στο παράδειγμα protostar heap 1 είναι δυνατό να δείτε πώς με την κατάχρηση ενός buffer overflow είναι δυνατό να αντικατασταθεί σε ένα κοντινό chunk μια διεύθυνση όπου τυχαία δεδομένα από τον χρήστη θα γραφούν.
Example ARM64
Στη σελίδα https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/ μπορείτε να βρείτε ένα παράδειγμα heap overflow όπου μια εντολή που πρόκειται να εκτελεστεί αποθηκεύεται στο επόμενο chunk από το υπερχειλισμένο chunk. Έτσι, είναι δυνατό να τροποποιηθεί η εκτελούμενη εντολή αντικαθιστώντας την με μια εύκολη εκμετάλλευση όπως:
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
Άλλα παραδείγματα
- Auth-or-out. Hack The Box
- Χρησιμοποιούμε μια ευπάθεια Integer Overflow για να αποκτήσουμε Heap Overflow.
- Διαφθείρουμε δείκτες σε μια συνάρτηση μέσα σε ένα
struct
του υπερχειλισμένου κομματιού για να ορίσουμε μια συνάρτηση όπως τοsystem
και να αποκτήσουμε εκτέλεση κώδικα.
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.