ΠΡΟΛΟΓΟΣ

 

Αναμφισβήτητα σήμερα(2003) το πρόβλημα των επιθέσεων που βασίζονται στην Αδυναμία Υπερχείλισης της Μνήμης ή Buffer Overflow Vulnerability των εφαρμογών είναι το μεγαλύτερο πρόβλημα ασφάλειας των υπολογιστών της τελευταίας δεκαπενταετίας. Συγκεκριμένα σήμερα το 35% (http://www.lodoga.co.uk/attackinfo/thethreat/statistics.htm) περίπου των επιθέσεων σε ένα υπολογιστικό σύστημα που είναι συνδεμένο στο Internet βασίζεται σε αυτή την αδυναμία. Το αξιοσημείωτο είναι ότι αυτό το πρόβλημα είχε παρουσιαστεί από το 1960 (βλέπε αναφορά στο άρθρο http://news.com.com/2100-1001-233483.html?legacy=cnet&tag=st.ne.1002.bgif%3fst.ne.fd.gif.l) όταν η πολυτέλεια της χρήσης του υπολογιστή ήταν για τους λίγους, ενώ η κύρια χρήση του υπολογιστή ήταν για την επίλυση σύνθετων μαθηματικών προβλημάτων. Αν και το πρόβλημα ήταν ιδιαίτερα γνωστό στους προγραμματιστές τότε έγινε η επιλογή της συμβίωσης με αυτό.

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

Πόσο μοιραία ήταν αυτή η επιλογή αποδείχτηκε με την εμφάνιση του πρώτου σκουλικιού(Worm) του Internet το 1987 που σχεδιάστηκε από τον Morris και η εξάπλωση του βασιζόταν σε αδυναμίες Buffer Overflow των τότε UNIX συστημάτων. Το Worm αυτό έδειξε ότι η αδυναμία Buffer Overflow των υπολογιστικών συστημάτων μπορεί να γίνει πολλές φορές πιο καταστροφική για τα ίδια τα συστήματα όταν αυτά δικτυώνονται. Με την εμφάνιση του Worm του Morris αποδειχτηκέ ότι οι αδυναμίες Buffer Overflow θα ήταν ένα μεγάλο πρόβλημα ασφάλειας για τα πληροφοριακά συστήματα του internet μέχρι αυτές να απαλειφθούν εντελώς.

Έτσι ένα από τα πάγια θέματα που απασχολούν τον τομέα της Ασφάλειας των Υπολογιστών είναι να αντιμετωπίσει τέτοια προβλήματα όπως την εκμετάλλευση των αδυναμιών Buffer Overflow δηλαδή τα Buffer Overflow Exploits. Οι προσπάθειες της λύσης του προβλήματος είναι πολλές και το αντιμετωπίζουν από διάφορες πλευρές.

Παρά τις διάφορες προσπάθειες το πρόβλημα των αδυναμιών Buffer Overflow είναι ένα θέμα που δεν έχει λυθεί ακόμα. Οι λύσεις που έχουν προταθεί κατά καιρούς σε αυτό το πρόβλημα είναι πολλές και συνήθως προσπαθούν να αντιμετωπίσουν μόνο ορισμένες πλευρές του προβλήματος και όχι να το εξαλείψουν ολοκληρωτικά. Αυτό φυσικά συμβαίνει γιατί η μοναδική σίγουρη λύση που γνωρίζουμε μέχρι σήμερα είναι να ξαναγραφτούν οι βασικές εφαρμογές από την αρχή κάτι που προς το παρών αποφεύγεται για διάφορους λόγους. Ο βασικότερος λόγος είναι η πολυπλοκότητα της λύσης αυτής και η άμεση συνέπεια του που είναι το οικονομικό κόστος.

Γενικά τις διάφορες λύσεις που έχουν προταθεί κατά καιρούς για το πρόβλημα μπορούμε να τις χωρίσουμε σε δύο μεγάλες κατηγορίες. Στην πρώτη κατηγόρια ανήκουν οι μέθοδοι που προσπαθουν να κλείσουν τις αδυναμίες Buffer Overflow ώστε να μην μπορεί να συμβεί κάποιο Buffer Overflow Exploit. Στην δεύτερη κατηγορία ανήκουν οι μέθοδοι που προσπαθούν να εμποδίσουν τα ίδια τα Buffer Overflow Exploit να βλάψουν το σύστημα.

Οι λύσεις της πρώτης κατηγορίας έχουν σαν κύριο στόχο να απαλείφουν τα Buffer Overflow Vulnerabilities κατά την παραγωγή μίας εφαρμογής. Μερικές από τις πιο συνηθισμένες λύσης αυτής της κατηγορίας αναφέρονται στο κεφάλαιο 3 αυτής της πτυχιακής. Πολύ λίγες από αυτές τις λύσεις έχουν χρησιμοποιηθεί μέχρι σήμερα στην παραγωγή και ο βασικός λόγος είναι ότι μπορούν να προσφέρουν λογισμικό χωρίς αδυναμίες Buffer Overflow μόνο αν μία εφαρμογή ξανασχεδιαστεί από την αρχή και μόνο αν σε αυτή δεν χρησιμοποιηθεί παλιός κώδικας.

Η δεύτερη μεγάλη κατηγορία αντιμετώπισης των Buffer Overflow Exploit είναι αυτή που έχει ιδιαίτερο ενδιαφέρον. Στην κατηγορία αυτή ανήκει κάθε μέθοδος που σαν στόχο έχει τον εντοπισμό(Detection) των ίδιων των Buffer Overflow Exploits και όχι των αδυναμιών ευάλωτου(Vulnerable) λογισμικού σε τέτοιου είδους επιθέσεις. Το βασικό χαρακτηριστικό που κάνει όλες αυτές τις λύσεις να έχουν ιδιαίτερο ενδιαφέρον είναι ότι αυτές προσπαθούν να εμποδίσουν τα Buffer Overflow Exploits αφού ένα σύστημα έχει μπει σε παραγωγική διαδικασία. Η πιο γνωστή λύση αυτή της κατηγορίας είναι τα Anti-Virus που εντοπίζουν εκτός από διάφορες άλλες οικογένειες επιθέσεων και αυτή των Buffer Overflow Exploits. Το βασικό μειονέκτημα που έχουν αυτές οι λύσεις μέχρι σήμερα είναι ότι δεν μπορούν να εμποδίσουν τα Buffer Overflow Exploits πριν αυτά γνωστοποιηθούν.

Ο σκοπός αυτής της πτυχιακής είναι να παρουσιάσει μία νέα μέθοδο αντιμετώπισης των Buffer Overflow Exploits και την εφαρμογή της που βασίζεται σε μία τεχνική που ονομάζεται Abstract Execution of Payload(A.E.P.). Η μέθοδος αυτή έχει σαν στόχο να εντοπίζει τα Buffer Overflow Exploit και μάλιστα πριν αυτά γνωστοποιηθούν. Η εφαρμογή της μεθόδου αυτής που έγινε από τον συγγραφέα της πτυχιακής, είναι ένα module του Network Intrusion Detection System (NIDS) που λέγεται Snort. Για να μπορέσει να γίνει κατανοητή η εφαρμογή αυτής της άλλα και η ίδια η μεθόδος χρειάζεται να γίνει προηγουμένως κατανοητό τι είναι ένα Buffer Overflow Exploit καθώς και τα ιδιαίτερα χαρακτηριστικά του.

Για να εξυπηρετηθεί αυτός ο σκοπός, η εργασία αυτή χωρίζεται σε δύο μέρη. Το πρώτο μέρος έχει σαν βασικό στόχο να δώσει στον αναγνώστη όσο το δυνατόν ποίο σφαιρική εικόνα για τα Buffer Overflow Exploits καθώς και τα βασικότερα από τα χαρακτηριστικά που δυσκολεύουν τον εντοπισμό τους από συνηθισμένα εργαλεία όπως τα Anti-Virus. Το δεύτερο μέρος παρουσιάζει αναλυτικά την μέθοδο του Abstract Execution of Payload ώστε να εντοπίζονται τα Buffer Overflow Exploits αλλά και πώς καταλήγουμε σε αυτή την μέθοδο. Επίσης στο δεύτερο μέρος παρουσιάζεται η υλοποίηση της μεθόδου εντοπισμού A.E.P σαν Module του Snort 2.0.

Συγκεκριμένα στο Κεφάλαιο 1 γίνεται μία επισκόπιση (Overview) των αιτιών που οφείλονται τα Buffer Overflow Vulnerabilities δηλαδή οι αδυναμίες υπερχείλισεις αλλά και πώς χτίζονται τα Buffer Overflow Exploits, από τους κακόβουλους χρήστες (Hackers), με σκοπό να εκμεταλλευτούν αυτές τις αδυναμίες.

Στο Κεφάλαιο 2 γίνεται μια αναλυτικότερη περιγραφή για το πώς χτίζονται τα Buffer Overflow Exploit με σκοπό να παρουσιαστούν όλες οι σημαντικότερες ιδιαιτερότητες τους ώστε να γίνει κατανοητή η μέθοδος εντοπισμού A.E.P(Abstract Execution of Payload). Συγκεκριμένα παρουσιάζεται μέσα απο την διαδικασία χτισήματος των Buffer Overflow Exploit γιατί το καθένα από αυτά θα μπορουσε να χαρακτηριστεί σαν «μοναδικό». Η μοναδικότητα αυτή οφείλεται στην ανάγκη να ληφθούν υπόψη ένα μεγάλο σύνολο από παραμέτρους όπως οι ιδιετερότητες της εφαρμογής που θα δεχτεί την επίθεση ή την πλατφόρμα που αυτή η εφαρμογή εκτελειται.

Η βασικές έννοιες που παρουσιάζονται στο κεφάλαιο 2 είναι οι ακολουθίες RET, το ShellCode και το Sledge. Στην αρχή περιγράφονται οι ακολουθίες RET ή RA (Return Address) και το ShellCode που αποτελούν την καρδιά ενός B.O.E. Στην συνέχεια γίνεται μια αναλυτική περιγραφή του τμήματος ενός Buffer Overflow Exploit που λέγεται Sledge και η χρησιμότητα του. Επίσης μέσο απλών παραδειγμάτων τεκμηριώνεται πόσο σημαντικό είναι το Sledge για να αυξηθεί η πιθανότητα επιτυχίας τoυ Β.Ο.Ε αλλά και πότε αυτό είναι περιττό. Εκτός από τις τρείς αυτές βασικές έννοιες παρουσιάζονται οι μέθοδοι που οι Hacker διαμορφώνουν τα BOE ώστε να αποφεύγουν διάφορα εμπόδια όπως τα φίλτρα των εφαρμογών ή Anti-Virus. Τέλος στο Κεφάλαιο 2 παρουσιάζονται τα Heap Based Buffer Overflow που είναι η πιο περίπλοκη μορφή των Buffer Overflow Exploits.

Στο Κεφάλαιο 3 γίνεται μια σύντομη επισκόπηση των πιό συνηθισμένων μεθόδων αντιμετώπισης των Buffer Overflow Exploit αλλά και των Buffer Overflow Vulnerabilities. Οι μέθοδοι αυτοί δεν παρουσιάζονται με σκοπό να συγκριθούν με την τεχνική εντοπισμού A.E.P. Ο σκοπός αυτού του κεφαλαίου είναι να δώσει μια γενική εικόνα για τις προσπάθειες που έχουν γίνει για την αντιμετώπιση του προβλήματος και να γίνει κατανοητό ότι καμία από τις προσπάθειες αυτές δεν λύνει το πρόβλημα συνολικά.

Στο Κεφάλαιο 4 γίνεται μια αναλυτική περιγραφή αφενός του ίδιου τον αλγόριθμο Abstract Execution of Payload και το πως ο αλγόριθμος αυτός χρησιμοποιείται σαν μέθοδος εντοπισμού των Βuffer Overflow Exploits, αφετέρου παρουσιάζεται πώς καταλήγουμε σε αυτή την μέθοδο. Συγκεκριμένα παρουσιάζεται η έννοια της «εκτελεσιμότητας» και πώς αυτή είναι το βασικό κριτήριο που χρησιμοποιεί ο αλγόριθμος A.E.P για να εντοπίζει τα B.O.E. H «εκτελεσιμότητα» είναι ένα χαρακτητριστικό που παρουσιάζεται έντονα στα πακέτα των δικτύων που περιέχουν B.O.E και συγκεκριμένα οφείλεται στο sledge τους.

Στην ανάλυση του Αλγορίθμου A.E.P παρουσιάζεται η εξάρτιση του από δύο βασικούς παράγοντες το Instruction Set του επεξεργαστή του υπολογιστικού συστήματος, αλλά και το Threshold. Η εξάρτηση του από το πρώτο είναι μοιραία γιατί μόνο έτσι μπορεί να εξεταστεί αν παρουσιάζεται «εκτελεσιμοτητα» και σε τι βαθμό μέσα στο Payload ενός πακέτου. Στην συνέχεια παρουσιάζεται η ανάγκη του Threshold δηλαδή η ανάγκη για ένα Κατώφλι που θα διαχωρίζει τα πακέτα που περιέχουν Buffer Overflow Exploits από αυτά που δεν περιέχουν. Όπως θα δει αναλυτικά ο αναγνώστης η ανάγκη για Threshold προκύπτει από το γεγονός ότι ακόμα και σε πακέτα που δεν περιέχουν εκτελέσιμες εντολές του επεξεργαστή (Instruction Set) παρουσιάζεται έστω και σε μικρό βαθμό η εκτελεσιμότητα. Επίσης παρουσιάζεται η σύμπτωση της ύπαρξης της «εκτελεσημότητας» σε πακέτα που δεν έχουν BOE όπου από αυτή προκύπτει η ανάγκη του Threshold.

Επίσης στο Κεφάλαιο 4 παρουσιάζονται μερικές πειραματικές μετρήσεις που έχουν γίνει στον αλγόριθμο A.E.P και πώς από αυτές τις μετρήσεις αποδεικνύεται ότι με το κατάλληλο Threshold είναι δυνατόν να χρησιμοποιηθεί αυτή η μέθοδος για να εντοπίζει τα Buffer Overflow Exploits με πολύ καλά αποτελέσματα. Ακόμα παρουσιάζονται οι δυσκολίες της ενσωμάτωσης του αλγόριθμου A.E.P σαν Module του Snort 2.0 ή οποιουδήποτε άλλου NIDS. Τέλος σε αυτό το κεφάλαιο παρουσιάζεται το πώς αυτή η μέθοδος είναι πιθανόν να έχει αρκετά μεγάλη επιτυχία ακόμα και σε ειδικές περιπτώσεις Β.Ο.Ε.

Τέλος στο κεφάλαιο 5 παρουσιάζεται αναλυτικά η δομή του Snort Module που κάνει τον εντοπισμό των Buffer Overflow Exploits μέσα σε ένα δίκτυο. Για να καταλάβει κάποιος πώς δουλευει αυτό το Module στο κεφάλαιο αυτό γινεται μια σύντομη παρουσίαση του Snort 2.0. To Snort είναι ένα Open Source NIDS δηλαδή ένα Network Intrusion Detection System. To Snort όπως και όλα τα NIDS έχει σαν βασικό ρόλο να παρακολουθεί τα πακέτα ενός δικτύου με σκοπό να ειδοποιεί τον Administrator ενός δικτύου όταν το δίκτυο του δέχεται κάποια επίθεση. Τέλος στο κεφάλαιο αυτό παρουσιάζεται ο πηγαίος κώδικας του Module με αναλυτικά σχολεία.

 

Copyright © 2004
Powered by Internet Systematics Lab