Η ανατομία μιας ευπάθειας 37 ετών
Η ευπάθεια εντοπίστηκε στον τρόπο με τον οποίο το OpenBSD διαχειρίζεται τον μετρητή shm_nattch. Η χρήση ενός signed 16-bit short για την καταμέτρηση των προσαρτήσεων κοινόχρηστης μνήμης (shared memory attachments) επέτρεπε την υπερχείλιση του μετρητή σε αρνητική τιμή μέσω διαδοχικών κλήσεων fork(). Αυτό το σφάλμα, σε συνδυασμό με μια ξεχωριστή εγγραφή εκτός ορίων (out-of-bounds write), άνοιξε τον δρόμο για local privilege escalation.
Παράκαμψη μηχανισμών προστασίας
Η ομάδα της Calif κατάφερε να αποκτήσει root shell χωρίς τη χρήση ευπάθειας διαρροής πληροφοριών (information disclosure), παρά την ενεργοποίηση των KARL, SMAP και SMEP. Η διαδικασία περιέλαβε:
- Heap grooming για τον έλεγχο της διάταξης της μνήμης.
- Χρήση του
IPC_RMIDγια την επιτυχή έκβαση του race condition. - Χειραγώγηση των δομών
struct ip_moptionsγια την επίτευξη του 'write-what-where' primitive. - Τροποποίηση των PTE (Page Table Entries) για την εναλλαγή δικαιωμάτων πρόσβασης από user σε supervisor mode.
Προτάσεις για θωράκιση του πυρήνα
Για την αποτροπή παρόμοιων επιθέσεων στο μέλλον, προτείνονται τρεις βασικοί άξονες:
- Safe-unlinking: Εφαρμογή ελέγχων ακεραιότητας στις διπλά συνδεδεμένες λίστες (doubly linked lists) πριν από κάθε λειτουργία unlink, ώστε να αποτρέπεται η διαφθορά μνήμης.
- Τυχαιοποίηση PTE: Δυναμική επιλογή του slot του PML4 κατά την εκκίνηση, καθιστώντας τις διευθύνσεις των PTE μη προβλέψιμες.
- Απο-ντετερμινισμός του allocator: Εισαγωγή τυχαιοποίησης στη βάση και τη σειρά των δεσμεύσεων μνήμης, ώστε να εξαλειφθεί η προβλεψιμότητα των θέσεων των δομών δεδομένων.
Η έρευνα υπογραμμίζει ότι, ακόμη και σε λειτουργικά συστήματα με εξαιρετική φήμη για την ασφάλειά τους, η κληρονομιά παλαιού κώδικα (legacy code) παραμένει μια σημαντική πηγή κινδύνου που απαιτεί συνεχή έλεγχο και εκσυγχρονισμό των μηχανισμών άμυνας.