Relro

Reading time: 4 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

Relro

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

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

Partial RELRO

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

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

Full RELRO

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

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

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

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

Bypass

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

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

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