Σάββατο, 18 Νοέμβριος 2017, 4:37 πμ

Ευπάθεια out-of-bounts παρακάμπτει το ASLR

aslr vulnerability 0

Μια σημαντική ευπάθεια διορθώνεται με την τελευταία ενημέρωση του Internet Explorer, σύμφωνα με όσα αναφέρονται στο bulletin MS15-009. Εξαιτίας της ευπάθειας αυτή, ένας κακόβουλος χρήστης θα μπορούσε να παραβιάσει την τεχνολογία «address space layout randomization (ASLR)», που είναι από τις πιο βασικές στο κομμάτι του anti-exploit.

Η ευπάθεια έλαβε το αναγνωριστικό CVE-2015-0071, όμως για να χρησιμοποιηθεί σε μια επίθεση, θα πρέπει να συνδυαστεί με άλλη μία, μέσω της οποίας ο επιτιθέμενος μπορεί να «τρέξει κώδικα» στα μολυσμένα υπολογιστικά συστήματα. Στο παρελθόν παρατηρήθηκε ότι για τη συγκεκριμένη επίθεση «αξιοποιήθηκε» ευπάθεια του Adobe Flash (CVE-2014-9163), που όμως διορθώθηκε τον περασμένο Οκτώβριο.

Η ευπάθεια βρέθηκε στο module jscript9.dll. Για την ανάλυσή της, ο ερευνητής Henri Li της Trend Micro χρησιμοποίησε το αρχείο (version 9.0.8112.1645) σε λειτουργικό Windows 7 των 32 bit.

Τι διορθώθηκε;

Κατά την εξέταση των αλλαγών μεταξύ των δύο εκδόσεων (της patched και της unpatched) του αρχείου DLL, βρέθηκε μια αλλαγή στη συνάρτηση SetProperty.

aslr vulnerability 1
Συνάρτηση patched

 

aslr vulnerability 2
Συνάρτηση unpatched

 

Στην patched έκδοση, πρώτα καλείται η συνάρτηση Js::JavascriptRegExpConstructors::EnsureValues και στη συνέχεια ορίζεται η τιμή του property. Στην unpatched έκδοση δεν καλείται καθόλου η συγκεκριμένη συνάρτηση.

Μέσω της συνάρτησης EnsureValues μπορούμε να δούμε την πλήρη ανάλυση της ευπάθειας. Προηγουμένως όμως, πρέπει να εξηγήσουμε ορισμένες δομές δεδομένων που σχετίζονται με regular expressions.

Σχετιζόμενες δομές δεδομένων

Εδώ μπορείτε να δείτε τη σελίδα στη MSDN Library όπου εξηγούνται οι δομές δεδομένων που αποθηκεύουν τα αποτελέσματα regular expressions. Με τη χρήση σύνταξης JavaScript, προκύπτουν οι ακόλουθες ιδιότητες.

aslr vulnerability 3

Θα εστιάσουμε μόνο στις ακόλουθες ιδιότητες, που σχετίζονται με το παρόν άρθρο:

  • Input – το source string
  • lastMatch – το match string
  • $1-$9 – το sub-match string.

Πως εφαρμόζει αυτά ο Internet Explorer; Το κάνει στο αρχείο DLL jscript.dll. Χρησιμοποιεί την ακόλουθη δομή με την ονομασία Js::JavascriptRegExpConstructor, που αντιπροσωπεύει το global αντικειμένου RegExp, που χρησιμοποιείται για την αποθήκευση των αποτελεσμάτων μιας regular expression.

  • 0x24: pInputString (το source string)
  • 0x28: startIndex (αρχή του string lastMatch στο index pInputString)
  • 0x2c: length (το length του string lastMatch)
  • 0x30: isNeedUpdate (να γίνει update ή όχι στο σχετικό πεδίο)
  • 0x40: pUnmatchString
  • 0x44: pUnSearchString
  • 0x48: pLastMatchString (η διεύθυνση του matching string)
  • 0x4c: $1 (το string submatch 1)

Όλα τα παραπάνω sting έχουν την ακόλουθη δομή (named Js::SingleCharString):

  • 0x00: pVtable
  • 0x08: length (το length του string)
  • 0x0c: pString (δείκτης στην αρχική διεύθυνση του πίνακα) Demonstration

Θα χρησιμοποιηθεί για τους σκοπούς του παραδείγματος ο παρακάτω κώδικας (το δοκιμαστικό string χρησιμοποιείται συχνά από τη Microsoft σε παραδείγματα regular expressions):

var src = "Please send mail to [email protected] and [email protected] Thanks!";
pattern = “(george)”;
var re = new RegExp( pattern );
re.exec( src );
alert(RegExp.$1);

Μετά την εκτέλεση του re.exec, τα περιεχόμενα της μνήμης έχουν ως εξής:

aslr vulnerability 4
Περιεχόμενα του πίνακα μετά την εκτέλεση της re.exec

Η pInputString δείχνει στο string “Please send mail…”. Το lastMatch.startIndex είναι 0x14, το lastMatch.length είναι 0x06. Το isNeedUpdate είναι True. Τα υπόλοιπα πεδία έχουν ακόμα την αρχική τους τιμή. Για παράδειγμα το $1 έχει οριστεί σε string null. Μόνο τα τρία πεδία που αναφέρθηκαν νωρίτερα έχουν τροποποιηθεί.

Μετά την εκτέλεση της alert(RegExp.$1), τα περιεχόμενα της μνήμης έχουν ως εξής:

aslr vulnerability 5
Περιεχόμενα της μνήμης μετά την alert(RegExp.$1)

Μόλις γίνει αναφορά στο RegExp.$1, θα κληθεί η GetProperty όπως φαίνεται παρακάτω:

aslr vulnerability 6
Η εντολή GetProperty

Για την εμφάνιση της κατάλληλης τιμής, η GetProperty καλεί την EnsureValues για να κάνει update στα πεδία που σχετίζονται με την JavascriptRegExpConstructor. Βλέπουμε ότι η isNeedUpdate έχει ορισθεί false και επίσης έχουν ορισθεί τα πεδία $1-$9.

Ας δούμε λεπτομερώς την EnsureValues. Η συνάρτηση αυτή είναι κάπως σύνθετη, οπότε θα αναφερθούμε μόνο στα τμήματα που σχετίζονται με την ευπάθεια που παρουσιάζουμε:

  1. Ελέγχει αν το isNeedUpdate είναι false. Αν ναι, τότε το update έχει ολοκληρωθεί, οπότε και η συνάρτηση επιστρέφει. Αλλιώς, πηγαίνει στο βήμα #2 για να κάνει update το αρχείο.
  2. Η EnsureValues χρησιμοποιεί τα αποτελέσματα των pInputString, beginIndex, length και re.exec για να υπολογίσει τα υπόλοιπα πεδία στην JavascriptRegExpConstructor.

Με παράδειγμα την RegExp.$1, ας δούμε πως η EnsureValues υπολογίζει για το $1.

  1. Η EnsureValues πρώτα χρησιμοποιεί το UnifiedRegex::RegexPattern::GetGroup για να πάρει την πληροφορία που σχετίζεται με το $1. Επιστρέφει τα startIndex, length και startIndex. Η αναπαράσταση της αρχικής διεύθυνσης του $1 γίνεται στο pInputString, το length είναι το length του $1.
  2. Κάλεσε την Js::SubString::New για να δημιουργήσεις το Js::SingleCharString. Οι παράμετροι αυτού είναι τα pInputString, startIndex και length. Η συνάρτηση επιστρέφει το $1_address.
  3. Όρισε το $1_address στο σχετικό πεδίο του JavascriptRegExpConstructor. Εδώ είναι 0x4c.

Έπειτα από τα παραπάνω, ας δούμε συγκεκριμένα την ευπάθεια και πως η Microsoft τη διόρθωσε.

Ανάλυσης της ευπάθειας

Ας θεωρήσουμε τον ακόλουθο κώδικα:

var src = "Please send mail to [email protected] and [email protected] Thanks!";
pattern = “(george)”;
var re = new RegExp( pattern );
re.exec( src );
RegExp.input = "123456"
alert(RegExp.$1);

Πριν τρέξουμε το alert(RegExp.$1), αν προσθέσουμε ένα statement πριν από αυτό, το jscript9.dll θα καλέσει τη Js::JavascriptRegExpConstructor::SetProperty. Στην unpatched έκδοση, αλλάζει μόνο το πεδίο pinputString του global αντικειμένου RegExp.

Έπειτα, γίνεται αναφορά στο RegExp.$1. Αφού το isneedUpdate είναι true, η συνάρτηση Js::JavascriptRegExpConstructor::GetProperty θα καλέσει την EnsureValues για να υπολογίσει τα υπόλοιπα πεδία.

Επειδή αλλάζει το inputString σε (errorinputString), θα γίνει χρήση αυτού για τον υπολογισμό των σχετικών πεδίων.

Αν η τιμή του $1.startIndex + $1.length(UnifiedRegex::RegexPattern::GetGroup) είναι μεγαλύτερη από αυτή του inputString, μπορούμε να χρησιμοποιήσουμε την τιμή του $1 για να προκαλέσουμε μια ανάγνωση out-of-bounds, παρακάμπτοντας το ASLR.

Αιτία της ευπάθειας

  1. Μόλις το regexp.exec ολοκληρώνει, η συνάρτηση απλά αποθηκεύει το inputString (στο εξής right_inputString) και τα index και length του string lastmatch.
  2. Μόλις ορίσουμε το RegExp.input, το RegExp έχει μόλις τροποποιήσει το πεδίο pInputString (στο εξής error_inputString), αλλά δεν έχει τροποποιήσει τα υπόλοιπα πεδία.
  3. Μόλις χρησιμοποιούμε το RegExp.$1 και διαβάζουμε το property, το RegExp θα χρησιμοποιήσει το πεδίο inputString(error_inputString) για να υπολογίσει τα υπόλοιπα πεδία.
  4. Αν το length του error_inputString είναι μικρότερο από το $1.startIndex+$1.length, μόλις γίνει αναφορά στο RegExp.$1, θα διαβάσει το error_inputString ως out-of-bounds.

Η αιτία της ευπάθειας αυτής φαίνεται να είναι τόσο απλή, όπως όταν ένας developer ξεχνάει να καλέσει την EnsureValues στη συνάρτηση SetProperty.

Λύσεις και προτάσεις

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

Μια σημαντική ευπάθεια διορθώνεται με την τελευταία ενημέρωση του Internet Explorer, σύμφωνα με όσα αναφέρονται στο bulletin MS15-009. Εξαιτίας της ευπάθειας αυτή, ένας κακόβουλος χρήστης θα μπορούσε να παραβιάσει την τεχνολογία «address space layout randomization (ASLR)», που είναι από τις πιο βασικές στο κομμάτι του anti-exploit. Η ευπάθεια έλαβε το…
Χρήσιμο
Ευανάγνωστο

User Rating: 4.7 ( 2 votes)
100

Δείτε επίσης:

All four major browsers take a stomping at Pwn2Own hacking competition

Pwn2Own: Όλοι οι browsers παραβιάστηκαν!

Ο ετήσιος διαγωνισμός hacking με την ονομασία Pwn2Own 2015, ο οποίος διενεργήθηκε στο Βανκούβερ, ολοκληρώθηκε επιτυχώς και …