Σοβαρή ασφάλεια: Το GnuTLS ακολουθεί το OpenSSL, διορθώνει το σφάλμα χρονικής επίθεσης

Σοβαρή ασφάλεια: Το GnuTLS ακολουθεί το OpenSSL, διορθώνει το σφάλμα χρονικής επίθεσης

Κόμβος πηγής: 1956368

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

Μαζί με αυτά τα σφάλματα μνήμης, αναφέραμε επίσης ένα σφάλμα μεταγλωττισμένο CVE-2022-4304: Timing Oracle σε αποκρυπτογράφηση RSA.

Σε αυτό το σφάλμα, η εκτόξευση του ίδιου κρυπτογραφημένου μηνύματος ξανά και ξανά σε έναν διακομιστή, αλλά η τροποποίηση της συμπλήρωσης στο τέλος των δεδομένων για να καταστήσει τα δεδομένα άκυρα, προκαλώντας έτσι κάποιου είδους απρόβλεπτη συμπεριφορά…

…δεν θα χρειαζόταν σταθερό χρόνο, υποθέτοντας ότι ήσασταν κοντά στον στόχο στο δίκτυο που θα μπορούσατε να μαντέψετε αξιόπιστα πόσο χρόνο θα διαρκούσε το μέρος της διαδικασίας μεταφοράς δεδομένων.

Δεν επεξεργάζονται όλα τα δεδομένα εξίσου

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

Ακόμα κι αν δεν είστε βέβαιοι πόσος χρόνος καταναλώνεται στο δίκτυο, μπορείτε να αναζητήσετε παραλλαγές στους χρόνους μετ' επιστροφής απορρίπτοντας πολλά αιτήματα και συλλέγοντας πολλά δείγματα.

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

Από αυτό, πολλοί είστε σε θέση να συμπεράνετε κάτι σχετικά με τη δομή, ή ακόμα και το περιεχόμενο, των αρχικών μη κρυπτογραφημένων δεδομένων που υποτίθεται ότι κρατούνται μυστικά σε κάθε επαναλαμβανόμενο αίτημα.

Ακόμα κι αν μπορείτε να εξαγάγετε μόνο ένα byte απλού κειμένου, αυτό δεν υποτίθεται ότι συμβαίνει.

Τα λεγόμενα επιθέσεις συγχρονισμού αυτού του είδους είναι πάντα ενοχλητικό, ακόμα κι αν χρειαστεί να στείλετε εκατομμύρια πλαστά πακέτα και να τα χρονομετρήσετε όλα για να έχετε πιθανότητες να ανακτήσετε μόνο ένα byte δεδομένων απλού κειμένου…

…επειδή τα δίκτυα είναι πιο γρήγορα, πιο προβλέψιμα και ικανά να χειριστούν πολύ περισσότερο φορτίο από ό,τι πριν από λίγα χρόνια.

Μπορεί να πιστεύετε ότι εκατομμύρια δόλια πακέτα που σας στέλνουν ανεπιθύμητα μηνύματα, ας πούμε, την επόμενη ώρα θα ξεχώριζαν σαν αντίχειρας.

Αλλά "ένα εκατομμύριο πακέτα την ώρα περισσότερο ή λιγότερο από το συνηθισμένο" απλά δεν είναι πλέον μια ιδιαίτερα μεγάλη παραλλαγή.

Παρόμοιο σφάλμα "oracle" στο GnuTLS

Λοιπόν, το ίδιο άτομο που ανέφερε το σφάλμα χρονισμού σφάλματος που διορθώθηκε επιτέλους στο OpenSSL ανέφερε επίσης ένα παρόμοιο σφάλμα στο GnuTLS περίπου την ίδια στιγμή.

Αυτό έχει το αναγνωριστικό σφάλματος CVE-2023-0361.

Αν και το GnuTLS δεν είναι τόσο δημοφιλές ή ευρέως χρησιμοποιούμενο όσο το OpenSSL, πιθανότατα έχετε πολλά προγράμματα στο IT σας ή ακόμα και στον υπολογιστή σας που το χρησιμοποιούν ή το περιλαμβάνουν, συμπεριλαμβανομένων πιθανώς FFmpeg, GnuPG, Mplayer, QEMU , Rdesktop, Samba, Wget και Wireshark.

Κατά ειρωνικό τρόπο, το σφάλμα χρονισμού στο GnuTLS εμφανίστηκε σε κώδικα που υποτίθεται ότι καταγράφει αρχικά σφάλματα χρονομέτρησης.

Όπως μπορείτε να δείτε από τη διαφορά κώδικα (Diff) παρακάτω, ο προγραμματιστής γνώριζε ότι οποιαδήποτε υπό όρους (if ... then) η λειτουργία που χρησιμοποιείται για τον έλεγχο και την αντιμετώπιση ενός σφάλματος αποκρυπτογράφησης μπορεί να προκαλέσει διακυμάνσεις χρονισμού, επειδή οι CPU γενικά χρειάζονται διαφορετικό χρόνο ανάλογα με τον τρόπο με τον οποίο ο κώδικάς σας πηγαίνει μετά από μια εντολή "διακλάδωσης".

(Αυτό ισχύει ιδιαίτερα για έναν κλάδο που συχνά πηγαίνει προς τη μία κατεύθυνση και σπάνια προς την άλλη, επειδή οι CPU τείνουν να θυμούνται ή να αποθηκεύουν προσωρινά τον κώδικα που εκτελείται επανειλημμένα για να βελτιώσουν την απόδοση, κάνοντας έτσι τον κώδικα που λαμβάνεται σπάνια να εκτελείται αισθητά πιο αργό.)

Διαφορά κωδικού gnutls-3.7.8/lib/auth/rsa.c έναντι 3.7.9

Αλλά ο προγραμματιστής ήθελε ακόμα να καταγράψει ότι μπορεί να συμβεί μια επίθεση, κάτι που συμβαίνει εάν το if (ok) Το παραπάνω τεστ αποτυγχάνει και διακλαδίζεται στο else { ... } τμήμα.

Σε αυτό το σημείο, ο κωδικός καλεί το _gnutls_debug_log() λειτουργία, η οποία θα μπορούσε να πάρει αρκετό χρόνο για να κάνει τη δουλειά της.

Επομένως, ο κωδικοποιητής εισήγαγε μια σκόπιμη κλήση στο _gnutls_no_log() στο then { ... } μέρος του κώδικα, το οποίο προσποιείται ότι καταγράφει μια «επίθεση» όταν δεν υπάρχει, προκειμένου να προσπαθήσει να εξισορροπήσει τον χρόνο που ξοδεύει ο κώδικας προς οποιαδήποτε κατεύθυνση που if (ok) μπορεί να λάβει η οδηγία υποκαταστήματος.

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

Τι να κάνω;

Εάν είστε προγραμματιστής: η διόρθωση σφαλμάτων εδώ ήταν απλή και ακολουθούσε την αρχή "λιγότερο είναι περισσότερο".

Ο κώδικας με το ροζ παραπάνω, ο οποίος θεωρήθηκε ότι δεν παρέχει τρομερά χρήσιμα δεδομένα ανίχνευσης επίθεσης, απλώς διαγράφηκε, με την αιτιολογία ότι ο κώδικας που δεν υπάρχει δεν μπορεί να μεταγλωττιστεί κατά λάθος, ανεξάρτητα από τις ρυθμίσεις κατασκευής σας…

…και ο κώδικας που δεν έχει μεταγλωττιστεί δεν μπορεί ποτέ να εκτελεστεί, είτε τυχαία είτε σχεδιασμένος.

Εάν είστε χρήστης GnuTLS: την έκδοση που κυκλοφόρησε πρόσφατα 3.7.9 και τη "γεύση του νέου προϊόντος" 3.8.0 συμπεριλάβετε αυτήν την επιδιόρθωση, μαζί με διάφορες άλλες.

Εάν εκτελείτε διανομή Linux, ελέγξτε για ενημερώσεις σε οποιαδήποτε κεντρικά διαχειριζόμενη έκδοση κοινόχρηστης βιβλιοθήκης του GnuTLS που διαθέτετε, καθώς και για εφαρμογές που διαθέτουν τη δική τους έκδοση.

Στο Linux, αναζητήστε αρχεία με το όνομα libgnutls*.so για να βρείτε τυχόν κοινόχρηστες βιβλιοθήκες και να αναζητήσετε gnutls-cli για να βρείτε τυχόν αντίγραφα του βοηθητικού προγράμματος της γραμμής εντολών που περιλαμβάνεται συχνά στη βιβλιοθήκη.

Μπορείτε να τρέξετε gnutls-cli -vv για να μάθετε ποια έκδοση του libgnutls συνδέεται δυναμικά με:

 $ gnutls-cli -vv gnutls-cli 3.7.9 <-- η διανομή Linux μου έλαβε την ενημέρωση την περασμένη Παρασκευή (2023-02-10)

Σφραγίδα ώρας:

Περισσότερα από Γυμνή ασφάλεια