σφάλμα συμβολοσειράς μορφής - ευπάθεια συμβολοσειράς μορφής - καταστροφή μνήμης

Πώς ένα απλό σφάλμα συμβολοσειράς μορφοποίησης μπορεί να οδηγήσει σε καταστροφή μνήμης (και πώς να το εντοπίσετε στον κώδικά σας)

Τι είναι ένα σφάλμα συμβολοσειράς μορφοποίησης και γιατί εξακολουθεί να έχει σημασία

A Το σφάλμα συμβολοσειράς μορφοποίησης παρουσιάζεται όταν δεδομένα που ελέγχονται από τον χρήστη διαβιβάζονται ως συμβολοσειρά μορφοποίησης σε συναρτήσεις όπως printf, fprintf ή syslog, χωρίς επικύρωση.

Με απλά λόγια, Ένα σφάλμα συμβολοσειράς μορφοποίησης συμβαίνει όταν η είσοδος χρήστη χρησιμοποιείται ως πρότυπο μορφοποίησης, επιτρέποντας την ακούσια ανάγνωση ή εγγραφή στη μνήμη. Αυτό είναι ιδιαίτερα επικίνδυνο σε γλώσσες όπως C / C ++, όπου προσδιοριστές μορφής όπως %s, %x, και %n μπορεί να χειριστεί άμεσα τα δεδομένα στοίβας.

Γιατί έχει σημασία αυτό στα σύγχρονα DevSecOps; Επειδή αυτά τα σφάλματα εξακολουθούν να εντοπίζονται σε ενεργές βάσεις κώδικα, ειδικά σε:

  • Στοιχεία ανοιχτού κώδικα με παλαιότερο κώδικα C
  • Εγγενείς συνδέσεις σε Python, Go ή Rust
  • Αυτόματα συγχωνευμένος κώδικας τρίτου μέρους σε παραγωγή pipelines

Ο αντίκτυπος είναι πραγματικός: διαρροές μνήμης, καταστροφή στοίβας, ακόμη και απομακρυσμένη εκτέλεση κώδικα (RCE)Κι όμως, πολλές ομάδες εμπιστεύονται τους στατικούς σαρωτές και παραβλέπουν αυτά τα σφάλματα, εκτός αν τα ελέγχουν ρητά.

Κατευθείαν στον Κώδικα: printf(είσοδος_χρήστη) και ο Κίνδυνος

Ας δούμε ένα συνηθισμένο λάθος:

printf(είσοδος_χρήστη);

Αυτή η μονολεκτική φράση είναι ένας άμεσος δρόμος προς τα προβλήματα. Αν είσοδος_χρήστη περιέχει κάτι σαν %x %x % x% %x, δίνει οδηγίες Printf για να διαβάσει τιμές από τη στοίβα, εκθέτοντας τη μνήμη. Χειρότερα, αν %n περιλαμβάνεται, ο εισβολέας μπορεί να γράψει αυθαίρετες τιμές στη μνήμη.

Αυτό το μοτίβο δεν προκαλεί μόνο διαρροή δεδομένων στοίβας. Μπορεί επίσης να καταστρέψει τη μνήμη και να κλιμακωθεί σε απομακρυσμένη εκτέλεση κώδικα (RCE). Αυτό ακριβώς είναι το πώς μοιάζει στην πράξη ένα θέμα ευπάθειας σε συμβολοσειρά μορφοποίησης. Αυτά τα θέματα ευπάθειας δεν προκαλούν σφάλματα ή προειδοποιήσεις μεταγλωττιστή, εκτός εάν είναι ενεργοποιημένες συγκεκριμένες σημαίες ή απολυμαντές. Και σε πολλές περιπτώσεις, είναι θαμμένα σε περιτυλίγματα ή βοηθητικές συναρτήσεις, καθιστώντας τα αόρατα σε περιστασιακές αναθεωρήσεις κώδικα.

Διαφθορά Μνήμης 101: Τι Διακυβεύεται Πραγματικά

Όταν ένας fΕάν γίνει εκμετάλλευση του σφάλματος ormat string, οι εισβολείς μπορούν:

  • Διευθύνσεις μνήμης dump και τιμές στοίβας χρησιμοποιώντας %x or %s
  • Αντικατάσταση μεταβλητών στοίβας ή διευθύνσεων επιστροφής με %n
  • Προκαλεί σφάλματα τμηματοποίησης ή λογικά σφάλματα μέσω καταστροφής μνήμης
  • Στροφή προς το πλήρες RCE, ειδικά εάν οι προστασίες όπως ASLR ή stack canaries δεν έχουν ρυθμιστεί σωστά

Η κατανόηση του πλαισίου στοίβας βοηθάει εδώ. Printf δεν γνωρίζει πόσα ορίσματα να περιμένει· βασίζεται εξ ολοκλήρου στη συμβολοσειρά μορφοποίησης. Γι' αυτό %x ανεβαίνει στη στοίβα, αποκαλύπτοντας ή χειριζόμενος δεδομένα. Το αποτέλεσμα κυμαίνεται από μικρή διαρροή έως πλήρη έλεγχο του δείκτη εντολής.

Πού κρύβονται τα σφάλματα συμβολοσειράς μορφοποίησης στις σύγχρονες βάσεις κώδικα

Αυτά τα τρωτά σημεία δεν αφορούν αποκλειστικά τον παλαιότερο κώδικα C. Παραμονεύουν και σε σύγχρονα περιβάλλοντα:

  • Python (ctypes), Rust (FFI) και Go (cgo) Οι συνδέσεις που διασυνδέονται με εγγενείς βιβλιοθήκες συχνά λειτουργούν ως λεπτά περιτυλίγματα, μεταβιβάζοντας παραμέτρους απευθείας σε ευάλωτες συναρτήσεις C.
  • Εργαλεία και daemon CLI τρίτων κατασκευαστών ενσωματώνουν παλαιότερο κώδικα C χωρίς επαρκή έλεγχο
  • Περιτυλίγματα καταγραφής όπως debug_log(είσοδος_χρήστη) που δρομολογούν εσωτερικά σε συναρτήσεις τύπου printf
  • Αυτόματα συγχωνευμένες συνεισφορές OSS που περιέχουν παλαιότερα μοτίβα ή ελάχιστη επικύρωση

Ένα σφάλμα στο εγγενές επίπεδο C δεν μένει εκεί. Διαδίδεται προς τα πάνω. Εάν μια συνάρτηση C όπως log_event(char *msg) δεν είναι ασφαλές, καλώντας το από Python μέσω ctypes, Σκουριά μέσω μη ασφαλές εξωτερικό, ή Μεταβείτε μέσω cgo φέρνει την ευπάθεια σε αυτά τα περιβάλλοντα υψηλότερου επιπέδου.

Το πρόβλημα; Αυτές οι ενσωματώσεις είναι συνηθισμένες και το DevSecOps συχνά υποθέτει ότι οι συνδέσεις είναι ασφαλείς αφαιρέσεις. Δεν είναι. Ένα θέμα ευπάθειας συμβολοσειράς μορφοποίησης σε ένα επίπεδο της στοίβας μπορεί να διαδοθεί σιωπηλά σε όλες τις διεπαφές, ειδικά όταν οι εγγενείς ενότητες αναδιπλώνονται χωρίς ισχυρή επιβολή τύπου ή εξυγίανση εισόδου. Εάν η υποκείμενη συνάρτηση C είναι ευάλωτη, ο κώδικας υψηλότερου επιπέδου κληρονομεί το θέμα ευπάθειας συμβολοσειράς μορφοποίησης.

CI/CD Pipelines: Πώς αυτό ξεφεύγει από τους ελέγχους ασφαλείας σας

ΜΟΝΤΕΡΝΑ pipelineΤα s έχουν σχεδιαστεί για ταχύτητα, αλλά αυτή η ταχύτητα εισάγει τυφλά σημεία:

  • SAST εργαλεία σπάνια εντοπίζουν τη χρήση συμβολοσειράς δυναμικής μορφής, εκτός εάν έχουν ρυθμιστεί ειδικά για την ανίχνευση μολυσμένων δεδομένων
  • Οι κριτές δημοσίων σχέσεων επικεντρώνονται στη λογική ή το στυλ, όχι στην υποκείμενη συμπεριφορά της συνάρτησης C.
  • Το CI συγχωνεύει τα ευάλωτα πακέτα έλξης που φαίνονται ακίνδυνα εκ πρώτης όψεως
  • Σαρωτές εξαρτήσεων συχνά αγνοούν τον εγγενή κώδικα ή την μη ασφαλή λογική καταγραφής

Standard SAST Τα εργαλεία συχνά αποτυγχάνουν να εντοπίσουν σφάλματα συμβολοσειρών μορφοποίησης, εκτός εάν εφαρμοστούν προσαρμοσμένοι κανόνες για τον εντοπισμό μη κυριολεκτικών ορισμάτων μορφοποίησης. Χωρίς αυτούς τους προσαρμοσμένους ελέγχους, οι δυναμικές συμβολοσειρές μορφοποίησης εύκολα περνούν απαρατήρητες.

Ενσωμάτωση κανόνων μορφοποίησης που αφορούν συγκεκριμένες συμβολοσειρές σε CI/CD είναι απαραίτητο για τον έγκαιρο εντοπισμό και την αντιμετώπιση αυτών των σφαλμάτων. Αυτό σημαίνει:

  • Κωδικός αποκλεισμού όπου μη αξιόπιστες εισόδους φτάνουν σε συναρτήσεις μορφοποίησης
  • Σημαίες δυναμικών συμβολοσειρών μορφοποίησης κατά τη στατική ανάλυση
  • Επιβολή αυτών των πολιτικών ως μέρος της διαδικασίας συγχώνευσης CI σας

Χωρίς αυτό, το δικό σας pipeline είναι τυφλό σε μια κατηγορία ευπαθειών που μπορούν να οδηγήσουν σε καταστροφή μνήμης και RCE, πολύ πριν ο κώδικας φτάσει στην παραγωγή.

Εντοπισμός του σφάλματος: Πρακτική ανίχνευση με GDB και στατικά εργαλεία

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

Χειροκίνητη ανάλυση με GDB:

Το GDB είναι ιδιαίτερα χρήσιμο όταν υποψιάζεστε κακή χρήση συμβολοσειράς μορφοποίησης, αλλά πρέπει να επιβεβαιώσετε πώς συμπεριφέρεται κατά το χρόνο εκτέλεσης:

  • Διακοπή σε Printf ή σχετικές λειτουργίες για να ελέγξετε τη στοίβα κλήσεων και τα ορίσματα.
  • Αναζητήστε ανωμαλίες, απροσδόκητες αναγνώσεις μνήμης, σφάλματα κατά τη μορφοποίηση ή παράξενες τιμές στη στοίβα.
  • Αφηρημένη εισαγωγή όπως επαναλαμβανόμενη %x or %s μπορεί να βοηθήσει στον προσδιορισμό του βαθμού στον οποίο η συμβολοσειρά μορφοποίησης διατρέχει τη στοίβα.

Από χειροκίνητη σε αυτόματη:

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

  • Χρήση grep 'printf(' src/ για να βρείτε κλήσεις ακατέργαστης μορφοποίησης.
  • Συνδυάστε αυτό με scripting για να επισημάνετε οποιαδήποτε χρήση του Printf( όπου το πρώτο όρισμα είναι δεν μια κυριολεκτική συμβολοσειρά.
  • Χρησιμοποιήστε εργαλεία που βασίζονται σε AST για να εντοπίσετε τιμές συμβολοσειρών μορφοποίησης, εντοπίζοντας δυναμικά μη κυριολεκτικές διαδρομές.
  • Μεταφράστε συχνές χειροκίνητες διαπιστώσεις, όπως συναρτήσεις περιτύλιξης που προωθούν μη αξιόπιστη είσοδο, σε κανόνες CI που αποκλείουν αυτές τις περιπτώσεις αυτόματα.

Συμβουλή ενσωμάτωσης CI: Διαμορφώστε σας pipeline να αποτύχει η δημιουργία αν οποιαδήποτε συνάρτηση μορφοποίησης λάβει δυναμική είσοδο ως συμβολοσειρά μορφοποίησης. Αυτοί οι έλεγχοι λειτουργούν ως τείχος προστασίας που επιβάλλει όσα έχετε μάθει από το GDB και τον εντοπισμό σφαλμάτων κατά τον χρόνο εκτέλεσης.

Βελτίωση του Κώδικά σας: Επικύρωση Εισαγωγής και Ασφαλέστερα Μοτίβα

Η αποτροπή μιας ευπάθειας συμβολοσειράς μορφοποίησης ξεκινά με την υιοθέτηση ασφαλέστερων συνηθειών κωδικοποίησης και την επιβολή τους σε μεγάλη κλίμακα:

  • Να χρησιμοποιείτε πάντα συμβολοσειρές σταθερής μορφής: printf(“%s”, είσοδος_χρήστη);, ποτέ μην μεταβιβάζετε ακατέργαστη είσοδο ως μορφή.
  • Προτιμήστε ασφαλέστερες παραλλαγές: snprintf, vsnprintf, και παρόμοιες συναρτήσεις βοηθούν στον έλεγχο των μεγεθών του buffer και στην επιβολή της δομής εξόδου.
  • Επικύρωση όλων των εισροών χρήστη που μπορεί να εισέλθουν στη λογική καταγραφής ή μορφοποίησης, ακόμη και σε συναρτήσεις περιτύλιξης.

Αυτοματοποιημένοι μετριασμοί που πρέπει να ενεργοποιήσετε:

  • Απολυμαντικό Address (ASan): Εντοπίζει αλλοίωση μνήμης σε πραγματικό χρόνο, συμπεριλαμβανομένων υπερχειλίσεων buffer και παραβιάσεων στοίβας, που συχνά ενεργοποιούνται από λανθασμένες συμβολοσειρές μορφοποίησης.
  • UndefinedBehaviorSanitizer (UBSan): Επισημαίνει απροσδιόριστη συμπεριφορά, όπως η διαβίβαση ασύμβατων ή ελλιπών ορισμάτων σε συναρτήσεις μορφοποίησης.
  • -D_FORTIFY_SOURCE=2: Προσθέτει ελαφρούς ελέγχους στις συναρτήσεις libc κατά τη μεταγλώττιση, βοηθώντας στην ανίχνευση κακής χρήσης συμβολοσειρών μορφοποίησης ή υπερβάσεων buffer με ελάχιστη επιβάρυνση απόδοσης.

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

Συμβουλή: Κάντε αυτά τα απολυμαντικά μέρος της κατασκευής σας pipeline με πολιτικές σφάλματος κατά την προειδοποίηση. Αντιμετωπίστε οποιαδήποτε παραβίαση συμβολοσειράς μορφοποίησης ως αποτυχημένη δοκιμή.

Πώς το Xygeni σταματά τα σφάλματα συμβολοσειράς μορφοποίησης πριν από την αποστολή τους

Ξυγένη Δυναμώνει CI/CD επιβάλλοντας την ασφάλεια των συμβολοσειρών μορφοποίησης με πρόληψη σε πραγματικό χρόνο, όχι μόνο ανίχνευση:

  • Εντοπίζει επικίνδυνα μοτίβα όπως το λευκό και το γκρι είναι μια ασφαλής επιλογή. Ταιριάζουν σχεδόν με οποιοδήποτε χρώμα ξύλου και δημιουργούν μια ισορροπημένη εμφάνιση. Για μια μοντέρνα αίσθηση, ίσως προτιμήσετε printf(είσοδος_χρήστη) πριν ο κώδικας φτάσει στην παραγωγή
  • Εφαρμόζει στατική ανάλυση κηλίδων για την ανίχνευση μη αξιόπιστων εισόδων σε συναρτήσεις μορφοποίησης, ακόμη και σε πολλαπλά επίπεδα ή κλήσεις περιτυλίγματος
  • Αποκλείει αυτόματα τις μη ασφαλείς συγχωνεύσεις σε GitHub, GitLab, Bitbucket και Jenkins
  • Παρέχει σαφή ανατροφοδότηση με ίχνη κλήσεων, προέλευση εισόδου και προ-cisπροτάσεις ηλεκτρονικής αποκατάστασης

Παράδειγμα στην πράξη: iπρογραμματιστής fa commitείναι η γραμμή log_debug(είσοδος_χρήστη) και log_debug() εσωτερικά περιβάλλει ένα ευάλωτο Printf, το Xygeni ακολουθεί το γράφημα κλήσεων, αναγνωρίζει τη δυναμική διαδρομή εισόδου και αποκλείει τη συγχώνευση. Ο προγραμματιστής βλέπει ένα άμεσο μήνυμα στο αίτημα συγχώνευσης:

⚠️ Εντοπίστηκε ευπάθεια συμβολοσειράς μορφής: είσοδος_χρήστη ρέει σε printf() στο src/logger.c:42. Χρησιμοποιήστε μια συμβολοσειρά σταθερής μορφής και επικυρώστε τα δεδομένα εισόδου.

Αυτά τα σχόλια παρέχονται απευθείας στο GitHub, το GitLab, το Jenkins ή το Bitbucket ως μέρος της διαδικασίας MR/PR. Οι προγραμματιστές δεν μπορούν να το παραβλέψουν και λαμβάνουν εφαρμόσιμες οδηγίες για το πώς να διορθώσουν το πρόβλημα, όχι απλώς μια αόριστη προειδοποίηση.

Η ενσωμάτωση είναι απρόσκοπτη:

  • Ρύθμιση παραμέτρων κανόνων πολιτικής ανά αποθετήριο, κλάδο ή έργο
  • Επιβολή συνθηκών αποκλεισμού για μη ασφαλή χρήση μορφής
  • Αυτόματη ανίχνευση μη ασφαλών εισόδων σε C/C++, Python, Go, Rust και τις εγγενείς συνδέσεις τους

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

Τελευταία λέξη: Τα σφάλματα συμβολοσειράς μορφοποίησης δεν είναι νεκρά

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

Ελέγξτε τον κώδικά σας. Σκληρύνετε το CI/CDΕφαρμόστε κανόνες ανίχνευσης και επιβάλετέ τους. Δεν πρόκειται απλώς για κληρονομημένες αποσκευές, είναι μια ενεργή απειλή που κρύβεται σε κοινή θέα. Χρησιμοποιήστε αυτοματοποιημένα εργαλεία, στατική ανάλυση και εργαλεία απολύμανσης χρόνου εκτέλεσης για να εντοπίσετε προβλήματα νωρίς. Μην υποθέτετε ότι είστε ασφαλείς μόνο και μόνο επειδή ο κώδικας μεταγλωττίζεται.

εργαλεία-ανάλυσης-σύνθεσης-λογισμικού-sca
Ιεράρχηση, αποκατάσταση και ασφάλεια των κινδύνων λογισμικού σας
Αποκτήστε τον Δωρεάν Λογαριασμό σας.
Δεν απαιτείται πιστωτική κάρτα.

Ασφαλίστε την ανάπτυξη και την παράδοση λογισμικού σας

με το Xygeni Product Suite