- Οι δοκιμές Fuzz αυτοματοποιούν την αποστολή λανθασμένων εισόδων για την ανακάλυψη κενών ασφαλείας σε λογισμικό και συστήματα.
- Τα AFL και AFL++ είναι έξυπνοι fuzzers που χρησιμοποιούν μεταγλωττιστές με όργανα για να καθοδηγούνται ανάλογα με την κάλυψη και να βρίσκουν νέες διαδρομές εκτέλεσης.
- Η ανάλυση σφαλμάτων με εργαλεία όπως το AFLTriage και το GDB σάς επιτρέπει να αξιολογήσετε την εκμεταλλεύσιμο ευπαθειών όπως το Integer Underflow.
- Η ενσωμάτωση του fuzzing στον κύκλο ανάπτυξης βελτιώνει την ανθεκτικότητα, βοηθά στην τήρηση των προτύπων ασφαλείας και μειώνει τον κίνδυνο κρίσιμων συμβάντων.
Αν σας ενδιαφέρει Κυβερνοασφάλεια και εκμετάλλευση με δυαδικό προσανατολισμόΑργά ή γρήγορα θα συναντήσετε ασαφή σημεία, και συγκεκριμένα AFL και AFL++. Δεν μιλάμε για ένα θεωρητικό εργαστηριακό εργαλείο, αλλά για κάτι που χρησιμοποιείται καθημερινά για να εντοπίζει πολύ πραγματικές ατέλειες σε γνωστά προγράμματα, όπως ακριβώς έχει συμβεί με τα τρωτά σημεία σε... δημοφιλείς εφαρμογές όπως το 7-Zip.
Στις επόμενες γραμμές θα δούμε, λεπτομερώς και με φιλικό τόνο, Πώς να χρησιμοποιήσετε AFL και AFL++ για να ασαφοποιήσετε τα δυαδικά αρχείαΘα εξηγήσουμε ακριβώς τι είναι οι δοκιμές fuzz, γιατί είναι τόσο ισχυρές από άποψη ασφάλειας και πώς να τις ενσωματώσουμε σε μια σύγχρονη ροή εργασίας ανάπτυξης. Θα εξετάσουμε επίσης μια περίπτωση ευπάθειας σε πραγματικό κόσμο (ένα Integer Underflow που επιτρέπει την απομακρυσμένη εκτέλεση κώδικα) και θα εξετάσουμε συμπληρωματικά εργαλεία όπως GDB με επεκτάσεις, AFLTriage και λειτουργικές μονάδες.
Τι είναι τα AFL/AFL++ και γιατί θεωρούνται έξυπνα fuzzers;
AFL (American Fuzzy Lop) και η εξέλιξή του AFL++ Αυτά είναι εργαλεία fuzzing ανοιχτού κώδικα που έχουν σχεδιαστεί για να ελέγχουν αυτόματα τα δυαδικά αρχεία, αναζητώντας σφάλματα όπως υπερχείλιση, σφάλματα μνήμης ή απροσδόκητες συμπεριφορές που οδηγούν σε σφάλματα ή ακόμα και σε εκμεταλλεύσιμα τρωτά σημεία.
Η ομορφιά του AFL δεν είναι απλώς η αποστολή τυχαίων δεδομένων, αλλά μάλλον ένα έξυπνο fuzzer ή fuzzer με καθοδήγηση κάλυψηςΞεκινώντας από μία ή περισσότερες έγκυρες καταχωρήσεις παραδειγμάτων (οι λεγόμενες περιπτώσεις δοκιμής), το AFL δημιουργεί συνεχώς παραλλαγές και, χάρη στα όργανα του προγράμματος, ανιχνεύει πότε μια νέα μετάλλαξη προκαλεί στο δυαδικό αρχείο να ακολουθήσει διαφορετική διαδρομή εκτέλεσης.
Για να επιτύχει αυτή την οργάνωση, η AFL διαθέτει τους δικούς της μεταγλωττιστές, όπως afl-gcc και afl-g++Αυτά εισάγουν μικρά "αγκίστρια" στον κώδικα κατά τη μεταγλώττιση. Αυτά τα άγκιστρα ενημερώνουν την AFL ότι έχει ανακαλυφθεί μια συγκεκριμένη είσοδος. νέες διαδρομές στη ροή του προγράμματοςΑυτό σας επιτρέπει να εστιάσετε σε μεταλλάξεις που στην πραγματικότητα παρέχουν πρόσθετη κάλυψη και να μην σπαταλάτε χρόνο με δεδομένα που δεν αλλάζουν τίποτα.
Αυτή η προσέγγιση καθιστά το AFL κάτι σαν το "dirb των δυαδικών αρχείων": ένα πολύ γνωστό εργαλείο, εύχρηστο μόλις κατανοήσετε τη βασική ροή και αρκετά ισχυρό για να ανακαλύψετε... σοβαρές αδυναμίες στα προγράμματα παραγωγήςπαρόλο που υπάρχουν πιο προηγμένα ή εξειδικευμένα fuzzers.
Εισαγωγή στις δοκιμές fuzz και ο ρόλος τους στην κυβερνοασφάλεια
Η δοκιμή fuzz, ή απλά fuzzing, είναι μια τεχνική αυτοματοποιημένες δοκιμές ασφάλειας και ανθεκτικότηταςΗ ιδέα είναι να σταλεί σε μια εφαρμογή μια πλημμύρα από λανθασμένα, τυχαία ή ασυνήθιστα δεδομένα, με στόχο να διαπιστωθεί εάν το πρόγραμμα παρουσιάζει σφάλματα, σφάλματα ή συμπεριφέρεται απροσδόκητα.
Όταν το λογισμικό υπόκειται σε θόλωση, ο στόχος είναι να εντοπιστούν σφάλματα όπως υπερχειλίσεις buffer, αποτυχίες επικύρωσης εισόδου, προβλήματα διαχείρισης μνήμης ή συνθήκες ανταγωνισμούΠολλά από αυτά τα ελαττώματα μπορούν να οδηγήσουν σε αυθαίρετη εκτέλεση κώδικα, διαρροές πληροφοριών ή άρνηση παροχής υπηρεσιών.
Σε μια τυπική ροή εργασίας, οι δοκιμές fuzz ακολουθούν τρεις σαφείς φάσεις: πρώτον, δημιουργείται το σύνολο δεδομένων δοκιμής (είτε εντελώς τυχαίο, είτε δημιουργείται σύμφωνα με μια συγκεκριμένη μορφή είτε μεταλλάσσοντας έγκυρες εισόδους)· στη συνέχεια... εκτελέστε το δυαδικό αρχείο υπό δοκιμή ενώ παρακολουθείται Η συμπεριφορά του παρακολουθείται και, τέλος, καταγράφονται και αναλύονται τυχόν σφάλματα ή ασυνήθιστες συμπεριφορές, ώστε οι προγραμματιστές να μπορούν να διερευνήσουν την πηγή του προβλήματος.
Υπάρχουν διαφορετικές στρατηγικές fuzzing. Ορισμένα εργαλεία εστιάζουν σε γενεαλογικό θολόδημιουργία καταχωρίσεων που σέβονται μια σαφώς καθορισμένη μορφή (για παράδειγμα, μια δομή αρχείου ή ένα πρωτόκολλο δικτύου). άλλες βασίζονται σε μετάλλαξη έγκυρων εισόδωνΑυτή ακριβώς είναι η προσέγγιση όπου οι AFL και AFL++ υπερέχουν. Υπάρχουν επίσης πιο τυχαίες προσεγγίσεις και άλλες που βασίζονται σε συγκεκριμένη γνώση του υπό δοκιμή συστήματος για να στοχεύσουν στα πιο αδύναμα σημεία του.
Στη σύγχρονη κυβερνοασφάλεια, οι δοκιμές fuzz είναι ένας θεμελιώδης σύμμαχος: βοηθούν στον εντοπισμό τρωτών σημείων σε ένα προληπτικά, πριν το λογισμικό τεθεί σε παραγωγήκαι συμβάλλει στη συμμόρφωση με κανονισμούς και πρότυπα όπως το ISO 27001 ή τις απαιτήσεις προστασίας δεδομένων. Επιπλέον, μειώνει τον κίνδυνο για τη φήμη που θα προέκυπτε από μια κρίσιμη εκμεταλλεύσιμη ευπάθεια που θα περιέλθει στα χέρια των εισβολέων.
Μια πραγματική περίπτωση: Υποχείλιση ακεραίων και ευπάθεια RCE σε αποσυμπιεστή
Για να κατανοήσουμε την πραγματική αξία του AFL και του fuzzing, είναι πολύ χρήσιμο να εξετάσουμε μια συγκεκριμένη ευπάθεια με βάση ένα Integer Underflow μέσα σε ένα πολύ δημοφιλές πρόγραμμα αποσυμπίεσης αρχείωνΠρόκειται για ένα σφάλμα απομακρυσμένης εκτέλεσης κώδικα (RCE) που ενεργοποιείται κατά την επεξεργασία συμπιεσμένων αρχείων με τον αλγόριθμο Zstandard, με υψηλή, αν και όχι μέγιστη, βαθμολογία CVSS, ακριβώς επειδή απαιτεί ένα κάπως πιο συγκεκριμένο πλαίσιο (για παράδειγμα, ότι υποβάλλονται σε επεξεργασία συγκεκριμένα αρχεία).
Μια ακέραιη υποροή εμφανίζεται όταν μια ακέραια μεταβλητή με σαφώς καθορισμένα κάτω όρια Χρησιμοποιείται σε πράξεις αφαίρεσης μέχρι να επιτευχθεί η ελάχιστη τιμή του.Δεδομένου ότι πολλοί τύποι ακεραίων δεν επιτρέπουν αρνητικές τιμές, όταν "υπολογίζεται η τιμή κάτω από το μηδέν", αντί να λαμβάνεται ένας αριθμός κάτω από το μηδέν, συμβαίνει ένα άλμα στη μέγιστη δυνατή τιμή του εύρους, λόγω του τρόπου με τον οποίο αυτοί οι αριθμοί αναπαρίστανται εσωτερικά.
Φανταστείτε μια ακέραια μεταβλητή που, θεωρητικά, δεν θα έπρεπε ποτέ να είναι αρνητική. Αν συνεχίσετε να αφαιρείτε μια σταθερά μέχρι να φτάσετε στο 0 και συνεχίσετε να αφαιρείτε, Δεν θα λάβετε -1, -2, κ.λπ.Αντίθετα, η τιμή θα αντιστραφεί και θα γίνει ένας γιγαντιαίος αριθμός στο άνω άκρο του επιτρεπόμενου εύρους. Αυτός ο παράλογος αριθμός, εάν χρησιμοποιηθεί ως δείκτης ή μέγεθος σε λειτουργίες μνήμης, μπορεί να προκαλέσει αναγνώσεις ή εγγραφές εκτός των προβλεπόμενων ορίων.
Το πρόβλημα γίνεται κρίσιμο όταν η ακέραια μεταβλητή που μπορεί να υπορεύσει χρησιμοποιείται για για τη διαχείριση ενός buffer ή για τον υπολογισμό μετατοπίσεωνΈνα τυπικό ψευδο-παράδειγμα θα ήταν η έμμεση χρήση μιας μεταβλητής που ελέγχεται από τον χρήστη ως μετατόπιση σε μια συνάρτηση τύπου memcpy, σε έναν βρόχο που μειώνει μια σταθερά σε κάθε επανάληψη μέχρι να φτάσει υποθετικά στο μηδέν ή σε έναν μη θετικό αριθμό.
Σε ένα τέτοιο σενάριο, εάν η αρχική τιμή δεν καταφέρει ποτέ να ικανοποιήσει «καθαρά» τη συνθήκη εξόδου, η υπορροή τελικά θα κάνει τον αριθμό τεράστιο, ο βρόχος θα συνεχίσει να εκτελείται και ένα μαζική αλλοίωση της μνήμηςΑυτό μεταφράζεται σε διακοπές λειτουργίας και, με αρκετή εργασία εκμετάλλευσης, στην πιθανότητα εκτέλεσης αυθαίρετου κώδικα.
Πώς το AFL βοηθά στον εντοπισμό αυτών των τύπων ευπαθειών
Μόλις κατανοηθεί η έννοια της ακέραιης υποροής, γίνεται σαφές γιατί τα AFL και AFL++ είναι τόσο χρήσιμα: ξεκινώντας από ένα ή μερικά απολύτως έγκυρα αρχεία εισόδουΤο fuzzer μπορεί να δημιουργήσει δεκάδες χιλιάδες παραλλαγές, μέχρι να εντοπίσει τυχαία αυτήν που ενεργοποιεί το συγκεκριμένο σφάλμα στην επηρεαζόμενη διαδρομή αποσυμπίεσης.
Κατά τη διάρκεια της ασάφειας, το AFL παρακολουθεί το δυαδικό αρχείο με τα όργανα για να προσδιορίσει πότε μια είσοδος προκαλεί την εκτέλεση μιας διαφορετικής διαδρομής ελέγχου ροής. Κάθε φορά που ανιχνεύει μια νέα διαδρομή, Σημειώστε αυτήν την καταχώρηση ως ενδιαφέρουσα και το διατηρεί ως βάση για μελλοντικές μεταλλάξεις. Με αυτόν τον τρόπο, εξερευνώνται όχι μόνο οι συνήθεις διαδρομές εκτέλεσης, αλλά και εκείνοι οι συνδυασμοί δεδομένων που ενεργοποιούν ασυνήθιστες διαδρομές κώδικα, όπως η διαδικασία αποσυμπίεσης με παράξενες παραμέτρους.
Στην περίπτωση της Ακέραιης Υποροής, το AFL μπορεί να βρει ένα δείγμα που προκαλεί την μη επίτευξη της αναμενόμενης τιμής εξόδου από την εμπλεκόμενη μεταβλητή στον βρόχο. Το αποτέλεσμα είναι μια ανιχνεύσιμη συντριβή, η οποία θα αποθηκευτεί στον αντίστοιχο φάκελο αποτελεσμάτων AFL, έτοιμη για περαιτέρω ανάλυση.
Μετά από λίγα λεπτά ή ώρες εκτέλεσης, είναι σύνηθες για την AFL να υποδεικνύει το πρώτη σχετική συντριβήΔεν είναι όλα τα σφάλματα που θα βρείτε εκμεταλλεύσιμα, αλλά αποτελούν σαφή ένδειξη ότι κάτι στη διαχείριση μνήμης, την επικύρωση εισόδου ή την εσωτερική λογική του δυαδικού αρχείου δεν λειτουργεί όπως θα έπρεπε.
Τότε είναι που έρχονται στο προσκήνιο εργαλεία υποστήριξης όπως το AFLTriage ή ένα πρόγραμμα εντοπισμού σφαλμάτων όπως το GDB, επιτρέποντάς σας να εμβαθύνετε περισσότερο στο σφάλμα, να παρατηρήσετε την κατάσταση των καταχωρητών και της μνήμης και να αξιολογήσετε εάν η αποτυχία μπορεί να αξιοποιηθεί αξιόπιστα ή εάν πρόκειται απλώς για ένα κολλήμα μικρής χρησιμότητας από την οπτική γωνία του εισβολέα.
Βασική εγκατάσταση AFL / AFL++ και περιβάλλοντος ανάλυσης
Η ρύθμιση του ελάχιστου περιβάλλοντος για fuzzing με AFL σε ένα τυπικό σύστημα Linux είναι αρκετά απλή. Σε πολλές διανομές, αρκεί να εγκαταστήσετε το πακέτο που αντιστοιχεί στους μεταγλωττιστές που έχουν οργάνωσεις, για παράδειγμα, χρησιμοποιώντας μια εντολή όπως εγκαταστήστε το afl-g++ ή το αντίστοιχο πακέτο AFL++ φέρτε ολόκληρη τη σουίτα.
Με αυτόν τον τρόπο εγκαθίστανται και τα δύο εργαλεία fuzzing (όπως π.χ. αφλ-φουζ) όπως εξειδικευμένοι μεταγλωττιστές (afl-gcc, afl-g++ και οι σύγχρονες παραλλαγές τους σε AFL++). Αυτοί οι μεταγλωττιστές είναι αυτοί που θα χρησιμοποιήσετε όταν θέλετε να επαναμεταγλωττίσετε τον στόχο σας με όργανα, τα οποία είναι απαραίτητα για να αξιοποιήσετε στο έπακρο το fuzzing με καθοδήγηση κάλυψης.
Εκτός από το ίδιο το fuzzer, ένα καλό περιβάλλον εντοπισμού σφαλμάτων είναι πρακτικά απαραίτητο. Ένα εκτεταμένο GDB με πρόσθετα όπως PEDA ή GEF Κάνει τη ζωή πολύ πιο εύκολη χάρη σε επιπλέον εντολές, βολική μορφοποίηση μνήμης, απεικονίσεις στοίβας και συντομεύσεις για τον έλεγχο καταχωρητών και χαρτών μνήμης.
Αν δεν έχετε ήδη το GDB, μπορείτε να το εγκαταστήσετε χρησιμοποιώντας τον διαχειριστή πακέτων της διανομής σας. Στη συνέχεια, απλώς ενσωματώστε το πρόσθετο που έχετε επιλέξει (για παράδειγμα, κατεβάζοντας το GEF ή το PEDA από τα αποθετήριά τους και προσθέτοντάς τα στο αρχείο ρυθμίσεων του GDB ή χρησιμοποιώντας την εντολή `source` μέσα στο ίδιο το πρόγραμμα εντοπισμού σφαλμάτων).
Έχοντας αυτό το "GDB με στεροειδή" θα μπορείτε να αναλύσετε δυαδικά αρχεία με όργανα που καταρρέουν υπό fuzzing, κατεβάστε το εισροές που προκαλούν τη συντριβή και ακολουθήστε βήμα προς βήμα τι συμβαίνει κατά την εκτέλεση ακριβώς στο σημείο της αποτυχίας.
Μεταγλώττιση ενός δυαδικού αρχείου προορισμού με AFL για fuzzing
Μόλις έχετε έτοιμο το AFL ή το AFL++, το επόμενο βήμα για σοβαρό χνουδωτό αποτέλεσμα είναι μεταγλώττιση του στόχου με τους μεταγλωττιστές AFLκαι να το κάνουν αυτό με τις κατάλληλες επιλογές για να διευκολύνουν τόσο την ανάλυση όσο και την πιθανή αξιοποίηση, σε περίπτωση που ο στόχος της άσκησης είναι η επιθετική έρευνα.
Σε μεγάλα έργα, όπως ένας αποσυμπιεστής ή μια σουίτα βοηθητικών προγραμμάτων αρχειοθέτησης, είναι καλή ιδέα να ενεργοποιήσετε τα σύμβολα εντοπισμού σφαλμάτων (επιλογή DEBUG ή σημαίες όπως -gκαι ελαχιστοποιήστε τις βελτιστοποιήσεις (για παράδειγμα, χρησιμοποιώντας -O0 αντί για -O2). Αυτό βοηθάει πολύ στην κατανόηση του τι συμβαίνει στον πηγαίο κώδικα σε σχέση με την παρατηρούμενη συντριβή.
Συνήθως θα χρειαστεί να εντοπίσετε το κατάλληλο αρχείο makefile ή build και τροποποιήστε τις γραμμές όπου ορίζονται οι σημαίες μεταγλώττισηςΑυτό μπορεί να περιλαμβάνει την ενεργοποίηση μιας μεταβλητής DEBUG, την επιβολή ενός συγκεκριμένου επιπέδου βελτιστοποίησης και, το πιο σημαντικό, την αντικατάσταση των CC και CXX με afl-gcc και afl-g++ (ή τα αντίστοιχα εργαλεία AFL++).
Για παράδειγμα, θα μπορούσατε να ξεκινήσετε την έκδοση με κάτι όπως CC=afl-gcc και CXX=afl-g++ μαζί με το κατάλληλο makefile. Το αποτέλεσμα θα είναι ένα δυαδικό αρχείο με όργανα που ενσωματώνει τα απαραίτητα άγκιστρα, έτσι ώστε το AFL να μπορεί να μετρήσει την κάλυψη καθ' όλη τη διάρκεια της εκτέλεσης.
Όταν ολοκληρωθεί η μεταγλώττιση, είναι καλή ιδέα να ελέγξετε ότι το δυαδικό αρχείο που προκύπτει έχει πράγματι σύμβολα εντοπισμού σφαλμάτων και τη σωστή αρχιτεκτονική, χρησιμοποιώντας μια εντολή όπως αρχείο σχετικά με το εκτελέσιμο αρχείοΑυτό διασφαλίζει ότι δεν θα μπερδεύεστε στα τυφλά και ότι μπορείτε εύκολα να εντοπίσετε τυχόν σφάλματα που εμφανίζονται.
Προετοιμασία δοκιμαστικών περιπτώσεων και εκτέλεση AFL
Πριν ξεκινήσετε το AFL στο δυαδικό σας αρχείο, πρέπει να προετοιμάσετε ένα σύνολο ελάχιστο έγκυρο ποσό συμμετοχήςΕάν δοκιμάζετε έναν αποσυμπιεστή που αποτυγχάνει με αρχεία που έχουν συμπιεστεί χρησιμοποιώντας έναν συγκεκριμένο αλγόριθμο, θα χρειαστεί να δημιουργήσετε τουλάχιστον ένα καλά μορφοποιημένο αρχείο που χρησιμοποιεί αυτήν τη μέθοδο συμπίεσης.
Η συνήθης πρακτική είναι να δημιουργηθεί ένας κατάλογος, για παράδειγμα με την ονομασία testcases, και να αποθηκευτεί εκεί ένα ή περισσότερα δείγματα εργασίας. Αυτά θα χρησιμεύσουν ως σημείο εκκίνησης για την AFL. δημιουργεί ολοένα και πιο επιθετικές μεταλλάξειςπροσπαθώντας να ανακαλύψουν νέες διαδρομές εκτέλεσης και, τελικά, καταρρέουν.
Η τυπική εντολή για την εκκίνηση του AFL μοιάζει κάπως έτσι: καθορίστε ένα όνομα συνεδρίας ή συγχρονισμού, τον φάκελο εισόδου με τις δοκιμαστικές περιπτώσεις, τη διαδρομή εξόδου όπου θα αποθηκευτούν τα αποτελέσματα και ορισμένες πρόσθετες παραμέτρους, όπως το χρονικό όριο, για να αποφύγετε την εμπλοκή σε άπειρους βρόχους.
Η γραμμή εντολών καθορίζει επίσης τον τρόπο εκτέλεσης του προγράμματος-στόχου χρησιμοποιώντας ο πίνακας αποτελεσμάτων @@το οποίο το AFL θα αντικαταστήσει αυτόματα με τη διαδρομή κάθε δοκιμαστικής περίπτωσης που δημιουργεί. Έτσι, μπορείτε να καθορίσετε κάτι όπως ./δυαδικά ορίσματα @@ και το AFL θα είναι υπεύθυνο για την εκκίνηση του εκτελέσιμου αρχείου χιλιάδες φορές με διαφορετικά αρχεία.
Είναι σημαντικό να γνωρίζετε ότι το AFL μπορεί αρχικά να παραπονεθεί για τη διαμόρφωση του συστήματος (λόγω περιορισμών πόρων, core dumps κ.λπ.). Σε αυτήν την περίπτωση, συνήθως υπάρχει ένα βοηθητικό σενάριο ή εργαλείο που προσαρμόζει τις παραμέτρους του πυρήνα και της συνεδρίας για να βελτιστοποιήσει το περιβάλλον fuzzing, το οποίο θα πρέπει να εκτελεστεί με τα κατάλληλα δικαιώματα πριν από την επανάληψη της δοκιμής.
Ανάλυση κρασιών με AFLTriage και GDB
Μετά από μια περίοδο θολώματος, το AFL θα γεμίσει σταδιακά τον φάκελο εξόδου με ενδιαφέρουσες νέες καταχωρήσεις και, πάνω απ' όλα, με αρχεία που έχουν προκαλέσει σφάλματαΑυτά συνήθως αποθηκεύονται σε έναν συγκεκριμένο υποκατάλογο (για παράδειγμα, σφάλματα εντός του φακέλου της συνεδρίας).
Για να αποφύγετε την υπερβολική αναθεώρηση κάθε εισόδου μία προς μία, υπάρχουν εργαλεία όπως το AFLTriage που σας επιτρέπουν να Αυτόματη εκτέλεση δυαδικού αρχείου σε κάθε αρχείο σφάλματος και να δημιουργούν δομημένες αναφορές με λεπτομέρειες σχετικά με το πού και πώς συνέβη η βλάβη.
Κατά την εκκίνηση του AFLTriage, καθορίζετε τον κατάλογο εισόδου (τον φάκελο σφαλμάτων), έναν κατάλογο εξόδου για την αποθήκευση των αναφορών και την εντολή για την εκτέλεση του δυαδικού αρχείου χρησιμοποιώντας το @@. Το εργαλείο θα αναλύσει κάθε περίπτωση και Θα δημιουργήσει αρχεία κειμένου με πληροφορίες που σας ενδιαφέρουν. για τον αναλυτή.
Το τυπικό περιεχόμενο αυτών των αναφορών περιλαμβάνει τον τύπο του σήματος που προκάλεσε τη διακοπή λειτουργίας, την κατεύθυνση στην οποία απέτυχε, μια βασική ανίχνευση στοίβας και, σε πολλές περιπτώσεις, τη συνάρτηση ή τη μακροεντολή όπου ο κώδικας έσπασε (για παράδειγμα, μια συγκεκριμένη λειτουργία αντιγραφής, ένας βρόχος συμπίεσης ή μια μακροεντολή COPY_CHUNKS που αφαιρεί μεγέθη σε κάθε επανάληψη).
Μόλις εντοπιστεί ένα ενδιαφέρον σφάλμα, το επόμενο βήμα είναι η αναπαραγωγή του στο GDB. Για να γίνει αυτό, το πρόγραμμα εντοπισμού σφαλμάτων ξεκινά με το δυαδικό αρχείο και το αρχείο εισόδου του ένοχου σφάλματος ως ορίσματα και το πρόγραμμα εκτελείται μέσα από το GDB. Όταν αναπαραχθεί το σφάλμα, η κατάσταση του Βασικά αρχεία όπως RAX, RDX, κ.λπ., ελέγξτε την ακριβή εντολή που εκτελείται και συμβουλευτείτε τους χάρτες μνήμης (vmmap) για να δείτε σε ποια περιοχή διαβάζεται ή γράφεται.
Από την κατάρρευση στην πιθανή εκμετάλλευση: ενότητες ανάλυσης στο GDB
Το γεγονός ότι ένα δυαδικό αρχείο καταρρέει δεν σημαίνει πάντα ότι η ευπάθεια είναι εκμεταλλεύσιμη. Εδώ είναι που οι επεκτάσεις GDB, όπως η ενότητα, μπαίνουν στο παιχνίδι. εκμεταλλεύσιμη, σχεδιασμένο να αναλύει το πλαίσιο μιας συντριβής και να προσφέρει μια πρόχειρη ταξινόμηση του κατά πόσον η αποτυχία θα μπορούσε να αξιοποιηθεί ή όχι.
Αυτοί οι τύποι επεκτάσεων μελετούν πτυχές όπως η εγκυρότητα του δείκτη εντολής, η κατάσταση του δείκτη στοίβας, τα δικαιώματα μνήμης της διεύθυνσης όπου γίνεται η προσπάθεια ανάγνωσης ή εγγραφής και η φύση του σήματος που προκάλεσε τη διακοπή λειτουργίας. Με όλες αυτές τις πληροφορίες, παρέχουν ένα ενδεικτική ετυμηγορία σχετικά με τις δυνατότητες εκμετάλλευσης (για παράδειγμα, κατηγοριοποιώντας το σφάλμα ως πιθανώς εκμεταλλεύσιμο, πιθανώς εκμεταλλεύσιμο ή ελάχιστα ενδιαφέρον).
Στην περίπτωση της ακέραιης ροής (Integer Underflow) που καταλήγει στην εγγραφή σε μνήμη μόνο για ανάγνωση, το πρόσθετο (plugin) μπορεί να υποδηλώνει ότι πρόκειται για μια πιθανώς εκμεταλλεύσιμη περίπτωση, επειδή εκτελείται μια λειτουργία εγγραφής εκτός των αναμενόμενων ορίων σε μια περιοχή όπου δεν πρέπει να αγγιχτεί τίποτα.
Δεν είναι όλα τα σενάρια τόσο απλά, αλλά αυτός ο συνδυασμός AFL για την ανακάλυψη της συντριβής, AFLTriage για την ομαδοποίηση και περιγραφή των περιπτώσεων, και GDB με επεκτάσεις για την αξιολόγηση της εκμετάλλευσής τους, σχηματίζει ένα Πολύ ισχυρός αγωγός δυαδικού ελέγχουΑπό εκεί και πέρα, η υπόλοιπη εργασία είναι καθαρά έρευνα και ανάπτυξη του exploit, κάτι που μπορεί να διαφέρει σε μεγάλο βαθμό σε πολυπλοκότητα ανάλογα με την δυαδική και την ενεργή προστασία.
Ένα άλλο βασικό μέρος της ανάλυσης, ειδικά όταν δημοσιεύεται ένα CVE και μια σχετική ενημέρωση κώδικα, είναι η εξέταση του τρόπου με τον οποίο έχει διορθωθεί η ευπάθεια στον πηγαίο κώδικα. Αυτό συνήθως περιλαμβάνει αλλαγές στον τύπο των δεδομένων που χρησιμοποιούνται (για παράδειγμα, μετάβαση από ένα υπογεγραμμένο byte σε ένα μη υπογεγραμμένο byte, επέκταση του εύρους) και η συμπερίληψη πρόσθετων ελέγχων (ifs που επιστρέφουν κωδικούς σφάλματος εάν ξεπεραστούν ορισμένα όρια) για την αποτροπή υπορροής ή καταστροφής μνήμης.
Άλλα σχετικά fuzzers και εργαλεία στο οικοσύστημα
Παρόλο που τα AFL και AFL++ είναι από τις πιο γνωστές επιλογές για fuzzing native binary, το οικοσύστημα δοκιμών fuzz είναι πολύ ευρύτερο και αξίζει να το παρακολουθείτε αν εργάζεστε τακτικά με αυτά. ασφάλεια λογισμικού.
Μεταξύ των επιλογών που χρησιμοποιούνται περισσότερο είναι η LibFuzzer, μια βιβλιοθήκη που αναπτύχθηκε αρχικά από την Google και ενσωματώνεται απευθείας με κώδικα C/C++ και εκτελεί θόλωση στο επίπεδο συγκεκριμένων λειτουργιών, ιδανικό για τον έλεγχο μεμονωμένων εξαρτημάτων με άκρως ελεγχόμενες εισόδους.
Υπάρχει επίσης το Peach Fuzzer, μια πιο γενικής χρήσης και διαμορφώσιμη πλατφόρμα που σας επιτρέπει να ορίσετε ακριβή μοντέλα πρωτοκόλλων, μορφών αρχείων και σύνθετων δομώνΕίναι πολύ δημοφιλές σε τομείς όπου η αξιοπιστία είναι κρίσιμη, όπως τα βιομηχανικά συστήματα ή τα περιβάλλοντα IoT.
Στον τομέα του ιστού, εργαλεία όπως το OWASP ZAP περιλαμβάνουν fuzzing modules προσανατολισμένα σε εφαρμογές ιστού, ικανά να στέλνουν χειραγωγημένα αιτήματα, λανθασμένα φορτία και δοκιμές έγχυσης Τελικά σημεία HTTP για την ανίχνευση ευπαθειών όπως ενέσεις SQL, προβλήματα επικύρωσης εισόδου ή σφάλματα επεξεργασίας φόρμας.
Όλα αυτά συμπληρώνουν το δυαδικό fuzzing AFL/AFL++, καθώς επιτρέπουν την κάλυψη από τον εγγενή κώδικα χαμηλού επιπέδου έως τα επίπεδα εφαρμογής που είναι πιο εκτεθειμένα στον τελικό χρήστη. Ο κοινός στόχος σε όλες τις περιπτώσεις είναι ο ίδιος: να αυτοματοποιηθεί η αναζήτηση ευπαθειών πριν το κάνουν οι εισβολείς.
Πώς να ενσωματώσετε τις δοκιμές fuzz στον κύκλο ανάπτυξης
Για να προσφέρει το fuzzing σταθερά πραγματική αξία, δεν αρκεί απλώς να ξεκινάτε περιστασιακά το AFL ή το AFL++ και να το ξεχνάτε. Είναι πολύ πιο αποτελεσματικό. ενσωμάτωση fuzz testing στον κύκλο ζωής ανάπτυξης λογισμικού, με παρόμοιο τρόπο με αυτόν που γίνεται με τις δοκιμές μονάδας ή ολοκλήρωσης.
Το πρώτο βήμα είναι να ορίσουμε ποια μέρη του συστήματος είναι τα πιο κρίσιμαΑναλυτές αρχείων, μονάδες δικτύου, στοιχεία που επεξεργάζονται δεδομένα χρήστη ή εξωτερικά εκτεθειμένες υπηρεσίες. Μπορούν να σχεδιαστούν συγκεκριμένες καμπάνιες fuzzing γύρω από αυτούς τους στόχους, χρησιμοποιώντας προσεκτικά επιλεγμένες περιπτώσεις δοκιμών.
Στη συνέχεια, πρέπει να επιλέξετε το κατάλληλο εργαλείο για κάθε περίπτωση. Για σύνθετα εγγενή δυαδικά αρχεία, τα AFL++ ή LibFuzzer είναι συνήθως οι φυσικοί υποψήφιοι, ενώ για web API ή εφαρμογές HTTP, ένα εργαλείο προσανατολισμένο στον ιστό θα έχει περισσότερο νόημα. Το σημαντικό είναι η fuzzing να εκτελείται σωστά. επαναλήψιμο και αυτοματοποιημένο.
Η ενσωμάτωση με συστήματα CI/CD είναι πολύ χρήσιμη: ο αγωγός μπορεί να διαμορφωθεί έτσι ώστε, σε ορισμένους κλάδους ή πριν από ορισμένες αναπτύξεις, να ενεργοποιείται μια θολή μπαταρία με περιορισμένο χρόνο, εξοικονομώντας τυχόν νέα σφάλματα που εντοπίζονται και αποτυγχάνοντας την κατασκευή εάν εμφανιστούν πιθανώς σοβαρά τρωτά σημεία.
Τέλος, είναι σημαντικό να κατανοήσουμε ότι η δημιουργία ασαφειών είναι μια επαναληπτική διαδικασία. Κάθε φορά που διορθώνεται ένα σφάλμα, το επηρεαζόμενο στοιχείο θα πρέπει να δημιουργείται ξανά ασαφές για να επαληθευτεί ότι η ενημέρωση κώδικα λειτουργεί και ότι δεν έχουν εισαχθεί νέα σφάλματα. καμία νέα οπισθοδρόμηση ή ευπάθειαΜε αυτόν τον τρόπο, οι δοκιμές fuzz γίνονται ένα επιπλέον επίπεδο συνεχούς προστασίας και όχι ένας μεμονωμένος έλεγχος.
Συνολικά, όλα τα παραπάνω δείχνουν πώς οι δοκιμές AFL, AFL++ και fuzz γενικά μας επιτρέπουν να μεταβούμε από μια προσέγγιση ασφαλείας που βασίζεται αποκλειστικά σε χειροκίνητους ελέγχους σε μια πιο ολοκληρωμένη προσέγγιση. πολύ πιο αυτοματοποιημένο και λεπτομερέςΕίναι ικανό να αποκαλύψει σφάλματα που διαφορετικά θα παρέμεναν κρυμμένα. Η εργασία με πραγματικές περιπτώσεις, όπως τρωτά σημεία υποχείλισης σε ευρέως χρησιμοποιούμενους αποσυμπιεστές, βοηθά επίσης να κατανοήσουμε ότι δεν πρόκειται απλώς για θεωρία, αλλά για προβλήματα που ήδη αξιοποιούνται. Επομένως, η διατήρηση του λογισμικού ενημερωμένου και τακτικού θολώματος μπορεί να κάνει τη διαφορά μεταξύ ενός παραβιασμένου συστήματος και ενός ανθεκτικού.
Παθιασμένος συγγραφέας για τον κόσμο των byte και της τεχνολογίας γενικότερα. Μου αρέσει να μοιράζομαι τις γνώσεις μου μέσω της γραφής, και αυτό θα κάνω σε αυτό το blog, θα σας δείξω όλα τα πιο ενδιαφέροντα πράγματα σχετικά με τα gadget, το λογισμικό, το υλικό, τις τεχνολογικές τάσεις και πολλά άλλα. Στόχος μου είναι να σας βοηθήσω να περιηγηθείτε στον ψηφιακό κόσμο με απλό και διασκεδαστικό τρόπο.

