Fuzz Testing (Fuzzing) Tutorial
⚡ Έξυπνη Σύνοψη
Το Fuzz Testing τροφοδοτεί ένα πρόγραμμα με μη έγκυρα, μη αναμενόμενα ή τυχαία δεδομένα και παρακολουθεί για σφάλματα σφάλματος, κολλήματα και σφάλματα μνήμης, αποκαλύπτοντας ελαττώματα ασφαλείας που οι λειτουργικές δοκιμές σεναρίου σχεδόν ποτέ δεν εντοπίζουν από μόνες τους.

Τι είναι το Fuzz Testing;
Δοκιμή Fuzz ή Fuzzing είναι μια τεχνική δοκιμής λογισμικού που εισάγει μη έγκυρα ή τυχαία δεδομένα που ονομάζεται FUZZ σε ένα σύστημα λογισμικού για την ανακάλυψη σφαλμάτων κωδικοποίησης και κενών ασφαλείας. Ο σκοπός του fuzz testing είναι η εισαγωγή δεδομένων χρησιμοποιώντας αυτοματοποιημένες ή ημιαυτόματες τεχνικές και ο έλεγχος του συστήματος για διάφορες εξαιρέσεις, όπως διακοπή λειτουργίας του συστήματος ή αστοχία ενσωματωμένου κώδικα.
Ο έλεγχος fuzz αναπτύχθηκε αρχικά από τον Barton Miller στο Πανεπιστήμιο του Wisconsin-Madison, ο οποίος επινόησε τον όρο όταν ο θόρυβος γραμμής σε μια σύνδεση μόντεμ κατέστρεψε τα προγράμματα που χρησιμοποιούσε. Οι φοιτητές του έτρεξαν τα πρώτα fuzzers το 1989 και διαπίστωσαν ότι περίπου το ένα τρίτο των βοηθητικών προγραμμάτων UNIX που στόχευσαν κατέρρευσαν ή κολλούσαν. Ο έλεγχος fuzz είναι ένα δοκιμές λογισμικού τεχνική, και είναι ένα είδος Δοκιμή ασφαλείας.
Το παρακάτω διάγραμμα δείχνει τον βασικό βρόχο fuzzing, όπου τα δεδομένα που δημιουργούνται προωθούνται στην υπό δοκιμή εφαρμογή και παρατηρείται η απόκριση.
Γιατί να κάνετε Fuzz Testing;
Το Fuzzing κερδίζει τη θέση του σε ένα σχέδιο δοκιμών επειδή διερευνά τα δεδομένα εισόδου για τα οποία κανείς δεν σκέφτηκε να γράψει μια δοκιμαστική περίπτωση. Οι κύριοι λόγοι για τους οποίους οι ομάδες το υιοθετούν παρατίθενται παρακάτω.
- Οι δοκιμές fuzz συνήθως εντοπίζουν τα πιο σοβαρά σφάλματα και ελαττώματα ασφαλείας, επειδή μια συντριβή αποτελεί άμεση απόδειξη μιας μη χειριζόμενης διαδρομής εισόδου.
- Η δοκιμή fuzz δίνει πιο αποτελεσματικό αποτέλεσμα όταν χρησιμοποιείται με Μαύρο Box Δοκιμές, Beta Testing και άλλες μέθοδοι εντοπισμού σφαλμάτων.
- Το Fuzz testing χρησιμοποιείται για τον έλεγχο της ευπάθειας του λογισμικού και είναι μια πολύ οικονομικά αποδοτική τεχνική ελέγχου, επειδή τα δεδομένα εισόδου παράγονται και όχι γράφονται χειρόγραφα.
- Η δοκιμή fuzz είναι μια από τις τεχνικές δοκιμής μαύρου κουτιού. Η δοκιμή fuzzing είναι επίσης μια από τις πιο συνηθισμένες μεθόδους που χρησιμοποιούν οι χάκερ για να εντοπίσουν μια ευπάθεια σε ένα σύστημα, επομένως η εκτέλεσή της πρώτα αφαιρεί την ευκολότερη διαδρομή εισόδου ενός εισβολέα.
Τύποι Δοκιμών Fuzz
Τα fuzzer συνήθως ομαδοποιούνται με βάση το πόσα γνωρίζουν για το πρόγραμμα στο οποίο επιτίθενται. Όσο περισσότερα γνωρίζει το fuzzer, τόσο πιο βαθιά στον κώδικα μπορεί να εισάγει.
| Χαρακτηριστικά | Τι ξέρει ο τσιγκούνης | Τυπική χρήση |
| Θάμπωμα του μαύρου κουτιού | Τίποτα για τα εσωτερικά. Βλέπει μόνο εισόδους και εξόδους. | Το Quick Smoke εκτελείται σε ένα δυαδικό ή ένα ενεργό τελικό σημείο. |
| Λευκό κουτί που θολώνει | Πλήρης πηγαίος κώδικας, συχνά σε συνδυασμό με συμβολική εκτέλεση για την επίλυση προβλημάτων σε δυσπρόσιτα κλαδιά. | Βαθιά ανάλυση ενός στοιχείου του οποίου η πηγή είναι διαθέσιμη. |
| Γκρι κουτί που θολώνει | Δεν υπάρχει αναθεώρηση πηγαίου κώδικα, αλλά σχόλια κατά τον χρόνο εκτέλεσης, όπως σε ποιους κλάδους κώδικα έφτασε μια είσοδος. | Η προεπιλογή για σύγχρονες μηχανές όπως η AFL++ και η libFuzzer. |
Ένας δεύτερος, παλαιότερος χωρισμός χωρίζει χαζή φασαρία από έξυπνο fuzzingΈνας άβολος fuzzer αντιστρέφει τα bits χωρίς να έχει ιδέα για τη μορφή εισόδου, επομένως τα περισσότερα από τα δεδομένα του απορρίπτονται από τον πρώτο αναλυτή που συναντά. Ένας έξυπνος fuzzer κατανοεί τα checksum, τα πεδία μήκους και τη δομή μηνυμάτων, επομένως οι είσοδοί του επιβιώνουν από την επικύρωση και φτάνουν στη λογική που βρίσκεται από κάτω. Καθοδηγούμενο από την κάλυψη fuzzing είναι η βελτίωση του γκρι κουτιού που έκανε το fuzzing mainstream: η μηχανή οργάνωνει το δυαδικό κώδικα, διατηρεί οποιαδήποτε είσοδο φτάνει σε έναν νέο κλάδο και μεταλλάσσει τα επιζώντα, έτσι ώστε το σώμα κώδικα να εξελίσσεται σταθερά προς ανεξερεύνητο κώδικα αντί να επανεκκινείται από τυχαίο θόρυβο.
Πώς να κάνετε Fuzz Testing
Τα βήματα για τη δοκιμή fuzz περιλαμβάνουν τα βασικά βήματα δοκιμής:
Βήμα 1) Προσδιορίστε το σύστημα-στόχο — επιλέξτε το τελικό σημείο δυαδικού αρχείου, βιβλιοθήκης, υπηρεσίας ή πρωτοκόλλου που θα δεχθεί επίθεση και επιβεβαιώστε ότι επιτρέπεται να το δοκιμάσετε.
Βήμα 2) Προσδιορισμός εισροών — καταγράψτε κάθε σημείο εισόδου από το οποίο διαβάζει ο στόχος: αρχεία, ορίσματα γραμμής εντολών, μεταβλητές περιβάλλοντος, πακέτα δικτύου, πεδία φόρμας και ωφέλιμα φορτία API.
Βήμα 3) Δημιουργήστε ασαφή δεδομένα — παραγωγή λανθασμένων εισροών μεταλλάσσοντας έγκυρα δείγματα, δημιουργώντας τα από ένα μοντέλο της μορφής ή συνδυάζοντας και τα δύο.
Βήμα 4) Εκτελέστε τη δοκιμή χρησιμοποιώντας ασαφή δεδομένα — εκτελέστε τον στόχο με βάση τα δεδομένα εισόδου που δημιουργούνται, ιδανικά σε έναν βρόχο που επανεκκινεί αυτόματα τη διαδικασία μετά από κάθε αποτυχία.
Βήμα 5) Παρακολούθηση της συμπεριφοράς του συστήματος — να προσέχετε για σφάλματα, κολλήματα, αποτυχίες διεκδίκησης, υπερβολική χρήση μνήμης και αναφορές απολύμανσης αντί να ελέγχετε μόνο την εκτυπωμένη έξοδο.
Βήμα 6) Καταγραφή ελαττωμάτων — αποθηκεύστε την ακριβή είσοδο που πυροδότησε κάθε αποτυχία, συρρικνώστε την στη μικρότερη περίπτωση αναπαραγωγής και αρχειοθετήστε την στη στοίβα tracεπισυνάπτεται.
Παραδείγματα Fuzzers
Τα Fuzzers ταξινομούνται επίσης ανάλογα με τον τρόπο που αξιοποιούν την εισροή τους και οι τρεις προσεγγίσεις που ακολουθούν είναι αυτές που θα συναντήσετε πιο συχνά.
- Fuzzers με βάση τη μετάλλαξη τροποποιήστε υπάρχοντα δείγματα δεδομένων για να δημιουργήσετε νέα δεδομένα δοκιμής. Αυτή είναι μια πολύ απλή και άμεση προσέγγιση: ξεκινά με έγκυρα δείγματα ενός πρωτοκόλλου και συνεχίζει να παραμορφώνει κάθε byte ή αρχείο.
- Fuzzers με βάση τη γενιά ορίζουν νέα δεδομένα με βάση τα δεδομένα εισόδου του μοντέλου. Ξεκινούν τη δημιουργία δεδομένων εισόδου από την αρχή με βάση τις προδιαγραφές.
- Fuzzers που βασίζονται σε πρωτόκολλα εξαρτώνται από τη λεπτομερή γνώση της μορφής του πρωτοκόλλου που δοκιμάζεται και αυτή η κατανόηση προέρχεται από την προδιαγραφή. Περιλαμβάνει την εγγραφή ενός πίνακα της προδιαγραφής στο εργαλείο και στη συνέχεια τη χρήση μιας τεχνικής δημιουργίας δοκιμών που βασίζεται σε μοντέλο για την εξέταση της προδιαγραφής και την προσθήκη ακανόνιστης λειτουργίας στο περιεχόμενο των δεδομένων, την ακολουθία κ.ο.κ. Αυτό είναι επίσης γνωστό ως δοκιμή σύνταξης, δοκιμή γραμματικής ή δοκιμή ευρωστίας. Ένα fuzzer μπορεί να δημιουργήσει περιπτώσεις δοκιμών από μια υπάρχουσα ή μπορεί να χρησιμοποιήσει έγκυρα ή μη έγκυρα δεδομένα εισόδου.
Υπάρχουν δύο περιορισμοί του fuzzing που βασίζεται σε πρωτόκολλο:
- Η δοκιμή δεν μπορεί να συνεχιστεί έως ότου ωριμάσει η προδιαγραφή.
- Πολλά χρήσιμα πρωτόκολλα αποτελούν επέκταση δημοσιευμένων πρωτοκόλλων. Εάν η δοκιμή fuzz βασίζεται σε δημοσιευμένες προδιαγραφές, Δοκιμή κάλυψης για νέα πρωτόκολλα θα είναι περιορισμένα.
Η απλούστερη μορφή τεχνικής fuzzing είναι η αποστολή τυχαίων δεδομένων εισόδου στο λογισμικό είτε ως πακέτα πρωτοκόλλου είτε ως συμβάν. Αυτή η τεχνική διαβίβασης τυχαίων δεδομένων εισόδου είναι πολύ ισχυρή για την εύρεση σφαλμάτων σε πολλές εφαρμογές και υπηρεσίες. Διατίθενται επίσης και άλλες τεχνικές, οι οποίες είναι πολύ εύκολες στην εφαρμογή. Για να εφαρμόσουμε αυτές τις τεχνικές, απλώς χρειάζεται να αλλάξουμε τις υπάρχουσες εισόδους και μπορούμε να αλλάξουμε μια είσοδο απλώς ανταλλάσσοντας τα bit της.
Τύποι σφαλμάτων που εντοπίζονται από το Fuzz Testing
Επειδή η ασάφεια κρίνει μια εκτέλεση με βάση τον τρόπο που συμπεριφέρεται το πρόγραμμα και όχι με βάση μια αναμενόμενη τιμή, τα ελαττώματα που αναδεικνύει ομαδοποιούνται σε τρεις οικογένειες.
- Αποτυχίες διεκδίκησης και διαρροές μνήμης: Αυτή η μεθοδολογία χρησιμοποιείται ευρέως για μεγάλες εφαρμογές όπου τα σφάλματα επηρεάζουν την ασφάλεια της μνήμης, η οποία αποτελεί σοβαρή ευπάθεια. Buffer Οι υπερχειλίσεις, οι αναγνώσεις "use-after-free" και οι αναγνώσεις "out-of-limits" εμφανίζονται όλες εδώ.
- Μη έγκυρη εισαγωγή: Στις δοκιμές fuzz, τα fuzzers χρησιμοποιούνται για τη δημιουργία μη έγκυρων δεδομένων εισόδου, τα οποία χρησιμοποιούνται για τον έλεγχο ρουτινών χειρισμού σφαλμάτων, και αυτό είναι σημαντικό για λογισμικό που δεν ελέγχει τα δεδομένα εισόδου του. Το απλό fuzzing μπορεί να θεωρηθεί ως ένας τρόπος αυτοματοποίησης. αρνητικό τεστ.
- Σφάλματα ορθότητας: Το fuzzing μπορεί επίσης να χρησιμοποιηθεί για την ανίχνευση ορισμένων τύπων σφαλμάτων «ορθότητας», όπως μια κατεστραμμένη βάση δεδομένων ή κακά αποτελέσματα αναζήτησης. Το διαφορικό fuzzing, το οποίο τροφοδοτεί την ίδια είσοδο σε δύο υλοποιήσεις και συγκρίνει τις απαντήσεις, είναι ο συνήθης τρόπος για να εντοπιστούν αυτά τα σφάλματα.
Fuzz Testing Tools
Εργαλεία που χρησιμοποιούνται στην ασφάλεια ιστού μπορούν να χρησιμοποιηθούν ευρέως σε δοκιμές fuzz, όπως Burp Suite και Peach Fuzzer. Αρκετά από τα κλασικά ονόματα παρακάτω έχουν πλέον αρχειοθετηθεί, επομένως η τρέχουσα κατάστασή τους αναφέρεται δίπλα σε κάθε καταχώρηση.
- Peach FuzzerΤο Peach Fuzzer παρέχει πιο ισχυρή κάλυψη ασφαλείας από έναν σαρωτή. Άλλα εργαλεία δοκιμών μπορούν να αναζητήσουν μόνο γνωστές απειλές, ενώ το Peach Fuzzer επιτρέπει στους χρήστες να βρίσκουν γνωστές και άγνωστες απειλές. Το Peach Tech αποκτήθηκε από το GitLab και η έκδοση Community Edition v3 δεν συντηρείται πλέον. Ο συντηρούμενος διάδοχος είναι το Έκδοση Κοινότητας GitLab Protocol Fuzzer.
- Spike Proxy: ένα επαγγελματικό εργαλείο που αναζητά ευπάθειες σε επίπεδο εφαρμογής σε εφαρμογές ιστού. Το SPIKE Proxy καλύπτει τα βασικά, όπως SQL Έγχυση και δημιουργία σεναρίων μεταξύ ιστοσελίδων, σε ένα εντελώς ανοιχτό περιβάλλον Python υποδομή και ήταν διαθέσιμη για Linux και WindowsΔεν έχει συντηρηθεί για πολλά χρόνια και περιλαμβάνεται εδώ για ιστορικό πλαίσιο.
- WebScarabΤο WebScarab είναι γραμμένο σε Java και επομένως είναι φορητό σε πολλές πλατφόρμες. Το πλαίσιο WebScarab επικοινωνεί χρησιμοποιώντας πρωτόκολλα HTTP και HTTPS και λειτουργεί ως ενδιάμεσος διακομιστής: επιτρέπει στον χειριστή να εξετάζει και να τροποποιεί αιτήματα που δημιουργούνται από το πρόγραμμα περιήγησης πριν τα λάβει ο διακομιστής και να εξετάζει και να ενημερώνει απαντήσεις που δημιουργούνται από τον διακομιστή πριν τις λάβει το πρόγραμμα περιήγησης. Οποιοδήποτε κενό εντοπίζει το WebScarab προστίθεται στη λίστα των αναφερόμενων προβλημάτων. Το αποθετήριο αρχειοθετήθηκε τον Απρίλιο του 2024 και πλέον είναι μόνο για ανάγνωση.
- OWASP WSFuzzerΤο WSFuzzer είναι ένα πρόγραμμα με άδεια GPL, γραμμένο σε Python που στόχευε υπηρεσίες ιστού και στην τελευταία του έκδοση που βασίζεται σε HTTP Υπηρεσίες SOAP ήταν ο κύριος στόχος. Αποστέλλονταν ως μέρος του WebScarab και αποσύρθηκαν μαζί του. Το OWASP ZAP και το πρόσθετο Fuzzer αποτελούν την προτεινόμενη αντικατάσταση.
- Διατηρούμενες εναλλακτικές λύσεις: AFL++ και libFuzzer είναι οι τυπικές μηχανές με καθοδήγηση κάλυψης για εγγενή κώδικα, OSS-Fuzz τα εκτελεί συνεχώς και δωρεάν για έργα ανοιχτού κώδικα, και βουητό καλύπτει το fuzzing πρωτοκόλλου δικτύου σε PythonΜια εκτενέστερη λίστα περιλαμβάνεται στον οδηγό για εργαλεία δοκιμών ασφαλείας.
Fuzz Testing καλυτερα Practices
Ένα fuzzer που στρέφεται προς έναν στόχο και αφήνεται μόνο του σπάνια βρίσκει πολλά. Οι παρακάτω πρακτικές διαχωρίζουν μια καμπάνια που παράγει ελαττώματα κατατεθέντα από μια που καταναλώνει μόνο χρόνο CPU.
- Ξεκινήστε από ένα καλό seed corpus. Συλλέξτε πραγματικές, έγκυρες εισόδους που δέχεται ήδη η εφαρμογή. Η μετάλλαξη ενός γνήσιου αρχείου φτάνει στον κώδικα ανάλυσης πολύ πιο γρήγορα από τη μετάλλαξη τυχαίων byte.
- Γράψτε μια μικρή, γρήγορη καλωδίωση. Το σημείο εισόδου θα πρέπει να κάνει ένα πράγμα ανά εκτέλεση, να αποφεύγει τις κλήσεις δικτύου και τις εγγραφές στο δίσκο και να επιστρέφει γρήγορα, επειδή η απόδοση μετριέται σε εκτελέσεις ανά δευτερόλεπτο.
- Ενεργοποιήστε τα απολυμαντικά. Η σιωπηλή αλλοίωση μνήμης συχνά δεν παρουσιάζει σφάλμα. Τα AddressSanitizer και UndefinedBehaviorSanitizer την μετατρέπουν σε άμεση, διαγνώσιμη βλάβη.
- Τρέξε για πολύ και τρέχε συνεχώς. Μια διαδρομή μίας ή δύο ωρών πιάνει ρηχά bugs. Τα βαθιά μονοπάτια συνήθως χρειάζονται πολλές ώρες, γι' αυτό και το fuzzing ανήκει σε μια νυχτερινή εργασία CI και όχι σε μια χειροκίνητη συνεδρία.
- Ελαχιστοποιήστε και αποδιπλοποιήστε κάθε σφάλμα. Συρρικνώστε την αποτυχημένη είσοδο στη μικρότερη μορφή της και η ομάδα καταρρέει ανά στοίβα tracε, διαφορετικά ένα σφάλμα φτάνει ως εκατοντάδες εισιτήρια.
- Διατηρήστε ένα σώμα παλινδρόμησης. Προσθέστε κάθε είσοδο αναπαραγωγής σε ένα μόνιμο σύνολο που εκτελείται σε κάθε έκδοση, έτσι ώστε ένα διορθωμένο ελάττωμα να μην μπορεί να επιστρέψει αθόρυβα.
- Εφαρμόστε το πεδίο εφαρμογής του στόχου νόμιμα. Η ενεργοποίηση μιας ενεργής υπηρεσίας τρίτου μέρους χωρίς γραπτή άδεια είναι αδιαχώριστη από μια επίθεση.
Πλεονεκτήματα του Fuzz Testing
Χρησιμοποιούμενο με ρεαλιστικές προσδοκίες, το fuzzing προσθέτει αξία που άλλες τεχνικές δυσκολεύονται να αντισταθμίσουν.
- Οι δοκιμές Fuzz βελτιώνουν τις δοκιμές ασφαλείας λογισμικού.
- Τα σφάλματα που εντοπίζονται στο fuzzing είναι μερικές φορές σοβαρά και συχνά είναι τα ίδια που χρησιμοποιούνται από τους εισβολείς, συμπεριλαμβανομένων των κολλημάτων, των διαρροών μνήμης και των ανεπίλυτων εξαιρέσεων.
- Εάν κάποια σφάλματα δεν γίνουν αντιληπτά από τους δοκιμαστές λόγω περιορισμών χρόνου και πόρων, αυτά τα σφάλματα εντοπίζονται επίσης στις δοκιμές fuzz.
- Τα δεδομένα εισόδου παράγονται από μια μηχανή, επομένως η κάλυψη συνεχίζει να αυξάνεται εν μία νυκτί χωρίς επιπλέον χειροκίνητη προσπάθεια.
Μειονεκτήματα του Fuzz Testing
Οι ίδιες ιδιότητες που καθιστούν το fuzzing φθηνό περιορίζουν επίσης τις δυνατότητες απόδειξης.
- Οι δοκιμές fuzz από μόνες τους δεν μπορούν να παράσχουν μια πλήρη εικόνα μιας συνολικής απειλής ασφαλείας ή ενός συνόλου σφαλμάτων.
- Οι δοκιμές fuzz είναι λιγότερο αποτελεσματικές στην αντιμετώπιση απειλών ασφαλείας που δεν προκαλούν διακοπές λειτουργίας προγραμμάτων, όπως ορισμένοι ιοί, σκουλήκια και δούρειοι ίπποι.
- Οι δοκιμές fuzz μπορούν να ανιχνεύσουν μόνο σχετικά απλά σφάλματα ή απειλές και δεν θα χρησιμοποιήσουν επιχειρηματικές βάσεις δεδομένων.
- Για να λειτουργήσει αποτελεσματικά, απαιτείται σημαντικός χρόνος λειτουργίας του μηχανήματος.
- Ο ορισμός μιας συνθήκης οριακής τιμής με τυχαίες εισόδους είναι πολύ προβληματικός, αν και οι δοκιμαστές πλέον επιλύουν μεγάλο μέρος αυτού του προβλήματος με ντετερμινιστικούς αλγόριθμους που καθοδηγούνται από εισόδους χρηστών.
Δοκιμή Fuzz vs Δοκιμή Διείσδυσης
Και οι δύο δραστηριότητες αναζητούν ελαττώματα ασφαλείας, ωστόσο απαντούν σε διαφορετικά ερωτήματα και σπάνια είναι εναλλάξιμες.
| Κριτήρια | Fuzz Testing | Δοκιμή διείσδυσης |
| Οδηγείται από | Ένας αυτοματοποιημένος κινητήρας που δημιουργεί λανθασμένη είσοδο | Ένας έμπειρος δοκιμαστής συλλογίζεται για το σύστημα |
| Αναζητά | Σφάλματα, κολλήματα και σφάλματα ασφάλειας μνήμης | Εκμεταλλεύσιμες αδυναμίες, συμπεριλαμβανομένων των σφαλμάτων λογικής και διαμόρφωσης |
| Βάθος | Πολύ ευρεία κάλυψη εισροών, επιφανειακή συλλογιστική | Περιορισμένη κάλυψη, βαθιά συλλογιστική |
| Παραγωγή | Αναπαραγωγή εισόδων και στοίβας traces | Μια αναφορά ευρημάτων με διαδρομές εκμετάλλευσης και αξιολογήσεις κινδύνου |
| καλύτερη στιγμή | Συνεχώς, στη διαδικασία κατασκευής | Περιοδικά, εναντίον ενός υποψηφίου για αποφυλάκιση |
Στην πράξη, τα δύο τροφοδοτούν το ένα το άλλο: η ασάφεια καθαρίζει τα φθηνά, αυτοματοποιήσιμα σφάλματα, έτσι ώστε οι περιορισμένες ώρες ενός δοκιμαστή να επικεντρώνονται στα ελαττώματα που μόνο ένας άνθρωπος θα εντοπίσει.

