The advent of computational systems has brought forth significant advancements, but concurrently, it has accentuated the urgency for secure and robust software. Security analysis techniques, specifically static code analysis, have been at the forefront of this pursuit. Inspired by the ability to examine code without executing it, these techniques offer the potential to detect vulnerabilities in systems effectively, including data flow issues, control flow complications, and complex security vulnerabilities. Compared to their traditional counterparts, modern computational systems present unique challenges. These systems often operate in environments where system integrity is paramount and any potential security vulnerability could lead to significant damage. This necessitates the implementation of mechanisms that provide rigorous vulnerability detection while maintaining system performance. The focal point of the present thesis is the application of static Python code analysis for the detection of security vulnerabilities in computational systems. A variety of techniques have been explored, including linting, control flow analysis, data flow analysis, complexity analysis, and pattern matching. Various methodologies for identifying security vulnerabilities are also investigated, such as input validation, output encoding, authentication and access control, cryptography, exception handling, buffer overflow, SQL injection, and file handling. A Python-based program is developed, utilizing these static code analysis techniques for comprehensive security evaluation. This tool probes IP addresses, URLs, API calls, and deploys anti-debugging and anti-virtualization strategies. Further, it scrutinizes the entropy of a file for potential obfuscation and contrasts the file against databases of known viruses via a cloud-based solution. It concludes with a basic dynamic analysis of the application’s source code, performed in a virtual environment. The outcomes of this research emphasize the significant role of Python static code analysis in maintaining the integrity of computational systems. The effective implementation of these techniques, along with appropriate software and a series of optimization steps, have the potential to provide solutions to prevalent security issues in computational systems, solidifying their place in a rapidly evolving digital landscape.
Τα υπολογιστικά συστήματα έχουν γίνει αναπόσπαστο μέρος της καθημερινότητάς μας με τον έναν ή τον άλλο τρόπο. Όσο αυξάνεται η απήχηση τους, το ίδιο αυξάνεται και η ανάγκη για ισχυρούς μηχανισμούς ασφαλείας για την προστασία τους από πιθανές απειλές και ευπάθειες ασφαλείας. Σε αυτό το πλαίσιο, έρχεται η Στατική Ανάλυση Κώδικα. Είναι μια μέθοδος εντοπισμού σφαλμάτων εξετάζοντας τον πηγαίο κώδικα πριν από την εκτέλεση ενός προγράμματος. Είναι ζωτικής σημασίας γιατί μας βοηθά να εντοπίζουμε σφάλματα ή ευπάθειες ασφαλείας νωρίς στον κύκλο ανάπτυξης των λογισμικών, εξοικονομώντας χρόνο και πόρους, και στην ουσία χρήμα. Ο στόχος, ο πυρήνας δηλαδή αυτής της διπλωματικής, είναι να αξιοποιήσουμε τη Στατική Ανάλυση Κώδικα για να βελτιώσουμε τον εντοπισμό ευπαθειών ασφαλείας στα Υπολογιστικά Συστήματα. Μέσω αυτής της έρευνας, επιτυγχάνεται η ενίσχυση των επιδόσεων και της αποτελεσματικότητας εντοπισμού πιθανών απειλών για την ασφάλεια, συμβάλλοντας έτσι στη δημιουργία ασφαλέστερων συστημάτων.
Σε όλη τη πορεία αυτής της έρευνας, αποκτήθηκε εις βάθος γνώση σε τρεις βασικούς τομείς. Αρχικά, έγινε εμβαθύνση στις διάφορες τεχνικές που χρησιμοποιούνται στην Στατική Ανάλυση Κώδικα.
Αυτό περιλαμβάνει μεθόδους όπως το linting, το οποίο βοηθά στον εντοπισμό πιθανών προγραμματιστικών σφαλμάτων, και την ανάλυση ροής ελέγχου, που εξετάζει τη διαδρομή εκτέλεσης ενός προγράμματος. Στη συνέχεια, μελετήθηκε ο χώρος των κοινών ευπαθειών ασφαλείας. Αυτός καλύπτει πιθανά αδύναμα σημεία σε συστήματα που μπορούν να αξιοποιηθούν, όπως ζητήματα με επικύρωση εισόδου, αυθεντικοποίηση, και υπερχείλιση προσωρινής μνήμης. Τέλος, εξετάστηκε ο ενδιαφέρον κόσμος των τεχνικών ανίχνευσης κακόβουλων λογισμικών. Μελετήθηκε ο εντοπισμός βάσει υπογραφής και βάσει συμπεριφοράς, ο ρόλος της μηχανικής μάθησης στον εντοπισμό κακόβουλων προγραμμάτων και πολλά άλλα. Αυτός ο συνδυασμός γνώσεων μου έδωσε μια πιο σφαιρική κατανόηση των διαφορετικών πτυχών της κυβερνοασφάλειας στα υπολογιστικά συστήματα και έθεσε τις βάσεις για την υλοποίηση της εφαρμογής που αναπτύχθηκε στα πλαίσια της παρούσας διπλωματικής.
Ας εμβαθύνουμε στις τεχνικές ανάλυσης στατικού κώδικα που μελετήθηκαν. Αλλά πρώτα, τι είναι η Στατική Ανάλυση Κώδικα; Με απλά λόγια, είναι η διαδικασία εντοπισμού σφαλμάτων του πηγαίου κώδικα ενός προγράμματος χωρίς να το εκτελέσουμε, απλά διαβάζοντας τον κώδικα του (python ή κώδικας μηχανής). Μία από τις θεμελιώδεις τεχνικές που εξετάσαμε είναι το linting. Αυτό βοηθά στον εντοπισμό προγραμματιστικών σφαλμάτων, bugs, στιλιστικών σφαλμάτων και ύποπτων δομών δεδομένων. Είναι σαν να έχετε ένα αυτοματοποιημένο μηχάνημα διόρθωσης του κώδικά σας! Μελετήθηκε επίσης η ανάλυση ροής ελέγχου, μια μέθοδος που παρέχει μια προβολή όλων των πιθανών διαδρομών εκτέλεσης του προγράμματος. Βοηθά στην αποκάλυψη προβλημάτων που σχετίζονται με τις δομές ελέγχου του προγράμματος, όπως άπειρους βρόχους ή μη προσβάσιμο κώδικα. Στη συνέχεια, εξετάστηκε η ανάλυση ροής δεδομένων, η οποία μας βοηθά να κατανοήσουμε πώς μετακινούνται τα δεδομένα ενός προγράμματος. Είναι ένα εξαιρετικό εργαλείο για την αποκάλυψη ζητημάτων που σχετίζονται με δεδομένα, όπως η χρήση μη αρχικοποιημένων δεδομένων.
Συνεχίζοντας την εξερεύνηση των τεχνικών Στατικής Ανάλυσης Κώδικα, έχουμε την ανάλυση πολυπλοκότητας. Αυτή η διαδικασία αξιολογεί τους πόρους που χρειάζεται ένα πρόγραμμα καθώς εκτελείται, είτε είναι χρόνος είτε χώρος. Μας βοηθάει να κατανοήσουμε την αποτελεσματικότητα του κώδικά μας. Και μετά ερχόμαστε στο Pattern Matching, την αντιστοίχιση μοτίβου, μια τεχνική που θυμίζει την φράση «ψάχνω βελόνα μέσα στ’ άχυρα». Περιλαμβάνει την εύρεση συγκεκριμένων ακολουθιών δεδομένων που ταιριάζουν με ένα προκαθορισμένο μοτίβο ή ένα σύνολο κανόνων. Αυτό είναι ιδιαίτερα χρήσιμο για τον εντοπισμό ορισμένων τύπων ευπαθειών ασφαλείας ή κακών πρακτικών στον κώδικα. Μέσω αυτών των τεχνικών, προσπαθούμε να εξετάσουμε τον πηγαίο κώδικα ενός προγράμματος με ολοκληρωμένο τρόπο για να εντοπίσουμε πιθανές ευπάθειες ή μη αποδοτικές τεχνικές.
Ο εντοπισμός των ευπαθειών ασφαλείας είναι παρόμοιος με τον εντοπισμό αδύναμων κρίκων στην άμυνά μας. Ας συζητήσουμε μερικές βασικές τεχνικές για την εύρεση τέτοιων ευπαθειών. Η πρώτη γραμμή άμυνας είναι συχνά η «Επικύρωση εισόδου». Αυτή η τεχνική διασφαλίζει ότι μόνο σωστά μορφοποιημένα δεδομένα εισέρχονται στο σύστημά μας, μετριάζοντας έτσι τις απειλές από κακόβουλες εισόδους χρηστών. Η «Κωδικοποίηση εξόδου» είναι μια άλλη σημαντική τεχνική. Διασφαλίζει ότι τα δεδομένα εξόδου του προγράμματός μας δεν μπορούν να ερμηνευθούν ως εκτελέσιμες εντολές, τις οποίες θα μπορούσαν να τις εκμεταλλευτούν κακόβουλοι χρήστες. Τέλος, εμβαθύνουμε στην «Αυθεντικοποίηση και έλεγχος πρόσβασης». Αυτή η θεμελιώδης τεχνική ασφάλειας προσδιορίζει ποιος μπορεί να έχει πρόσβαση στο σύστημά μας και ποιες ενέργειες μπορούν να εκτελέσουν. Επιβάλλοντας αυστηρούς ελέγχους πρόσβασης, περιορίζουμε την πιθανότητα μη εξουσιοδοτημένων ενεργειών.
Συνεχίζοντας, εξετάστηκε η "Κρυπτογράφηση". Αυτή η τεχνική κρυπτογραφεί ευαίσθητες πληροφορίες για να αποτρέψει τη μη εξουσιοδοτημένη πρόσβαση, λειτουργώντας ως κλειδαριά στις ψηφιακές μας πόρτες. Στη συνέχεια, υπάρχει ο «Έλεγχος εξαιρέσεων». Με την προσεκτική διαχείριση μη αναμενόμενων περιπτώσεων ή συνθηκών με εξαιρέσεις, μπορούμε να εμποδίσουμε το σύστημά μας να αποκαλύψει ευαίσθητες πληροφορίες. Μελετήθηκε επίσης η απειλή της «Υπερχείλισης Προσωρινής Μνήμης», μια κατάσταση όπου ένα πρόγραμμα υπερβαίνει το όριο της προσωρινής μνήμης και αντικαθιστά τη γειτονική μνήμη. Αυτό μπορεί να αξιοποιηθεί για την εισαγωγή κακόβουλου κώδικα ή το κρασάρισμα του συστήματος. Τέλος, «SQL Injection». Αυτή η τεχνική έχει να κάνει με τις μη εξουσιοδοτημένες εντολές στις βάσεις δεδομένων. Με την «απολύμανση» της εισόδου και τη χρήση παραμετροποιημένων ερωτημάτων, μπορούμε να αποτρέψουμε τις προσπάθειες να πειράξουν τα δεδομένα μας. Έτσι, συλλογικά, αυτές οι τεχνικές αποτελούν την εργαλειοθήκη μας για την εύρεση και την εξουδετέρωση των ευπαθειών ασφαλείας
Έχοντας εξετάσει πώς βρίσκουμε ευπάθειες ασφαλείας, ας δούμε τώρα πώς αντιμετωπίζουμε τις κακόβουλες οντότητες που επιδιώκουν να τις εκμεταλλευτούν: Κακόβουλα λογισμικά. Μελετήθηκαν διάφορες τεχνικές για τον εντοπισμό τέτοιων απειλών. Πρώτον, χρησιμοποιούμε την ανίχνευση βάσει υπογραφής. Ουσιαστικά είναι σαν να αναγνωρίζεις έναν εγκληματία από τα δακτυλικά του αποτυπώματα. Ελέγχουμε τον κώδικα σε μια βάση δεδομένων γνωστών υπογραφών κακόβουλων λογισμικών. Αν βρεθεί κάτι που να ταιριάζει, έχουμε έναν ύποπτο! Στη συνέχεια, εφαρμόζουμε την ανίχνευση βάσει συμπεριφοράς. Αντί να ψάχνουμε για γνωστές υπογραφές, παρατηρούμε τη συμπεριφορά του κώδικα. Εάν αρχίσει να λειτουργεί ύποπτα, μπορούμε να το σημειώσουμε για έλεγχο. Τέλος, εξετάζουμε την ανίχνευση συσκότισης κώδικα. Κάποιο κακόβουλο λογισμικό προσπαθεί να κρύψει τις πραγματικές του προθέσεις θολώνοντας ή ανακατεύοντας τον κώδικά του. Ανιχνεύοντας τέτοιες απόπειρες συσκότισης, μπορούμε να αποκαλύψουμε το κακόβουλο λογισμικό που κρύβεται από πίσω.
Συνεχίζοντας την περιήγησή μας στις τεχνικές ανίχνευσης κακόβουλου λογισμικού, ξεκινάμε με την Ανάλυση κλήσεων API. Ορισμένα κακόβουλα προγράμματα αλληλεπιδρούν με το σύστημα χρησιμοποιώντας κλήσεις Διασύνδεσης Προγραμματισμού Εφαρμογών (API). Παρακολουθώντας και αναλύοντας αυτές τις κλήσεις, μπορούμε να εντοπίσουμε μία μη φυσιολογική συμπεριφορά. Στη συνέχεια, υπάρχει η Ανάλυση ροής ελέγχου. Ακριβώς όπως στην ανάλυση στατικού κώδικα, εδώ εξετάζουμε τη σειρά εντολών που ακολουθεί το πρόγραμμα. Παρατυπίες σε αυτήν τη ροή θα μπορούσαν να υποδηλώνουν την παρουσία κακόβουλου λογισμικού. Μελετήθηκε επίσης η ανάλυση εντροπίας. Η υψηλή εντροπία υποδηλώνει ότι τα δεδομένα είναι τυχαία ή κρυπτογραφημένα - κάτι που μπορεί να υπάρχει σε συσκοτισμένο κώδικα κακόβουλου λογισμικού. Έτσι, μπορεί να είναι μια καλή ένδειξη κρυφού κακόβουλου κώδικα. Τέλος, διερευνήθηκε η χρήση της Μηχανικής Μάθησης. Εκπαιδεύοντας ένα μοντέλο σε γνωστά δείγματα κακόβουλων λογισμικών, μπορούμε να το χρησιμοποιήσουμε για να εντοπίσουμε τελείως νέο κακόβουλο λογισμικό. Μαζί, αυτές οι τεχνικές μας παρέχουν μια ισχυρή στρατηγική για τον εντοπισμό και την αποτροπή επιθέσεων κακόβουλων λογισμικών.
Μόλις καταλάβαμε καλά αυτές τις τεχνικές, υλοποιήσαμε μια λύση βασισμένη στην γλώσσα Python για να εφαρμόσουμε τη θεωρία στην πράξη. Το πρόγραμμά μας πραγματοποιεί μια σειρά ελέγχων στον κώδικα. Αναλύει διευθύνσεις IP και διευθύνσεις URL και ελέγχει τις κλήσεις API, ψάχνοντας κάτι ύποπτο. Έχουμε επίσης συμπεριλάβει ελέγχους για τεχνικές anti-debugging και anti-virtualization που ενδέχεται να χρησιμοποιήσει κακόβουλο λογισμικό για να αποφύγει τον εντοπισμό. Το πρόγραμμά μας πραγματοποιεί ανάλυση εντροπίας, ελέγχοντας εάν ο κώδικας είναι συσκοτισμένος. Επίσης, ανεβάζει το αρχείο σε μια βάση δεδομένων στο cloud για να το διασταυρώσει με γνωστά δείγματα κακόβουλων λογισμικών, αυξάνοντας τις πιθανότητές μας να ανιχνεύσουμε απειλές. Τέλος, εντάχθηκε ένα επίπεδο δυναμικής ανάλυσης εκτελώντας το αρχείο σε μια ασφαλή εικονική μηχανή, ελέγχοντας τις συνδέσεις που προσπαθεί να δημιουργήσει. Αυτή η ολοκληρωμένη προσέγγιση αποτελεί παράδειγμα για το πώς μπορούμε να συνδυάσουμε διαφορετικές μεθόδους για να παρέχουμε ένα ισχυρό και αποτελεσματικό εργαλείο για τον εντοπισμό ευπαθειών ασφαλείας και κακόβουλου λογισμικού στον κώδικα.
Το συγκεκριμένο malware κατεβάζει και εκτελεί ένα κακόβουλο αρχείο στον υπολογιστή μας. Το εργαλείο που υλοποιήθηκε εντοπίζει όλες τις διευθύνσεις URL και τις περνάει από έλεγχο για να βρει αν είναι ύποπτες. Στο συγκεκριμένο παράδειγμα, το εργαλείο μας βρίσκει πως η διεύθυνση URL απ’ όπου κατεβαίνει το κακόβουλο αρχείο, είναι ύποπτη σε 4 απ’ τις 5 βάσεις με κακόβουλα URL. Σε διαφορετική περίπτωση, αν το URL ήταν άλλο, το εργαλείο μας θα εμφάνιζε πως το πρόγραμμα προς εξέταση περνάει επιτυχώς από τον έλεγχο.
Στο δεύτερο σενάριο χρήσης, βλέπουμε έναν πολύ απλό keylogger, ένα πρόγραμμα που καταγράφει κάθε πλήκτρο που πατάμε στο πληκτρολόγιο, αποθηκεύοντας έτσι κωδικούς, μηνύματα κλπ. Το εργαλείο μας, ανεβάζοντας το keylogger στο cloud για έλεγχο βάσει υπογραφής, βρίσκει πως το συγκεκριμένο πρόγραμμα βρέθηκε σε 2 βάσεις δεδομένων με γνωστά κακόβουλα προγράμματα. Καταλαβαίνουμε έτσι πως πρόκειται ξεκάθαρα για malware.
Καθώς ολοκληρώνουμε τη συζήτησή μας, ας συνοψίσουμε τα βασικά μας συμπεράσματα. Πρώτον, η Στατική Ανάλυση είναι πράγματι πολύτιμη, αλλά έχει τους περιορισμούς της. Αν και είναι εξαιρετική στο να εντοπίζει πολλά πιθανά ζητήματα, δεν εγγυάται την πλήρη κάλυψη όλων των πιθανών απειλών. Ορισμένοι τύποι προβλημάτων ενδέχεται να εντοπιστούν μόνο μέσω δυναμικής ανάλυσης ή σχολαστικής μη αυτόματης αναθεώρησης κώδικα. Δεύτερον, συνειδητοποιήσαμε τη σημασία της χρηστικότητας. Είναι σημαντικό να παρέχουμε ουσιαστικό και κατανοητό αποτέλεσμα. Η αποτελεσματικότητα του εργαλείου μας εξαρτάται σε μεγάλο βαθμό από το πόσο εύκολα οι χρήστες μπορούν να κατανοήσουν και να ενεργήσουν βάσει των αποτελεσμάτων του. Τέλος, η ανάγκη για τακτικές ενημερώσεις είναι σημαντικός παράγοντας. Ο χώρος των απειλών στον κυβερνοχώρο εξελίσσεται διαρκώς, όπως και οι προγραμματιστικές πρακτικές. Για να παραμείνει συναφές και αποτελεσματικό, το εργαλείο μας πρέπει να ενημερώνεται τακτικά για να αντιμετωπίσει νέες απειλές και να προσαρμοστεί στις αλλαγές στη γλώσσα Python. Συμπερασματικά, ενώ το εργαλείο μας είναι ένας ισχυρός σύμμαχος στην καταπολέμηση των ευπαθειών ασφαλείας στον κυβερνοχώρο, θα πρέπει να θεωρηθεί ως μέρος μιας ευρύτερης εργαλειοθήκης, που χρησιμοποιείται σε συνδυασμό με άλλες μεθόδους, για την παροχή μίας πιο ολοκληρωμένης προστασίας
Ας ρίξουμε τώρα μία σύντομη ματιά στο μέλλον και ας οραματιστούμε κάποιες πιθανές επεκτάσεις και βελτιώσεις για το εργαλείο μας. Πρώτον, θα μπορούσαμε να βελτιώσουμε τις δυνατότητες δυναμικήςανάλυσης για να χειριστούμε πιο περίπλοκα σενάρια. Θα μπορούσαν να ενσωματωθούν τεχνικές όπως η ανάλυση που βασίζεται στη συμπεριφορά, η προηγμένη ανάλυση ροής ελέγχου και η παρακολούθηση μνήμης. Δεύτερον, εξετάζουμε την ενσωμάτωση μηχανικής μάθησης. Αυτό θα μπορούσε να ενισχύσει την ικανότητα του εργαλείου μας να μαθαίνει από προηγούμενες αναλύσεις και να κάνει προγνωστικούς εντοπισμούς απειλών, ασυνήθιστων συμπεριφορών ή καινοτόμων μεθόδων συσκότισης. Θα μπορούσαμε επίσης να εξετάσουμε το ενδεχόμενο επέκτασης της δυνατότητας εφαρμογής του εργαλείου σε άλλες γλώσσες προγραμματισμού πέρα από την Python, ενισχύοντας τη χρηστικότητά του σε διαφορετικά προγραμματιστικά περιβάλλοντα. Για λόγους φιλικότητας προς τον χρήστη, θα μπορούσαμε να εξερευνήσουμε το σχεδιασμό μιας γραφικής διεπαφής χρήστη, καθιστώντας το εργαλείο μας πιο διαισθητικό και προσβάσιμο για μη ειδικούς. Η ενσωμάτωση στο cloud είναι μια άλλη ενδιαφέρουσα δυνατότητα. Ως υπηρεσία cloud, το εργαλείο μας θα είναι προσβάσιμο από οπουδήποτε και οι ενημερώσεις ή οι βελτιώσεις θα μπορούσαν να παρέχονται αβίαστα. Η ανάλυση του κώδικα σε πραγματικό χρόνο ή σχεδόν σε πραγματικό χρόνο όπως γράφεται θα μπορούσε να αλλάξει το παιχνίδι, παρέχοντας στους προγραμματιστές άμεση ανατροφοδότηση σχετικά με πιθανά ζητήματα ασφάλειας. Όσον αφορά την ασφάλεια του API, μπορούμε να εμβαθύνουμε τους ελέγχους αξιολογώντας τους ίδιους τους ορισμούς του API, προσέχοντας μη ασφαλείς πρακτικές. Τέλος, θα μπορούσαμε να εξετάσουμε το ενδεχόμενο επέκτασης του εργαλείου μας για να υποστηρίξει δυαδική και εκτελέσιμη ανάλυση, η οποία θα επέτρεπε τη χρήση του ακόμη και όταν ο πηγαίος κώδικας δεν είναι διαθέσιμος. Αν και αυτές είναι απλώς ιδέες αυτή τη στιγμή, αντιπροσωπεύουν συναρπαστικά μονοπάτια για τη μελλοντική εξέλιξη του εργαλείου μας
Καθώς φτάνουμε στο τέλος αυτής της παρουσίασης, θα ήθελα να σας ευχαριστήσω όλους εσάς για την προσοχή σας. Ειλικρινά εκτιμώ τον χρόνο και το ενδιαφέρον σας.
Τώρα, έχουμε λίγο χρόνο για ερωτήσεις. Εάν υπάρχει κάτι για το οποίο θα θέλατε να μάθετε περισσότερα ή κάτι που δεν ήταν σαφές κατά την παρουσίαση, μη διστάσετε να ρωτήσετε. Και πάλι ευχαριστώ.