Fuzz Testing (Fuzzing) Tutorial

⚡ Έξυπνη Σύνοψη

Το Fuzz Testing τροφοδοτεί ένα πρόγραμμα με μη έγκυρα, μη αναμενόμενα ή τυχαία δεδομένα και παρακολουθεί για σφάλματα σφάλματος, κολλήματα και σφάλματα μνήμης, αποκαλύπτοντας ελαττώματα ασφαλείας που οι λειτουργικές δοκιμές σεναρίου σχεδόν ποτέ δεν εντοπίζουν από μόνες τους.

  • 🔘 Προέλευση: Ο Μπάρτον Μίλερ επινόησε τον όρο στο Πανεπιστήμιο του Ουισκόνσιν-Μάντισον και οι πρώτες εκτελέσεις fuzz το 1989 κατέρρευσαν περίπου στο ένα τρίτο των βοηθητικών προγραμμάτων UNIX που δοκιμάστηκαν.
  • ☑️ Βρόχος έξι βημάτων: Προσδιορίστε τον στόχο, προσδιορίστε τις εισόδους, δημιουργήστε ασαφή δεδομένα, εκτελέστε, παρακολουθήστε τη συμπεριφορά και, στη συνέχεια, καταγράψτε κάθε ελάττωμα που εμφανίζεται.
  • ✅ Τρεις στρατηγικές γενιάς: Οι fuzzer μεταλλάξεων παραμορφώνουν έγκυρα δείγματα, οι fuzzer γενιάς δημιουργούν εισόδους από ένα μοντέλο και οι fuzzer πρωτοκόλλου λειτουργούν με βάση μια προδιαγραφή.
  • 🧪 Τα σχόλια για την κάλυψη άλλαξαν το πεδίο: Οι σύγχρονες μηχανές ελέγχου διατηρούν οποιαδήποτε είσοδο που φτάνει σε νέο κώδικα, ο οποίος εντοπίζει πολύ βαθύτερα σφάλματα από τα καθαρά τυχαία δεδομένα.
  • ️ Η εργαλειομηχανή έχει προχωρήσει: Τα Peach Fuzzer και WebScarab αρχειοθετούνται, ενώ τα AFL++, libFuzzer, OSS-Fuzz, boofuzz ​​και OWASP ZAP είναι οι επιλογές που διατηρούνται.
  • ⚙️ Γνωστά όρια: Το Fuzzing εντοπίζει σφάλματα και όχι λογικά ελαττώματα, επομένως συμπληρώνει αντί να αντικαθιστά την αναθεώρηση κώδικα και τις δοκιμές διείσδυσης.

Fuzz Testing (Fuzzing) Tutorial

Τι είναι το Fuzz Testing;

Δοκιμή Fuzz ή Fuzzing είναι μια τεχνική δοκιμής λογισμικού που εισάγει μη έγκυρα ή τυχαία δεδομένα που ονομάζεται FUZZ σε ένα σύστημα λογισμικού για την ανακάλυψη σφαλμάτων κωδικοποίησης και κενών ασφαλείας. Ο σκοπός του fuzz testing είναι η εισαγωγή δεδομένων χρησιμοποιώντας αυτοματοποιημένες ή ημιαυτόματες τεχνικές και ο έλεγχος του συστήματος για διάφορες εξαιρέσεις, όπως διακοπή λειτουργίας του συστήματος ή αστοχία ενσωματωμένου κώδικα.

Ο έλεγχος fuzz αναπτύχθηκε αρχικά από τον Barton Miller στο Πανεπιστήμιο του Wisconsin-Madison, ο οποίος επινόησε τον όρο όταν ο θόρυβος γραμμής σε μια σύνδεση μόντεμ κατέστρεψε τα προγράμματα που χρησιμοποιούσε. Οι φοιτητές του έτρεξαν τα πρώτα fuzzers το 1989 και διαπίστωσαν ότι περίπου το ένα τρίτο των βοηθητικών προγραμμάτων UNIX που στόχευσαν κατέρρευσαν ή κολλούσαν. Ο έλεγχος fuzz είναι ένα δοκιμές λογισμικού τεχνική, και είναι ένα είδος Δοκιμή ασφαλείας.

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

Ροή εργασίας δοκιμής Fuzz: ένα fuzzer δημιουργεί λανθασμένη είσοδο και την τροφοδοτεί στην εφαρμογή που δοκιμάζεται

Γιατί να κάνετε 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 που βασίζεται σε πρωτόκολλο:

  1. Η δοκιμή δεν μπορεί να συνεχιστεί έως ότου ωριμάσει η προδιαγραφή.
  2. Πολλά χρήσιμα πρωτόκολλα αποτελούν επέκταση δημοσιευμένων πρωτοκόλλων. Εάν η δοκιμή 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 Μια αναφορά ευρημάτων με διαδρομές εκμετάλλευσης και αξιολογήσεις κινδύνου
καλύτερη στιγμή Συνεχώς, στη διαδικασία κατασκευής Περιοδικά, εναντίον ενός υποψηφίου για αποφυλάκιση

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

Συχνές Ερωτήσεις

Ένα seed corpus είναι το αρχικό σύνολο έγκυρων εισόδων που μεταλλάσσεται από το fuzzer. Μικρά, ποικίλα, πραγματικά αρχεία λειτουργούν καλύτερα, επειδή το καθένα από αυτά περνάει ήδη τον parser και επιτρέπει στη μηχανή να ξοδέψει τον προϋπολογισμό της σε βαθύτερο κώδικα αντί για τον πρώτο έλεγχο εγκυρότητας.

Μια fuzz harness είναι η μικρή συνάρτηση που παραδίδει ένα buffer fuzzed bytes στον υπό δοκιμή κώδικα. Θα πρέπει να αποφεύγει την καθολική κατάσταση, τις εγγραφές αρχείων και τις κλήσεις δικτύου, έτσι ώστε η μηχανή να μπορεί να την εκτελεί χιλιάδες φορές ανά δευτερόλεπτο.

Μία ή δύο ώρες αποκαλύπτουν επιφανειακά σφάλματα. Οι σοβαρές καμπάνιες διαρκούν πολλές ώρες ή ημέρες, επειδή η νέα κάλυψη φτάνει σε εκρήξεις. Ένα οροπέδιο στην καμπύλη κάλυψης, όχι μια ένδειξη ρολογιού, είναι το ειλικρινές σημάδι ότι μια καμπύλη έχει σταματήσει να αποδίδει.

Το AddressSanitizer εντοπίζει υπερχειλίσεις buffer και use-after-free, το UndefinedBehaviorSanitizer εντοπίζει την κακή χρήση ακεραίων και δεικτών και το MemorySanitizer εντοπίζει αναγνώσεις μη αρχικοποιημένης μνήμης. Χωρίς αυτά, πολλές αλλοιώσεις περνούν σιωπηλά και το fuzzer δεν αναφέρει καμία αποτυχία.

Αναπαράγετε το, ελαχιστοποιήστε την είσοδο στη μικρότερη περίπτωση αποτυχίας, ομαδοποιήστε το με σφάλματα που μοιράζονται την ίδια στοίβα tracε, στη συνέχεια, υποβάλετε ένα αίτημα μέσω του συνηθισμένου διαδικασία διαχείρισης ελαττωμάτων και προσθέστε την είσοδο σε ένα σώμα παλινδρόμησης.

Μοιράζονται την τυχαιότητα αλλά όχι την πρόθεση. Δοκιμές σε πιθήκους Προωθεί αυθαίρετες ενέργειες χρήστη σε μια διεπαφή που εκτελείται, ενώ το fuzzing στοχεύει σε έναν συγκεκριμένο αναλυτή εισόδου και μετρά την κάλυψη κώδικα, ώστε να μπορεί να κατευθυνθεί προς κώδικα στον οποίο δεν έφτασαν ποτέ οι προηγούμενες είσοδοι.

Τα γλωσσικά μοντέλα χρησιμοποιούνται για τη σύνταξη δέσμης δεδομένων για μη ασαφή API, για τη σύνθεση εισροών seed για εξωτικές μορφές και για την ομαδοποίηση και σύνοψη αναφορών σφαλμάτων. Η μηχανή εξακολουθεί να παρέχει την ανατροφοδότηση κάλυψης. Το μοντέλο αφαιρεί κυρίως την εργασία χειροκίνητης ρύθμισης.

GitHub Copilot μπορεί να σχεδιάσει ένα σημείο εισόδου libFuzzer, ένα αρχείο δημιουργίας και μια γεννήτρια seed από μια υπάρχουσα υπογραφή API. RevΔείτε το αποτέλεσμα προσεκτικά, καθώς μια καλωδίωση που «καταπίνει» ήσυχα τα σφάλματα δεν θα αναφέρει σφάλματα.

Συνοψίστε αυτήν την ανάρτηση με: