Περίληψη |
Το λογισμικό, όπως οι φυλλομετρητές διαδικτύου, οι εφαρμογές προβολής και
επεξεργασίας εγγράφων, μπορούν να επεκτείνουν την λειτουργικότητά τους
υποστηρίζοντας την εκτέλεση script σε
ένα εικονικό περιβάλλον. Για παράδειγμα, όλοι
οι φυλλομετρητές διαδικτύου υποστηρίζουν την εκτέλεση κώδικα JavaScript. Αρχικά, η
εκτέλεση γινόταν σε ένα διερμηνέα. Ωστόσο, η εκτέλεση script σε διερμηνέα έχει
μειωμένη απόδοση σε σύγκριση με την εκτέλεση κώδικα μηχανής, με αποτέλεσμα οι
εξελιγμένες μηχανές JavaScript να υποστηρίζουν πλέον παραγωγή εντολών κώδικα
μηχανής σε πραγματικό
χρόνο.
Η παραγωγή κώδικα σε πραγματικό χρόνο εισάγει νέο κώδικα στην διεργασία που
εκτελείται, ο οποίος, εκτός αν προστατευθεί κατάλληλα, μπορεί να δημιουργήσει
επιπρόσθετα ρίσκα ασφαλείας. Η προστασία αυτού του δυναμικού κώδικα είναι
περισσότερο πολύπλοκη σε σχέση με την προστασία εκτελέσιμων ή πηγαίου κώδικα.
Ενώ τα εκτελέσιμα και ο πηγαίος κώδικας μπορούν να αναλυθούν στατικά και να
εφαρμοσθούν πολύπλοκοι αλγόριθμοι, ο δυναμικός κώδικας μπορεί μόνο να αναλυθεί
κατά τη διάρκεια της εκτέλεσης. Αυτό
είναι πολύ σημαντικό, καθώς ο λόγος ύπαρξης του
δυναμικού κώδικα είναι η γρηγορότερη εκτέλεση, κάτι που μπορεί να μειωθεί σημαντικά
με την εφαρμογή τέτοιων
αλγορίθμων.
Σε αυτή την εργασία, εφαρμόζουμε ενα σύνολο από προτεινόμενες αμυντικές τεχνικές
σε μία σύγχρονη μηχανή JavaScript, το ChakraCore, και μελετάμε την επίδρασή τους στην
απόδοση. Εφαρμόζουμε διαφορετικές λύσεις και με διάφορους συνδυασμούς, και
δείχνουμε πως συγκεκριμένες τεχνικές μπορούν να μειώσουν σημαντικά το κέρδος που
προσφέρει η παραγωγή κώδικα σε πραγματικό
χρόνο.
Ανάμεσα στις άμυνες που αξιολογούμε είναι το Control Flow Guard, μια καινοτόμος
υλοποίηση Control Flow Integrity από τη Microsoft, η οποία είναι διαθέσιμη
αποκλειστικά σε Windows 8.1 και Windows 10. Κυρίως επικεντρωνόμαστε στο να
επεκτείνουμε τον υπάρχοντα μηχανισμό κωδικοποίησης σταθερών κατά την παραγωγή
κώδικα, καθώς και εισάγουμε την κωδικοποίηση σταθερών που δημιουργούνται
έμμεσα, όπως για παράδειγμα αυτές που εμφανίζονται κατά την παραγωγή κώδικα σε
μπλοκ υπό συνθήκη. Ο
στόχος των αμυντικών τεχνικών που υλοποιούμε και αναλύουμε
είναι να αποτρέψουν επιθέσεις Return Oriented Programming (ROP), είτε σταματώντας
την παραβίαση της ροής εκτέλεσης του προγράμματος, είτε ανεβάζοντας τον πήχη για
τον επιτιθέμενο κατά την κατασκευή
των απαραίτητων ROP gadgets.
|