Translated ['src/binary-exploitation/libc-heap/use-after-free/first-fit.

This commit is contained in:
Translator 2025-08-20 09:39:14 +00:00
parent e7fa66c582
commit 5e8f612398

View File

@ -24,7 +24,7 @@ char *c = malloc(250);
```
### Fastbins
Τα Fastbins χρησιμοποιούνται για μικρές μνήμες. Σε αντίθεση με τα unsorted bins, τα fastbins προσθέτουν νέα κομμάτια στην κεφαλή, δημιουργώντας μια συμπεριφορά last-in-first-out (LIFO). Εάν ζητήσετε ένα μικρό κομμάτι μνήμης, ο allocator θα αντλήσει από την κεφαλή του fastbin.
Τα Fastbins χρησιμοποιούνται για μικρές μνήμες. Σε αντίθεση με τα unsorted bins, τα fastbins προσθέτουν νέα κομμάτια στην κεφαλή, δημιουργώντας μια συμπεριφορά last-in-first-out (LIFO). Εάν ζητήσετε ένα μικρό κομμάτι μνήμης, ο allocator θα τραβήξει από την κεφαλή του fastbin.
Example:
```c
@ -44,10 +44,10 @@ d = malloc(20); // a
---
### 🔥 Σύγχρονες εκτιμήσεις glibc (tcache ≥ 2.26)
Από την glibc 2.26, κάθε νήμα διατηρεί το δικό του **tcache** που ερωτάται *πριν* από το unsorted bin. Επομένως, ένα σενάριο first-fit θα **φτάσει μόνο αν**:
Από την glibc 2.26, κάθε νήμα διατηρεί το δικό του **tcache** που ερωτάται *πριν* από το unsorted bin. Επομένως, ένα σενάριο first-fit θα **φτάσει μόνο αν**:
1. Το ζητούμενο μέγεθος είναι **μεγαλύτερο από το `tcache_max`** (0x420 σε 64-bit από προεπιλογή), *ή*
2. Το αντίστοιχο tcache bin είναι **ήδη γεμάτο ή έχει αδειάσει χειροκίνητα** (με την εκχώρηση 7 στοιχείων και τη διατήρησή τους σε χρήση).
2. Ο αντίστοιχος tcache bin είναι **ήδη γεμάτος ή έχει αδειάσει χειροκίνητα** (με την εκχώρηση 7 στοιχείων και τη διατήρησή τους σε χρήση).
Σε πραγματικές εκμεταλλεύσεις, συνήθως θα προσθέσετε μια βοηθητική ρουτίνα όπως:
```c
@ -60,7 +60,7 @@ for(int i = 0; i < 7; i++) free(pool[i]);
---
### 🚩 Δημιουργία ενός overlapping-chunk UAF με first-fit
Το παρακάτω απόσπασμα (δοκιμασμένο σε glibc 2.38) δείχνει πώς μπορεί να καταχραστεί ο διαχωριστής στο unsorted bin για να δημιουργήσει 2 **overlapping pointers** μια ισχυρή πρωτοβουλία που μετατρέπει μια μοναδική απελευθέρωση σε write-after-free.
Το παρακάτω απόσπασμα (δοκιμασμένο σε glibc 2.38) δείχνει πώς μπορεί να καταχραστεί ο διαχωριστής στο unsorted bin για να δημιουργήσει 2 **overlapping pointers** μια ισχυρή πρωτοβουλία που μετατρέπει μια μόνο απελευθέρωση σε write-after-free.
```c
#include <stdio.h>
#include <stdlib.h>
@ -92,38 +92,36 @@ fwrite(C2, 1, 0x10, stdout); // prints Xs
```
Exploitation recipe (common in recent CTFs):
1. **Αδειάστε** το tcache για το στοχευμένο μέγεθος.
2. **Απελευθερώστε** ένα chunk ώστε να καταλήξει στο unsorted bin.
3. **Κατανείμετε** ένα ελαφρώς μικρότερο μέγεθος ο allocator χωρίζει το unsorted chunk.
4. **Κατανείμετε** ξανά το υπόλοιπο μέρος επικαλύπτεται με ένα υπάρχον chunk σε χρήση → UAF.
5. Επαναγράψτε ευαίσθητα πεδία (δείκτες συναρτήσεων, FILE vtable, κ.λπ.)
1. **Drain** the tcache for the target size.
2. **Free** a chunk so it lands in the unsorted bin.
3. **Allocate** a slightly smaller size the allocator splits the unsorted chunk.
4. **Allocate** again the leftover part overlaps with an existing in-use chunk → UAF.
5. Overwrite sensitive fields (function pointers, FILE vtable, etc.)
Μια πρακτική εφαρμογή μπορεί να βρεθεί στην πρόκληση *Setjmp* των 2024 HITCON Quals όπου χρησιμοποιείται αυτό το ακριβές primitive για να μεταβεί από ένα UAF σε πλήρη έλεγχο του `__free_hook`.{{#ref}}
../../../../references/2024_setjmp_firstfit.md
{{#endref}}
A practical application can be found in the 2024 HITCON Quals *Setjmp* challenge where this exact primitive is used to pivot from a UAF to full control of `__free_hook`.
---
### 🛡️ Mitigations & Hardening
* **Safe-linking (glibc ≥ 2.32)** προστατεύει μόνο τις απλά συνδεδεμένες λίστες *tcache*/**fastbin**. Οι unsorted/small/large bins εξακολουθούν να αποθηκεύουν ακατέργαστους δείκτες, οπότε οι επικαλύψεις που βασίζονται σε first-fit παραμένουν βιώσιμες αν μπορείτε να αποκτήσετε ένα heap leak.
* **Κρυπτογράφηση δείκτη heap & MTE** (ARM64) δεν επηρεάζουν ακόμη το x86-64 glibc, αλλά οι σημαίες σκληροποίησης διανομής όπως `GLIBC_TUNABLES=glibc.malloc.check=3` θα τερματίσουν σε ασυνεπή μεταδεδομένα και μπορούν να σπάσουν απλές PoCs.
* **Γέμισμα tcache κατά την απελευθέρωση** (προτεινόμενο το 2024 για glibc 2.41) θα μειώσει περαιτέρω τη χρήση unsorted; παρακολουθήστε τις μελλοντικές εκδόσεις κατά την ανάπτυξη γενικών exploits.
* **Safe-linking (glibc ≥ 2.32)** only protects the singly-linked *tcache*/**fastbin** lists. The unsorted/small/large bins still store raw pointers, so first-fit based overlaps remain viable if you can obtain a heap leak.
* **Heap pointer encryption & MTE** (ARM64) do not affect x86-64 glibc yet, but distro hardening flags such as `GLIBC_TUNABLES=glibc.malloc.check=3` will abort on inconsistent metadata and can break naïve PoCs.
* **Filling tcache on free** (proposed in 2024 for glibc 2.41) would further reduce unsorted usage; monitor future releases when developing generic exploits.
---
## Other References & Examples
- [**https://heap-exploitation.dhavalkapil.com/attacks/first_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first_fit)
- [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
- ARM64. Use after free: Δημιουργήστε ένα αντικείμενο χρήστη, απελευθερώστε το, δημιουργήστε ένα αντικείμενο που αποκτά το freed chunk και επιτρέψτε να γράψει σε αυτό, **επικαλύπτοντας τη θέση του user->password** από το προηγούμενο. Επαναχρησιμοποιήστε τον χρήστη για **να παρακάμψετε τον έλεγχο κωδικού πρόσβασης**
- ARM64. Use after free: Δημιουργήστε ένα αντικείμενο χρήστη, απελευθερώστε το, δημιουργήστε ένα αντικείμενο που θα πάρει το απελευθερωμένο κομμάτι και επιτρέψτε να γράψει σε αυτό, **επικαλύπτοντας τη θέση του user->password** από το προηγούμενο. Επαναχρησιμοποιήστε τον χρήστη για **να παρακάμψετε τον έλεγχο κωδικού πρόσβασης**
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example)
- Το πρόγραμμα επιτρέπει τη δημιουργία σημειώσεων. Μια σημείωση θα έχει τις πληροφορίες της σημείωσης σε ένα malloc(8) (με έναν δείκτη σε μια συνάρτηση που θα μπορούσε να κληθεί) και έναν δείκτη σε άλλο malloc(<size>) με το περιεχόμενο της σημείωσης.
- Η επίθεση θα ήταν να δημιουργηθούν 2 σημειώσεις (note0 και note1) με μεγαλύτερο περιεχόμενο malloc από το μέγεθος των πληροφοριών της σημείωσης και στη συνέχεια να απελευθερωθούν ώστε να μπουν στο fast bin (ή tcache).
- Στη συνέχεια, δημιουργήστε μια άλλη σημείωση (note2) με μέγεθος περιεχομένου 8. Το περιεχόμενο θα είναι στη note1 καθώς το chunk θα επαναχρησιμοποιηθεί, όπου θα μπορούσαμε να τροποποιήσουμε τον δείκτη συνάρτησης ώστε να δείχνει στη συνάρτηση win και στη συνέχεια να χρησιμοποιήσουμε το Use-After-Free στη note1 για να καλέσουμε τον νέο δείκτη συνάρτησης.
- Το πρόγραμμα επιτρέπει τη δημιουργία σημειώσεων. Μια σημείωση θα έχει τις πληροφορίες της σημείωσης σε μια malloc(8) (με έναν δείκτη σε μια συνάρτηση που θα μπορούσε να κληθεί) και έναν δείκτη σε άλλη malloc(<size>) με το περιεχόμενο της σημείωσης.
- Η επίθεση θα ήταν να δημιουργηθούν 2 σημειώσεις (note0 και note1) με μεγαλύτερο περιεχόμενο malloc από το μέγεθος των πληροφοριών της σημείωσης και στη συνέχεια να απελευθερωθούν ώστε να μπουν στο γρήγορο bin (ή tcache).
- Στη συνέχεια, δημιουργήστε μια άλλη σημείωση (note2) με μέγεθος περιεχομένου 8. Το περιεχόμενο θα είναι στη note1 καθώς το κομμάτι θα επαναχρησιμοποιηθεί, όπου θα μπορούσαμε να τροποποιήσουμε τον δείκτη συνάρτησης ώστε να δείχνει στη συνάρτηση win και στη συνέχεια να χρησιμοποιήσουμε το Use-After-Free στη note1 για να καλέσουμε τον νέο δείκτη συνάρτησης.
- [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html)
- Είναι δυνατόν να δεσμεύσετε κάποια μνήμη, να γράψετε την επιθυμητή τιμή, να την απελευθερώσετε, να την επαναδεσμεύσετε και καθώς τα προηγούμενα δεδομένα είναι ακόμη εκεί, θα αντιμετωπιστούν σύμφωνα με τη νέα αναμενόμενη δομή στο chunk, καθιστώντας δυνατή την ρύθμιση της τιμής για να αποκτήσετε τη σημαία.
- Είναι δυνατόν να δεσμεύσετε κάποια μνήμη, να γράψετε την επιθυμητή τιμή, να την απελευθερώσετε, να την επαναδεσμεύσετε και καθώς τα προηγούμενα δεδομένα είναι ακόμα εκεί, θα αντιμετωπιστούν σύμφωνα με τη νέα αναμενόμενη δομή στο κομμάτι, καθιστώντας δυνατή την ρύθμιση της τιμής για να αποκτήσετε τη σημαία.
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
- Σε αυτή την περίπτωση είναι απαραίτητο να γράψετε 4 μέσα σε ένα συγκεκριμένο chunk το οποίο είναι το πρώτο που έχει δεσμευτεί (ακόμη και μετά την αναγκαστική απελευθέρωση όλων τους). Σε κάθε νέο δεσμευμένο chunk, ο αριθμός του αποθηκεύεται στον δείκτη του πίνακα. Στη συνέχεια, δεσμεύστε 4 chunks (+ το αρχικά δεσμευμένο), το τελευταίο θα έχει 4 μέσα του, απελευθερώστε τα και αναγκάστε την επαναδέσμευση του πρώτου, το οποίο θα χρησιμοποιήσει το τελευταίο chunk που απελευθερώθηκε, το οποίο είναι αυτό με 4 μέσα του.
- 2024 HITCON Quals Setjmp write-up (Quarkslab) πρακτική επίθεση first-fit / unsorted-split overlap: <https://ctftime.org/writeup/39355>
- Angstrom CTF 2024 *heapify* write-up εκμετάλλευση του splitting του unsorted-bin για να διαρρεύσει libc και να αποκτήσει επικαλύψεις: <https://hackmd.io/@aneii11/H1S2snV40>
- Σε αυτή την περίπτωση, είναι απαραίτητο να γράψετε 4 μέσα σε ένα συγκεκριμένο κομμάτι που είναι το πρώτο που δεσμεύεται (ακόμα και μετά την αναγκαστική απελευθέρωση όλων τους). Σε κάθε νέο δεσμευμένο κομμάτι, ο αριθμός του αποθηκεύεται στον δείκτη του πίνακα. Στη συνέχεια, δεσμεύστε 4 κομμάτια (+ το αρχικά δεσμευμένο), το τελευταίο θα έχει 4 μέσα του, απελευθερώστε τα και αναγκάστε την επαναδέσμευση του πρώτου, το οποίο θα χρησιμοποιήσει το τελευταίο κομμάτι που απελευθερώθηκε, το οποίο είναι αυτό με 4 μέσα του.
- 2024 HITCON Quals Setjmp write-up (Quarkslab) πρακτική επίθεση πρώτης εφαρμογής / υπερκάλυψης μη ταξινομημένων: <https://ctftime.org/writeup/39355>
- Angstrom CTF 2024 *heapify* write-up εκμετάλλευση της διαίρεσης μη ταξινομημένων για να διαρρεύσει τη libc και να αποκτήσει υπερκάλυψη: <https://hackmd.io/@aneii11/H1S2snV40>
{{#include ../../../banners/hacktricks-training.md}}