Κωδικοποίηση επαναχρησιμοποίησης έναντι τυχαίας συνήθειας

Ένα από τα πιο σκανδαλώδη σφάλματα κρίσης συναίνεσης (CVE-2018-17144) ανακαλύφθηκε πρόσφατα στο λογισμικό Bitcoin Core, το οποίο πριν από αυτό το σημείο είχε σχεδόν άψογη ιστορία. Ο Jimmy Song έχει γράψει μια εξαιρετική κατανομή αυτού του σφάλματος.

Η σύντομη περίληψη του σφάλματος είναι ότι υπάρχουν 4 περιπτώσεις όπου το λογισμικό Bitcoin Core χρειάζεται να ελέγξει για διπλή δαπάνη. Και οι 4 περιπτώσεις είχαν αρχικά την ίδια ροή εκτέλεσης κώδικα. Μετά από κάποιες λεπτές επαναλήψεις του κώδικα για πολλά χρόνια, μία από τις 4 περιπτώσεις ("single-tx-double-spend-in-a-block") ξεπεράστηκε, γεγονός που θα επέτρεπε σε έναν ανθρακωρύχο να δυσαρεστήσει κάποιους κόμβους να αποδεχθεί ένα μπλοκ που φουσκώνει την προσφορά του Bitcoin.

Η φύση αυτού του σφάλματος μου θυμίζει τη συνεχή σύγκρουση μεταξύ:

(α) την ανάγκη για επαναχρησιμοποίηση κώδικα και βελτιστοποίηση

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

Η τυχαία συνήθεια δημιουργεί ένα εύφορο έδαφος για τους εφιάλτες και τα πιθανά σφάλματα όπως το CVE-2018-17144.

Τυχαία συνήθεια

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

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

Υπάρχει επίσης ένα μακρύ ιστορικό ανανέωσης του τροχού σε λογισμικό που δίνει επαναχρησιμοποίηση κώδικα ακόμα μεγαλύτερη προτεραιότητα στη λίστα προτεραιότητας. Η επαναχρησιμοποίηση κώδικα θεωρείται συχνά μία από τις "βέλτιστες πρακτικές" της βιομηχανίας. Ένας υποψήφιος νέος προγραμματιστής λογισμικού μπορεί να είναι διατεθειμένος να πιστεύει ότι υπάρχει μηδενικό μειονέκτημα για επαναχρησιμοποίηση κώδικα.

Αλλά υπάρχει ένας κρυμμένος κίνδυνος - και δεν πιστεύω ότι αυτά τα πράγματα είναι πάντα καλά διδάσκονται στα σχολεία - της ακραίας επαναχρησιμοποίησης κώδικα.

Εξαιρετική επαναχρησιμοποίηση κώδικα σημαίνει κατάρρευση οποιωνδήποτε δύο παρόμοιων κομμάτων κώδικα σε ένα, ανεξάρτητα από τις περιπτώσεις χρήσης και την αρχική τους πρόθεση.

Που πολλές φορές καταλήγουν με κώδικα που έχει τυχαία συνήθεια.

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

Είναι κακό επειδή οι απαιτήσεις του προϊόντος αλλάζουν και το λογισμικό είναι ένα συνεχώς εξελισσόμενο προϊόν που δεν έχει τελειώσει ποτέ.

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

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

Έτσι, αυτό το περήφανο κομμάτι του κοινού κώδικα που αναδιατυπώσατε (αλλά τώρα έχετε ξεχάσει εντελώς) δεν λειτουργεί πλέον όπως νομίζετε ότι θα το έκανε.

Έχω χάσει τον αριθμό των επεισοδίων οδυνηρών refactoring ή των δυσάρεστων σφαλμάτων που έχω δει ότι είναι ένα άμεσο αποτέλεσμα της πρόωρης βελτιστοποίησης ή της τυχαίας κοινότητας - στο σημείο που τώρα αποφεύγω πράγματα όπως η Κληρονομικότητα σαν πανούκλα.

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

Όσο περισσότερα στρώματα τυχαίας κοινότητας υπάρχουν στον κώδικα, τόσο περισσότερο ένα ναρκοπέδιο είναι να περιηγηθείτε. Το CVE-2018-17144 είναι ένα τέλειο παράδειγμα αυτού.