Συνθήκη αγώνα στον συλλέκτη σκουπιδιών πυρήνα Linux που μπορεί να οδηγήσει σε κλιμάκωση των προνομίων

Ο Jann Horn από την ομάδα του Google Project Zero, ο οποίος κάποτε εντόπισε τα τρωτά σημεία Spectre και Meltdown, δημοσίευσε μια τεχνική για την εκμετάλλευση μιας ευπάθειας (CVE-2021-4083) στον συλλέκτη σκουπιδιών του πυρήνα του Linux. Η ευπάθεια οφείλεται σε μια συνθήκη κούρσας κατά τον καθαρισμό των περιγραφέων αρχείων σε υποδοχές unix και δυνητικά επιτρέπει σε έναν τοπικό μη προνομιούχο χρήστη να εκτελέσει τον κώδικά του σε επίπεδο πυρήνα.

Το πρόβλημα είναι ενδιαφέρον γιατί το χρονικό παράθυρο κατά το οποίο εμφανίζεται η συνθήκη αγώνα εκτιμήθηκε ότι ήταν πολύ μικρό για να δημιουργηθούν πραγματικές εκμεταλλεύσεις, αλλά ο συγγραφέας της μελέτης έδειξε ότι ακόμη και τέτοιες αρχικά σκεπτικιστικές ευπάθειες μπορούν να γίνουν η πηγή πραγματικών επιθέσεων εάν ο δημιουργός του exploit έχει τις απαραίτητες δεξιότητες και χρόνο. Ο Yann Horn έδειξε πώς, με τη βοήθεια χειρισμών φιλιγκράν, μπορείτε να μειώσετε τη συνθήκη race που εμφανίζεται όταν καλείτε ταυτόχρονα τις συναρτήσεις close() και fget() σε μια πλήρως εκμεταλλεύσιμη ευπάθεια χρήσης-μετά-δωρεάν και να επιτύχετε πρόσβαση σε δεδομένα που έχουν ήδη ελευθερωθεί δομή μέσα στον πυρήνα.

Μια συνθήκη κούρσας εμφανίζεται κατά τη διαδικασία κλεισίματος ενός περιγραφέα αρχείου ενώ καλείται η close() και η fget() ταυτόχρονα. Η κλήση για κλείσιμο() μπορεί να προκύψει πριν από την εκτέλεση της fget(), κάτι που θα προκαλέσει σύγχυση στον συλλέκτη απορριμμάτων επειδή, σύμφωνα με την επανακαταμέτρηση, η δομή του αρχείου δεν θα έχει εξωτερικές αναφορές, αλλά θα παραμείνει συνδεδεμένη με τον περιγραφέα αρχείου, π.χ. Ο συλλέκτης σκουπιδιών θα πιστεύει ότι έχει αποκλειστική πρόσβαση στη δομή, αλλά στην πραγματικότητα, για ένα σύντομο χρονικό διάστημα, η υπόλοιπη καταχώρηση στον πίνακα περιγραφών αρχείων θα εξακολουθεί να δείχνει την απελευθέρωση της δομής.

Για να αυξηθεί η πιθανότητα να μπείτε σε μια συνθήκη αγώνα, χρησιμοποιήθηκαν πολλά κόλπα, τα οποία κατέστησαν δυνατή την αύξηση της πιθανότητας επιτυχίας της εκμετάλλευσης στο 30% κατά την εισαγωγή βελτιστοποιήσεων ειδικά για το σύστημα. Για παράδειγμα, για να αυξηθεί ο χρόνος πρόσβασης σε μια δομή με περιγραφείς αρχείων κατά αρκετές εκατοντάδες νανοδευτερόλεπτα, τα δεδομένα απομακρύνθηκαν από την κρυφή μνήμη του επεξεργαστή γεμίζοντας την κρυφή μνήμη με δραστηριότητα σε έναν άλλο πυρήνα CPU, γεγονός που κατέστησε δυνατή την ανάκτηση της δομής από τη μνήμη και όχι από η γρήγορη κρυφή μνήμη της CPU.

Το δεύτερο σημαντικό χαρακτηριστικό ήταν η χρήση διακοπών που δημιουργούνται από έναν χρονοδιακόπτη υλικού για την αύξηση του χρόνου συνθηκών αγώνα. Η στιγμή επιλέχθηκε έτσι ώστε ο χειριστής διακοπής να πυροδοτεί όταν συνέβαινε μια συνθήκη αγώνα και να διακόψει την εκτέλεση του κώδικα για κάποιο χρονικό διάστημα. Για να καθυστερήσει περαιτέρω η επιστροφή του ελέγχου, δημιουργήθηκαν περίπου 50 χιλιάδες καταχωρήσεις στην ουρά αναμονής χρησιμοποιώντας το epoll, το οποίο απαιτούσε αναζήτηση μέσω του χειριστή διακοπής.

Η τεχνική για την εκμετάλλευση της ευπάθειας αποκαλύφθηκε μετά από μια περίοδο μη αποκάλυψης 90 ημερών. Το πρόβλημα εμφανίζεται από τον πυρήνα 2.6.32 και επιδιορθώθηκε στις αρχές Δεκεμβρίου. Η ενημέρωση κώδικα συμπεριλήφθηκε στον πυρήνα 5.16 και μεταφέρθηκε επίσης στους κλάδους LTS του πυρήνα και των πακέτων πυρήνα που παρέχονται σε διανομές. Αξίζει να σημειωθεί ότι η ευπάθεια εντοπίστηκε κατά την ανάλυση ενός παρόμοιου προβλήματος CVE-2021-0920, το οποίο εκδηλώνεται στον συλλέκτη απορριμμάτων κατά την επεξεργασία της σημαίας MSG_PEEK.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο