Relro

Support HackTricks

Relro

RELRO σημαίνει Relocation Read-Only, και είναι μια λειτουργία ασφαλείας που χρησιμοποιείται σε δυαδικά αρχεία για να μετριάσει τους κινδύνους που σχετίζονται με τις GOT (Global Offset Table) υπεργραφές. Υπάρχουν δύο τύποι προστασίας RELRO: (1) Μερική RELRO και (2) Πλήρης RELRO. Και οι δύο αναδιοργανώνουν την GOT και BSS από αρχεία ELF, αλλά με διαφορετικά αποτελέσματα και επιπτώσεις. Συγκεκριμένα, τοποθετούν την ενότητα GOT πριν από την BSS. Δηλαδή, η GOT βρίσκεται σε χαμηλότερες διευθύνσεις από την BSS, καθιστώντας έτσι αδύνατη την υπεργραφή των καταχωρήσεων GOT μέσω υπερχείλισης μεταβλητών στην BSS (θυμηθείτε ότι η εγγραφή στη μνήμη συμβαίνει από χαμηλότερες προς υψηλότερες διευθύνσεις).

Ας αναλύσουμε την έννοια σε δύο διακριτούς τύπους για σαφήνεια.

Μερική RELRO

Μερική RELRO ακολουθεί μια απλούστερη προσέγγιση για να ενισχύσει την ασφάλεια χωρίς να επηρεάζει σημαντικά την απόδοση του δυαδικού αρχείου. Η Μερική RELRO καθιστά το .got μόνο για ανάγνωση (το μη-PLT μέρος της ενότητας GOT). Λάβετε υπόψη ότι το υπόλοιπο της ενότητας (όπως το .got.plt) είναι ακόμα εγγράψιμο και, επομένως, επιρρεπές σε επιθέσεις. Αυτό δεν αποτρέπει την κακή χρήση της GOT από τρωτά σημεία αυθαίρετης εγγραφής.

Σημείωση: Από προεπιλογή, ο GCC συντάσσει δυαδικά αρχεία με Μερική RELRO.

Πλήρης RELRO

Πλήρης RELRO ενισχύει την προστασία καθιστώντας ολόκληρη την GOT (τόσο .got όσο και .got.plt) και την ενότητα .fini_array εντελώς μόνο για ανάγνωση. Μόλις ξεκινήσει το δυαδικό αρχείο, όλες οι διευθύνσεις συναρτήσεων επιλύονται και φορτώνονται στην GOT, στη συνέχεια, η GOT σημειώνεται ως μόνο για ανάγνωση, αποτρέποντας αποτελεσματικά οποιεσδήποτε τροποποιήσεις σε αυτήν κατά τη διάρκεια της εκτέλεσης.

Ωστόσο, το κόστος με την Πλήρη RELRO είναι σε όρους απόδοσης και χρόνου εκκίνησης. Επειδή χρειάζεται να επιλύσει όλα τα δυναμικά σύμβολα κατά την εκκίνηση πριν σημειώσει την GOT ως μόνο για ανάγνωση, τα δυαδικά αρχεία με ενεργοποιημένη την Πλήρη RELRO ενδέχεται να έχουν μεγαλύτερους χρόνους φόρτωσης. Αυτή η επιπλέον επιβάρυνση εκκίνησης είναι ο λόγος που η Πλήρης RELRO δεν είναι ενεργοποιημένη από προεπιλογή σε όλα τα δυαδικά αρχεία.

Είναι δυνατόν να δείτε αν η Πλήρης RELRO είναι ενεργοποιημένη σε ένα δυαδικό αρχείο με:

readelf -l /proc/ID_PROC/exe | grep BIND_NOW

Bypass

Αν είναι ενεργοποιημένο το Full RELRO, ο μόνος τρόπος να το παρακάμψετε είναι να βρείτε έναν άλλο τρόπο που δεν χρειάζεται να γράψετε στον πίνακα GOT για να αποκτήσετε αυθαίρετη εκτέλεση.

Σημειώστε ότι ο πίνακας GOT της LIBC είναι συνήθως Partial RELRO, οπότε μπορεί να τροποποιηθεί με μια αυθαίρετη εγγραφή. Περισσότερες πληροφορίες στο Targetting libc GOT entries.

Support HackTricks

Last updated