Πέμπτη 24 Απριλίου 2014

Heartbleed: Η καρδιά της ασφάλειας του διαδικτύου αιμορραγεί!


Αρκετοί είπαν πως είναι το χειρότερο κενό ασφαλείας στην ιστορία του διαδικτύου. Σίγουρα όμως είναι το κενό ασφαλείας που έλαβε την μεγαλύτερη προσοχή από τα μέσα ενημέρωσης τα τελευταία χρόνια. Και όχι άδικα: το κενό αυτό, που όπως φαίνεται υπήρχε εδώ και δύο χρόνια, άφησε ευάλωτα μερικά από τα μεγαλύτερα site, όπως το facebook και το google. Πρόκειται για το heartbleed, ένα κενό ασφαλείας στην πιο διαδεδομένη υλοποίηση του TLS, το openSSL.

To TLS είναι το πιο διαδεδομένο πρωτόκολλο προστασία των ηλεκτρονικών μας επικοινωνίες. Είναι (μεταξύ άλλων) το γνωστό λουκέτο που βλέπουμε όταν επισκεπτόμαστε μια ασφαλή σελίδα (π.χ. https://www.facebook.com).  Η πιο δημοφιλείς υλοποίηση του TLS είναι το openSSL, μια δωρεάν υλοποίηση, ανοιχτού λογισμικού, που χρησιμοποιείται στα πιο γνωστά site.

To 2012 η IETF δημοσιοποίησε μια επέκταση για το TLS με την ονομασία heartbeat. Η επέκταση αυτή επιτρέπει στο να εντοπίζει κάποιος κόμβος αν μια ασφαλή σύνδεση έχει διακοπεί. Πως επιτυγχάνεται αυτό: εφόσον δύο κόμβοι έχουν δημιουργήσει μια ασφαλή σύνδεση μεταξύ τους, οποιαδήποτε στιγμή, κάποιος από τους δυο μπορεί να στείλει ένα heartbeat μήνυμα, το οποίο ο άλλος πρέπει να το επαναλάβει.

Ας δούμε λοιπόν τις τεχνικές λεπτομέρειες του προβλήματος. Στην παρακάτω εικόνα φαίνεται η δομή ενός heartbeat μηνύματος

Η μεταβλητή payload_length δείχνει το μέγεθος του μηνύματος το οποίο είναι αποθηκευμένο στη μεταβλητή payload. Ας αγνοήσουμε τα υπόλοιπα πεδία. Στην επόμενη εικόνα φαίνεται ένα κομμάτι του κώδικα του openSSL που χειρίζεται αυτά τα μηνύματα


Στην γραμμή 2414 ο κώδικας αναθέτει στην μεταβλητή payload την τιμή του πεδίου payload_length. Στην γραμμή 2431 ο κώδικας δεσμεύει τόση μνήμη όση το payload συν κάποιες μεταβλητές και στην γραμμή 2437 ο κώδικας αντιγράφει στην δεσμευμένη μνήμη το heartbeat μήνυμα. Τέλος στην γραμμή 2439 δημιουργείται η απάντηση προς τον χρήστη. Ποιο είναι το πρόβλημα εδώ λοιπόν; Το πρόβλημα είναι στο ότι ο κώδικας δεν ελέγχει αν η μεταβλητή payload_length ανταποκρίνεται όντως στο μέγεθος του heartbeat μηνύματος: αν η μεταβλητή αυτή είναι μεγαλύτερη από το μήκος του μηνύματος, τότε ο κώδικας ξεκινάει και αντιγράφει στην γραμμή 2431 δεδομένα που υπάρχουν στην μνήμη του server που δημιουργεί την απάντηση! Φαίνεται μάλιστα πως αυτή είναι μια ειδικά προστατευμένη μνήμη όπου αποθηκεύονται ευαίσθητα δεδομένα όπως το ιδιωτικό κλειδί του server και οι κωδικοί των χρηστών.

Το bug αυτό μπορεί να το εκμεταλλευτεί οποιοσδήποτε πολύ εύκολα Φαίνεται μάλιστα πως η NSA το ήξερε από καιρό, αφού σύμφωνα με το Bloomberg1 η NSA χρησιμοποιούσε αυτό το bug τα τελευταία 2 χρόνια για να υποκλέψει ευαίσθητα δεδομένα.

Παραπομπές:
  1. M. Riley, "NSA Said to Exploit Heartbleed Bug for Intelligence for Years," Bloomberg, 12 Απρ. 2014, τελευταία πρόσβαση 24 Απρ. 2014 [online]