Αυτός είναι ένας πολύ συγκεκριμένος τύπος εκμετάλλευσης που μαστίζει όλα τα είδη λογισμικού.
Το Use-After-Free (UAF) είναι μια πρωτόγονη ευπάθεια καταστροφής της μνήμης που εξακολουθεί να αποτελεί σημαντική απειλή για όλους τους τύπους λογισμικού, από λειτουργικά συστήματα έως λογισμικό εφαρμογών. Αυτό το κρίσιμο ελάττωμα ασφαλείας παρουσιάζεται όταν ένα στοιχείο εφαρμογής προσπαθεί να αποκτήσει πρόσβαση σε δεδομένα σε μια διεύθυνση μνήμης που έχει ήδη ελευθερωθεί, εξ ου και το όνομα — χρήση μετά τη δωρεάν.
Τα τρωτά σημεία του UAF μπορεί να οδηγήσουν σε πιθανή εκμετάλλευση λογισμικού ή ακόμα και σε συμβιβασμό του συστήματος. Δείτε ποια είναι η ευπάθεια UAF, γιατί συμβαίνει και πώς μπορείτε να προστατεύσετε το λογισμικό σας από μια ευπάθεια UAF.
Ποια είναι η ευπάθεια χρήσης-μετά-δωρεάν (UAF);
Πριν βουτήξουμε στην ευπάθεια Χρήση-Μετά-Δωρεάν, ας κάνουμε ένα βήμα πίσω και ας κατανοήσουμε ορισμένα βασικά στοιχεία της διαχείρισης της μνήμης. Όταν εκτελείται ένα πρόγραμμα, τα δεδομένα και ο κώδικάς του φορτώνονται στη μνήμη.
Η διαχείριση μνήμης είναι η διαδικασία διαχείρισης του τρόπου αποθήκευσης (ονομάζεται εκχώρηση μνήμης) και αφαίρεσης (ονομάζεται κατανομή μνήμης) δεδομένων και κώδικα στη μνήμη με τον βέλτιστο τρόπο. Τα δύο κύρια τμήματα μνήμης όπου αποθηκεύονται τα δεδομένα προγράμματος είναι η στοίβα και ο σωρός.
Στα προγράμματα μπορεί να εκχωρηθεί χώρος μνήμης στατικά στη στοίβα και δυναμικά στο σωρό. Μια ευπάθεια χρήσης μετά την ελεύθερη χρήση παρουσιάζεται όταν οι προγραμματιστές δεν διαχειρίζονται σωστά τη δυναμική εκχώρηση και κατανομή μνήμης στα προγράμματά τους. Αυτό σημαίνει ότι η κατηγορία τρωτών σημείων UAF είναι ένας τύπος εκμετάλλευσης σωρού. Για να κατανοήσετε καλύτερα αυτήν την ευπάθεια, βοηθάει να έχετε μια ισχυρή κατανόηση πώς λειτουργούν οι δείκτες στον προγραμματισμό.
Use-After-Free (UAF) όπως υποδηλώνει το όνομα, είναι ένας τύπος ευπάθειας καταστροφής της πρωτόγονης μνήμης που εμφανίζεται όταν ένα αντικείμενο που έχει ήδη που αποδεσμεύεται από τη μνήμη γίνεται ξανά πρόσβαση που οδηγεί σε σφάλματα ή ακούσιες συνέπειες όπως διαρροές μνήμης, κλιμάκωση προνομίων (EOP) ή αυθαίρετος κωδικός εκτέλεση. Ας μάθουμε πώς εμφανίζεται αρχικά αυτή η κατάσταση και πώς γίνεται η εκμετάλλευση της.
Πώς αξιοποιείται η χρήση μετά την ελεύθερη χρήση (UAF);
Το Use-After-Free (UAF), όπως υποδηλώνει το όνομα, είναι μια πρωτόγονη ευπάθεια καταστροφής της μνήμης που εμφανίζεται όταν ένα πρόγραμμα συνεχίζει να έχει πρόσβαση σε τοποθεσίες μνήμης που έχει ελευθερώσει. Ας ρίξουμε μια ματιά σε ένα παράδειγμα κώδικα:
#περιλαμβάνω <stdio.h>
#περιλαμβάνω <stdlib.h>
ενθκύριος(){
ενθ *MUO = malloc (μέγεθος(ενθ));
*MUO = 69420;
printf("Τιμή: %d\n", *MUO);
δωρεάν (MUO);
printf("Τιμή;: %d\n", *MUO);
ΕΠΙΣΤΡΟΦΗ0;
}
Θα μπορούσατε να εντοπίσετε την ευπάθεια; Όπως μπορείτε να δείτε, σε αυτόν τον κώδικα, το MUO Ο δείκτης εκχωρείται από τη μνήμη χρησιμοποιώντας το Ελεύθερος() συνάρτηση, αλλά καλείται ξανά στην επόμενη γραμμή χρησιμοποιώντας το printf() λειτουργία. Αυτό οδηγεί σε απροσδόκητη συμπεριφορά του προγράμματος και ανάλογα με το πού υπάρχει η ευπάθεια στο λογισμικό, μπορεί να αξιοποιηθεί για να αποκτήσει κλιμάκωση προνομίων και διαρροές μνήμης.
Πώς να μειώσετε τη χρήση-μετά-δωρεάν;
Το UAF συμβαίνει λόγω λαθών στον προγραμματισμό μιας εφαρμογής. Υπάρχουν μερικές προφυλάξεις που μπορείτε να λάβετε για να αποφύγετε τα τρωτά σημεία Χρήσης-Μετά-Δωρεάν στο λογισμικό σας.
Ακολουθούν μερικές βέλτιστες πρακτικές που μπορείτε να υιοθετήσετε για να ελαχιστοποιήσετε τα τρωτά σημεία καταστροφής της μνήμης στο λογισμικό σας:
- Χρήση γλωσσών προγραμματισμού που είναι ασφαλείς για μνήμη, όπως η Rust, με ενσωματωμένους μηχανισμούς για την αποφυγή πρωτόγονων ευπάθειας καταστροφής της μνήμης, όπως UAF, Buffer Overflows κ.λπ. Εάν χρησιμοποιείτε γλώσσες προγραμματισμού όπως η C/C++, είναι πιο πιθανό να εισάγετε σφάλματα μνήμης στον κώδικά σας. Για τον ίδιο λόγο, ακόμη και λειτουργικά συστήματα όπως τα Windows και το Linux μεταναστεύουν σιγά σιγά στο Rust. Θα πρέπει επίσης να εξετάσετε μαθαίνοντας για το Rust εάν δημιουργείτε προγράμματα χαμηλού επιπέδου.
- Εκτός από τη χρήση μιας γλώσσας που είναι ασφαλής για τη μνήμη, συνιστάται να ακολουθείτε τις βέλτιστες πρακτικές, όπως η ρύθμιση ενός δείκτη σε τιμή NULL μετά την απελευθέρωσή του, για να αποφευχθεί τυχόν εισαγωγή ευπάθειας Χρήσης-Μετά-Δωρεάν.
- Μπορείτε επίσης να εφαρμόσετε τεχνικές όπως η One Time Allocation (OTA) που εμποδίζουν τους εισβολείς να έχουν πρόσβαση στην ελευθερωμένη μνήμη αντικείμενα και μια πολιτική αυστηρού κύκλου ζωής αντικειμένων, που βοηθά στην παρακολούθηση κάθε αντικειμένου μνήμης που εκχωρείται και κατανεμηθεί. Λάβετε υπόψη, ωστόσο, ότι αυτές οι υλοποιήσεις ενδέχεται να αυξήσουν τη μνήμη και την απόδοση.
Παραδείγματα πραγματικού κόσμου ευπάθειας χρήσης-μετά-δωρεάν (UAF).
Η ευπάθεια Use-After-Free (UAF) έχει ανακαλυφθεί και αξιοποιηθεί σε διάφορα σενάρια πραγματικού κόσμου, από προγράμματα περιήγησης ιστού έως πυρήνα Android έως καθημερινές εφαρμογές. Αυτό δείχνει την ανάγκη για προληπτικά μέτρα ασφαλείας. Μερικά πραγματικά παραδείγματα UAF περιλαμβάνουν:
- Προγράμματα περιήγησης στο Διαδίκτυο: Τα τρωτά σημεία του UAF σε προγράμματα περιήγησης ιστού έχουν αξιοποιηθεί για την εκτέλεση αυθαίρετου κώδικα, την παραβίαση του απορρήτου των χρηστών και την εκτέλεση επιθέσεων απομακρυσμένης εκτέλεσης κώδικα. Ένα πρόσφατο παράδειγμα θα ήταν το CVE-2021-38008, το οποίο εκμεταλλεύτηκε μια ευπάθεια UAF στο Google Chrome, επιτρέποντας στους φορείς απειλών να εκτελούν αυθαίρετο κώδικα εξ αποστάσεως στον υπολογιστή-θύμα.
- Λειτουργικά συστήματα: Οι ευπάθειες UAF που εντοπίστηκαν στους πυρήνες Windows/Linux/Android επέτρεψαν στους εισβολείς να αποκτήσουν αυξημένα προνόμια, να παρακάμψουν μηχανισμούς ασφαλείας και να αποκτήσουν επιμονή. Υπάρχει μια πληθώρα ευπαθειών UAF που έχουν βρεθεί και εξακολουθούν να βρίσκονται σε πυρήνες λειτουργικών συστημάτων μέχρι σήμερα. Τη στιγμή της σύνταξης αυτού του κειμένου, το CVE-2023-3269, κυκλοφόρησε δημόσια μια ακόμη ευπάθεια UAF στον πυρήνα του Linux που οδηγεί σε κλιμάκωση των προνομίων. Το CVE-2022-23270 είναι ένα παράδειγμα ευπάθειας UAF στον πυρήνα των Windows.
- Εφαρμογές λογισμικού: Τα τρωτά σημεία του UAF σε εφαρμογές λογισμικού έχουν αξιοποιηθεί για τον χειρισμό του προγράμματος συμπεριφορά, που οδηγεί σε αποκάλυψη πληροφοριών, αυθαίρετη εκτέλεση κώδικα, συντριβή προγράμματος και στη χειρότερη περίπτωση, προνόμιο κλιμάκωση. Πολλές εφαρμογές λογισμικού ήταν και εξακολουθούν να είναι επιρρεπείς σε επιθέσεις UAF. Αυτά τα λογισμικά είναι κυρίως προγράμματα C/C++ που έχουν αναπτυχθεί με αναποτελεσματικές και μη ασφαλείς προσεγγίσεις διαχείρισης μνήμης.
Για να μάθετε περισσότερα σχετικά με τα τρωτά σημεία Use-After-Free σε εφαρμογές πραγματικού κόσμου, μπορείτε να ελέγξετε το επίσημο MITER CVE σελίδα λίστας και ταξινόμηση κατά λέξη-κλειδί Χρήση-Μετά-Δωρεάν.
Η αποτελεσματική κατανομή μνήμης βοηθά να γίνει το λογισμικό ασφαλές
Η βέλτιστη και καλά μελετημένη εκχώρηση μνήμης προστατεύει τις εφαρμογές σας από το να πέσουν θύματα κοινών πρωτόγονων ευπαθειών καταστροφής της μνήμης.
Το UAF μαζί με το Time Of Check Time of Use (TOCTOU), τις συνθήκες αγώνα και τις Buffer Overflows (BOF) είναι μερικά από τα πιο συχνά αξιοποιούμενα τρωτά σημεία μνήμης. Όλα αυτά μπορούν να αποφευχθούν μαθαίνοντας πώς γίνεται η διαχείριση της μνήμης του προγράμματός σας από την πλατφόρμα στην οποία εκτελείται. Αυτό σας δίνει σαφήνεια για το πώς το λειτουργικό σύστημα εκχωρεί το πρόγραμμά σας στη μνήμη και σας εξοπλίζει με τα εργαλεία για να σχεδιάσετε λογισμικό για βέλτιστη απόδοση και ασφάλεια.
Εάν δεν το έχετε κάνει ήδη, μπορείτε να ξεκινήσετε κατανοώντας πώς γίνεται η διαχείριση μνήμης στο Linux, το πιο χρησιμοποιούμενο λειτουργικό σύστημα διακομιστή στον κόσμο.