To HyperThreading παρουσιάζει ένα σοβαρό κενό ασφαλείας – UPDATED !!!!!!!!

Ένας ερευνητής παρουσίασε σε ένα συνέδριο για το FreeBSD ένα κενό ασφαλείας στην υλοποίηση του HyperThreading της Intel που επιτρέπει σε μια συνδυασμένη επίθεση σε ένα σύστημα με ενεργοποιημένη την εν λόγω τεχνολογία να υποκλέψει κρυπτογραφικά κλειδιά που χρησιμοποιούνται σε αλγορίθμους για ασφάλεια.

Links :
http://www.daemonology.net/hyperthreading-considered-harmful/

To paper όπου παρουσιάζεται το κενό ασφαλείας και ο τρόπος να γίνει exploit καθώς και τρόποι αντιμετώπισης είναι το ακόλουθο :
http://www.daemonology.net/papers/htt.pdf

Για να μην σπείρουμε πάντως πανικό, το πρόβλημα αναμένεται να επηρρεάσει server συστήματα και όχι desktop.

—— UPDATE —–

Τα παρακάτω αποτελούν μια σύντομη επεξήγηση του προβλήματος, μιας και ζητήθηκε να γίνει κατανοητό.

1. Τι είναι το HyperThreading με πολύ απλά λόγια

Το HyperThreading είναι μια υλοποίηση μιας γενικότερης τεχνικής με την επονομασία Simultaneous Multithreading ή πιο σύντομα SMT. Σε αδρές γραμμές ένας superscalar επεξεργαστής περιλαμβάνει έναν αριθμό από execution units, τις οποίες πολλές φορές δεν μπορεί να διατηρήσει fully utilized. Αυτό μπορεί να συμβαίνει για πολλούς λόγους, μερικοί από τους οποίους είναι η καθυστέρηση που προκύπτει όταν εμφανίζεται κάποιο miss στην cache και πρέπει να προσπελαστούν πιο αργές μνήμες, όταν υπάρχουν αλληλεξαρτήσεις μεταξύ των εντολών ενός προγράμματος, όταν ένα πρόγραμμα περιλαμβάνει εντολές μόνο ενός είδους (π.χ. μόνο integer και όχι floating point αριθμητική), όταν συμβαίνουν miss-predicted branches κτλ. Το SMT αναφέρεται στην δυνατότητα διαμοιρασμού των resources ενός επεξεργαστή σε περισσότερα από ένα execution threads.
Στην περίπτωση του HyperThreading, ο επεξεργαστής διατηρεί την cpu state δύο διαφορετικών threads ταυτόχρονα (με τον όρο cpu state εννοούμε, τους καταχωρητές, τα flags και τα λοιπά χαρακτηριστικά ενός επεξεργαστή που περιγράφουν την κατάσταση που βρίσκεται μια δεδομένη στιγμή) με αποτέλεσμα να φαίνεται σε έναν εξωτερικό παρατηρητή σαν 2 λογικοί επεξεργαστές στους οποίους μπορούν να χρονοπρογραμματιστούν διεργασίες (ή αλλιώς threads προς εκτέλεση). Στην πράξη, τα δύο threads δεν τρέχουν ακριβώς ταυτόχρονα, αλλά όταν για κάποιο λόγο δημιουργηθεί κάποιο stall σε ένα από τα threads (π.χ. γιατί απαιτείται πρόσβαση στην κεντρική μνήμη ή ακόμα χειρότερα στον σκληρό δίσκο) ενεργοποιείται άμεσα και πολύ γρήγορα το άλλο thread.
Στην υλοποίηση του HyperThreading η Intel για λόγους απόδοσης αλλά και οικονομίας χώρου στο ολοκληρωμένο έχει επιλέξει εκτός των resources του επεξεργαστή, τα threads να διαμοιράζονται και τις cache μνήμες. Σε αντίθεση λοιπόν με έναν single-threaded επεξεργαστή, ένας επεξεργαστής με ενεργοποιημένο το HyperThreading δεν θα “καθαρίσει” πλήρως την L1 cache όταν γίνει κάποιο context switch (αλλαγή περιβάλλοντος όταν αλλάζει η διεργασία που εκτελείται στον επεξεργαστή) αλλά μια σειρά από εντολές του thread που εκτελούνταν προηγουμένως θα παραμείνουν στην μνήμη.

2. Το πρόβλημα ασφαλείας

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

Αν υποθέσουμε ότι μια διεργασία που αναλαμβάνει την κρυπτογράφηση τρέχει σε έναν επεξεργαστή, τότε τα δεδομένα που χρησιμοποιεί πολύ συχνά είναι πάρα πολύ πιθανό να παραμένουν στις cache του επεξεργαστή. Εφόσον για την κωδικοποίηση των δεδομένων χρησιμοποιούνται συνεχώς τα ίδια κλειδιά, τότε αυτά έχουν αυξημένη πιθανότητα να υπάρχουν στις cache του επεξεργαστή. Αν στον επεξεργαστή εκτός από την διεργασία κρυπτογράφησης τρέχει και μια δεύτερη unprivileged διεργασία και ο επεξεργαστής έχει ενεργοποιημένο το HyperThreading είναι δυνατόν η δεύτερη διεργασία να κάνει monitor την cache που χρησιμοποιεί η άλλη διεργασία και να μπορεί να μάθει ένα μέρος των περιεχομένων της.
Έτσι ένας κακόβουλος χρήστης θα μπορούσε να περιμένει να εκτελεστεί μια κωδικοποίηση με κάποιο κλειδί και να μάθει με αυτόν τον τρόπο κάποιο σημαντικό μέρος της πληροφορίας του κλειδιού. Με αρκετή επανάληψη, τα περισσότερα bits του κλειδιού μπορούν να μαθευτούν και στην συνέχεια ένα ολόκληρο κλειδί μπορεί να καθοριστεί μέσω πιθανοτικής ανάλυσης. To exploit αυτό αναφέρεται ως timing attack.